FrantzPublic API
Guide

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.

CallWhat it does
POST/api/v2/landing-pagesSend 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/audiencesThe 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

  • externalReference is 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-1 and ad-1 are the same landing page.
  • connectId is 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 in Location.
  • 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.

HTTP
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

FieldWhat it is
externalReferenceRequired when you send. Your id, up to 50 characters. Cannot be changed.
urlRequired when you send. The landing page's address, where the script goes. An https address, up to 512 characters.
titleThe title, such as a job title, up to 255 characters.
startDateFirst day the landing page runs. Today when left out.
endDateLast day the landing page runs. 21 days from today when left out. Frantz stops counting visits after it.
deadlineThe deadline, such as the application deadline for a job ad: a date, or a short text such as ASAP, up to 20 characters.
audienceIdWho the landing page is for, from audiences.
styrkThe four-digit STYRK-08 (ISCO-08) occupation code, for a job ad. Without audienceId, Frantz picks the audience for this code.
bannerShortTextText for the banners in the landing page's campaigns, up to 255 characters.
bannerLogoUrl, bannerImageUrlThe 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.
HTTP
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.

JSON
{
  "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.

ValuePut it on
readmorescenechangedThe button or link that shows the full text, when the page has one.
readmorescrollchangedThe element that holds the full text, when the visitor scrolls to read it instead of clicking a button.
readmorescrollblockerAn element placed above the text, such as a logo, when part of the text shows as the page loads. Use it together with readmorescrollchanged.
applypositionThe 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.
showlaterThe "Register your interest" button, when the landing page uses Frantz' lead generator.
HTML
<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.

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.

Put data-frnav-context on the buttons and switches in your consent notice:

ValuePut it on
gdpracceptThe button that accepts all cookies.
gdprrejectThe button that rejects them.
gdprsavesettingsThe button that saves the visitor's own choices, when the notice has one.
gdprcheckmarketingThe switch or checkbox for marketing cookies.
gdprcheckstatThe 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.

Define two functions before the script tag. The script calls them as the page loads, and counts the visit when hasMarketingConsent returns true.

HTML
<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 styrk without audienceId, and Frantz picks the audience whose speciality has that code.
  • From a title: GET /api/v2/audiences?title=Sykepleier gives 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=category gives every audience at that level, and GET /api/v2/audiences gives them all.
JSON
{
  "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.