Landing pages and ConnectID
A landing page is the page you want visitors to reach, such as a job ad. When you send it to Frantz, Frantz gives it a ConnectID and a script for the page, and counts its visitors under that ConnectID.
| Call | What it does |
|---|---|
POST/api/v2/landing-pages | Send a landing page. Creates it, or updates the one with the same reference. |
GET/api/v2/landing-pages?externalReference= | Find a landing page by your reference. |
GET/api/v2/landing-pages/{connectId} | Get a landing page. |
PATCH/api/v2/landing-pages/{connectId} | Change some fields of a landing page. |
GET/api/v2/audiences | The audiences a landing page can have. |
All of them need the scope landing-pages:write. GET /api/v2/audiences also takes
campaigns:read, for partners that only order campaigns.
Two ids
externalReferenceis your id for the landing page, up to 50 characters. It is unique among your landing pages, and Frantz compares it without regard to case:AD-1andad-1are the same landing page.connectIdis the ConnectID Frantz gives the landing page. It is the id in the addresses, in the script and in Frantz' reports.
Store both. Send your reference when you send the landing page, and use the ConnectID for everything else.
Sending a landing page
POST /api/v2/landing-pages needs externalReference and url. The rest
is optional.
- A new reference creates the landing page and answers
201 Created, with its address inLocation. - A reference you already have updates that landing page with the fields you send and answers
200 OK. It never makes a second landing page, not even when two calls for the same reference arrive at the same time.
So the call is safe to repeat. If it times out, send it again.
POST /api/v2/landing-pages HTTP/1.1
Host: api.frantz.no
Authorization: Bearer fzat_...
Content-Type: application/json
{
"externalReference": "ad-12345",
"url": "https://jobs.example.com/ad-12345",
"title": "Nurse, Haukeland",
"startDate": "2026-10-20",
"endDate": "2026-11-30",
"deadline": "2026-11-15",
"styrk": 2223
}Fields
| Field | What it is |
|---|---|
externalReference | Required when you send. Your id, up to 50 characters. Cannot be changed. |
url | Required when you send. The landing page's address, where the script goes. An https address, up to 512 characters. |
title | The title, such as a job title, up to 255 characters. |
startDate | First day the landing page runs. Today when left out. |
endDate | Last day the landing page runs. 21 days from today when left out. Frantz stops counting visits after it. |
deadline | The deadline, such as the application deadline for a job ad: a date, or a short text such as ASAP, up to 20 characters. |
audienceId | Who the landing page is for, from audiences. |
styrk | The four-digit STYRK-08 (ISCO-08) occupation code, for a job ad. Without audienceId, Frantz picks the audience for this code. |
bannerShortText | Text for the banners in the landing page's campaigns, up to 255 characters. |
bannerLogoUrl, bannerImageUrl | The logo and image for the banners, as https addresses. |
The response has all of these, and also connectId, script, reportUrl (the
Frantz report for the landing page), createdDate and updatedDate.
Changing a landing page
Send the new values with PATCH /api/v2/landing-pages/{connectId}, or send the landing page again with
POST. Both follow the same rules:
- A field you leave out, or send as
null, stays as it is. - An empty string (
"") clears a text field.
PATCH /api/v2/landing-pages/744376 HTTP/1.1
Host: api.frantz.no
Authorization: Bearer fzat_...
Content-Type: application/json
{
"deadline": "2026-11-22",
"bannerShortText": ""
}A ConnectID that is not yours answers 404, the same as one that does not exist.
Running a landing page again
To run a landing page again, send it again with POST and the same externalReference, with the
new startDate and endDate. It keeps its ConnectID, and the statistics go on from where they
were. If its end date has passed and you send no new one, it runs for another 21 days.
PATCH changes only what you send, so it does not start an ended landing page again by itself.
Finding a landing page
GET /api/v2/landing-pages?externalReference=ad-12345 gives a list with the landing page, or an empty list
when you have none with that reference. GET /api/v2/landing-pages/{connectId} gives one landing page, or
404.
{
"items": [
{
"connectId": 744376,
"externalReference": "ad-12345",
"script": "<script crossorigin='anonymous' async='' data-r='744376' src='https://...'></script>",
"title": "Nurse, Haukeland",
"url": "https://jobs.example.com/ad-12345",
"startDate": "2026-10-20",
"endDate": "2026-11-30",
"deadline": "2026-11-15",
"audienceId": 1421,
"styrk": 2223,
"reportUrl": "https://...",
"createdDate": "2026-10-19T08:15:02Z",
"updatedDate": "2026-10-19T08:15:02Z"
}
]
}The script
script is the tag that measures the landing page's visitors. Put it at the end of <head>
on the page in url, one per page.
- Use the value as it is. Do not build the tag yourself from the ConnectID. Frantz may change the script's address and attributes, and every response with the landing page has the current tag.
- Store it with the landing page, and replace it whenever a response gives you a new one.
- It asks for consent. The script follows the page's consent tool (see Consent). For a visitor who does not consent to marketing cookies, it stores and sends nothing, and the visit is not counted.
Marking up the page
The script counts page views by itself. To also count who reads the whole text and who clicks the main button, such
as apply, mark those elements on the page with a data-frnav-context attribute. The attributes belong in the page template,
so every landing page gets them; only the script differs from one landing page to the next.
| Value | Put it on |
|---|---|
readmorescenechanged | The button or link that shows the full text, when the page has one. |
readmorescrollchanged | The element that holds the full text, when the visitor scrolls to read it instead of clicking a button. |
readmorescrollblocker | An element placed above the text, such as a logo, when part of the text shows as the page loads. Use it together with readmorescrollchanged. |
applyposition | The page's main button (call to action), such as apply or contact. With several such buttons, mark all of them: Frantz counts one click however often the visitor clicks. |
showlater | The "Register your interest" button, when the landing page uses Frantz' lead generator. |
<button type="button" data-frnav-context="readmorescenechanged">Read the whole job ad</button>
<a href="https://jobs.example.com/ad-12345/apply" data-frnav-context="applyposition">Apply</a>- The template cannot take attributes? Add them from JavaScript, by id or class, in a script at the end of
<body>so it runs before the page is ready:document.querySelector("#applyButton").setAttribute("data-frnav-context", "applyposition"); - WordPress with Elementor takes the attribute as name and value separated by a pipe:
data-frnav-context|readmorescenechanged. Plain WordPress needs a plugin for attributes, such as Attributes for Blocks. - Testing, type
fDebugLogConsole = true;in the browser console once the script has loaded, and the script logs what it finds and counts.
Consent
The script reads the visitor's answer from the page's consent tool. It recognises Cookiebot, Cookie Information and OneTrust by itself. Another consent tool is connected in one of two ways.
Mark the consent notice's buttons
Put data-frnav-context on the buttons and switches in your consent notice:
| Value | Put it on |
|---|---|
gdpraccept | The button that accepts all cookies. |
gdprreject | The button that rejects them. |
gdprsavesettings | The button that saves the visitor's own choices, when the notice has one. |
gdprcheckmarketing | The switch or checkbox for marketing cookies. |
gdprcheckstat | The switch or checkbox for statistics. |
The script connects to the buttons when the page is ready, so the consent notice's markup has to be in the page by then. A notice added after that is not connected.
Or give the script the answer
Define two functions before the script tag. The script calls them as the page loads, and counts the visit when
hasMarketingConsent returns true.
<script>
window.hasMarketingConsent = function () { return myConsentTool.hasConsent("marketing"); };
window.hasStatsConsent = function () { return myConsentTool.hasConsent("statistics"); };
</script>Audiences
An audience tells Frantz who the landing page is for. Audiences have three levels: industry,
category and speciality. A landing page should have one at category level or
below. There are three ways to choose it:
- By STYRK code: send
styrkwithoutaudienceId, and Frantz picks the audience whose speciality has that code. - From a title:
GET /api/v2/audiences?title=Sykepleiergives the audiences that fit, best first. It can be none or several: Frantz does not guess, so choose one. - From the list:
GET /api/v2/audiences?level=categorygives every audience at that level, andGET /api/v2/audiencesgives them all.
{
"items": [
{
"audienceId": 1421,
"level": "speciality",
"industry": { "name": "Helse og omsorg", "reach": 310000 },
"category": { "name": "Sykepleie", "reach": 120000 },
"speciality": { "name": "Sykepleier", "reach": 85000 },
"styrk": 2223
}
]
}
reach is roughly how many people each level reaches. A speciality Frantz has not linked
to a category comes back without industry and category, with its STYRK code. Give the
audience to the landing page as audienceId.