API Reference

Complete JavaScript API documentation for the Klar tracker.

Global Object

The Klar tracker is available as window.klar after the script loads.

Methods

klar.page(path?)

Manually track a pageview. Useful for custom routing implementations, or when data-auto-track="false". klar.trackPageview(path?) is an alias for the same function.

Parameters

  • path (optional) — Page path, e.g. /pricing (defaults to window.location.pathname)

Example

// Track current page
klar.page();

// Track a custom path
klar.page('/custom-page');

Only the path is recorded: there is no URL or title argument. A second pageview for the same path within 1.5 seconds is ignored.

klar.track(eventName, properties?)

Track a custom event with optional properties.

Parameters

  • eventName (required) — Event name (string)
  • properties (optional) — Event data (object)

Example

// Simple event
klar.track('button_click');

// Event with properties
klar.track('purchase', {
  product: 'Pro Plan',
  price: 29,
  currency: 'USD'
});

// Form submission
klar.track('form_submit', {
  form: 'contact',
  fields: ['name', 'email', 'message']
});

Properties are sent with the event as a JSON object. Keep them small and never put personal data in them.

klar.goal(goalName, properties?)

Record a goal conversion. It tracks the event goal_<goalName> with the optional properties.

Parameters

  • goalName (required) — Goal name (string)
  • properties (optional) — Event data (object)

Example

klar.goal('signup');
// tracks the event goal_signup

klar.consent(state)

Grant or withdraw consent. Pair it with data-require-consent, which holds tracking until consent is granted.

Parameters

  • state (required) — 'granted' (or true) starts or resumes tracking; 'denied' (or false) stops it

Example

// After the visitor accepts your own consent prompt
klar.consent('granted');

Klar itself needs no consent banner; this gate is for embedders who want their own.

klar.init(config?)

Start the tracker from JavaScript instead of script attributes. Called automatically from the script tag's data-* attributes when data-site-id is set.

Config keys

  • site (or id) — Site ID
  • apiKey — Site API key (same as data-key)
  • endpoint — Collect endpoint URL (same as data-endpoint)
  • honorDnt — true to honor DNT/GPC
  • requireConsent — true to wait for klar.consent()
  • autoTrack — false to disable automatic tracking
  • debug — true to log to the console

Example

klar.init({ site: 'abc123', apiKey: 'your-api-key' });

Configuration

Configure Klar using data attributes on the script tag:

data-site-id

Required. Your site ID from the Klar dashboard.

<script
  src="https://klar.alphabros.eu/klar.v2.js"
  data-site-id="abc123"
  data-key="your-api-key"
  defer
></script>

data-key

Required if your site has an API key — every site created from the dashboard does. Sent as the data-token/data-key field on the collect request; a snippet missing it gets a 403 (Invalid API key) from /api/collect and records nothing.

<script
  src="https://klar.alphabros.eu/klar.v2.js"
  data-site-id="abc123"
  data-key="your-api-key"
  defer
></script>

data-auto-track

Enable/disable automatic pageview tracking. Default: true

<script 
  src="https://klar.alphabros.eu/klar.v2.js" 
  data-site-id="abc123"
  data-auto-track="false"
  defer
></script>

When disabled, no pageviews, scroll or time-on-page events are sent automatically; call klar.page() and klar.track() yourself.

data-honor-dnt

Respect the browser's Do Not Track (DNT) and Global Privacy Control (GPC) signals. Default: false (opt-in). Klar's privacy is already structural (storageless, no cookies/PII), so honoring DNT/GPC is off by default — set to "true" to suppress tracking for visitors who send these signals.

<script
  src="https://klar.alphabros.eu/klar.v2.js"
  data-site-id="abc123"
  data-honor-dnt="true"
  defer
></script>

While enabled, no tracking occurs and no identifier is stored if DNT or GPC is set.

data-endpoint

Full URL of the collect endpoint. Default: /api/collect on the origin that served the tracker script.

<script
  src="https://cdn.example.com/klar.v2.js"
  data-site-id="abc123"
  data-endpoint="https://analytics.example.com/api/collect"
  defer
></script>

data-require-consent

Hold all tracking until your page calls klar.consent('granted'). Any value except "false" turns it on. Default: off.

<script
  src="https://klar.alphabros.eu/klar.v2.js"
  data-site-id="abc123"
  data-require-consent
  defer
></script>

data-outbound-links

Record a click on a link to another website as an outbound_click event, with the destination URL (without its query string or fragment), its host and the page the click happened on. Default: off. Cookie-free, and it never delays the navigation: the event is sent with sendBeacon. Only the full tracker, klar.links.js, reads this attribute; the standard klar.v2.js ignores it to stay under its 2 KB budget.

<script
  src="https://klar.alphabros.eu/klar.links.js"
  data-site-id="abc123"
  data-key="your-api-key"
  data-outbound-links="true"
  defer
></script>

data-file-downloads

Record a click on a link to a downloadable file as a file_download event, with the file URL (without its query string), its extension and the page. Default: off. Also klar.links.js only. The default file types are pdf, zip, gz, tar, rar, 7z, dmg, exe, msi, pkg, apk, doc, docx, xls, xlsx, csv, ppt, pptx, txt, rtf, epub, mp3, wav, mp4, mov and avi.

<script
  src="https://klar.alphabros.eu/klar.links.js"
  data-site-id="abc123"
  data-key="your-api-key"
  data-file-downloads="true"
  defer
></script>

data-download-extensions

Replace the default list of file types counted as downloads with your own, comma-separated. Case and leading dots are ignored. Used with data-file-downloads="true" on klar.links.js.

<script
  src="https://klar.alphabros.eu/klar.links.js"
  data-site-id="abc123"
  data-key="your-api-key"
  data-file-downloads="true"
  data-download-extensions="pdf,zip,epub"
  defer
></script>

Both events can be used as goals: add a goal of type event matching outbound_click or file_download, or press Use as goal on the event in your dashboard.

data-klar-form

Put data-klar-form="name" on a <form> to count its submissions (full tracker, klar.links.js). Each submission records a form_submit event with the form's name and the page, never a field value. The dashboard lists submissions per form and per page.

REST API

Server-side tracking using the HTTP API.

POST /api/collect

Send a pageview or event.

This is the endpoint the tracker posts to. You can post to it from your own server too, with the same fields.

Headers

Content-Type: application/json

Body fields

  • s (required) — your site ID
  • type — pageview (default) or event
  • p — the page path (defaults to /)
  • r — the referrer URL, if any
  • w — the screen width in pixels
  • e — the event name, for an event
  • d — the event properties (an object), for an event
  • utm_source, utm_medium, utm_campaign — campaign tags; each is trimmed, capped at 100 characters and dropped if it contains @
  • data-key — the site's data key, required when the site has one (every site created from the dashboard does)

Example body (pageview)

{
  "s": "abc123",
  "type": "pageview",
  "p": "/pricing",
  "r": "https://chatgpt.com/",
  "w": 1440,
  "utm_campaign": "launch",
  "data-key": "your-site-data-key"
}

Example body (event)

{
  "s": "abc123",
  "type": "event",
  "p": "/pricing",
  "e": "signup",
  "d": {
    "plan": "pro"
  },
  "data-key": "your-site-data-key"
}

Response

HTTP 201 with:

{
  "ok": true
}

Errors

  • 400 — the body is not JSON, s is missing, or no site has that ID
  • 403 Invalid referer — the request's Referer or Origin host is not the site's domain or one of its aliases (a server-side request without either header passes this check)
  • 403 Invalid API key — the site has a data key and the body does not carry it
  • 402 — the account's monthly pageview limit is reached

A 202 with {"ok":true} means the request was acknowledged but not recorded: its User-Agent names a known crawler, monitor or link-preview fetcher, or its referrer is a listed spam domain. A scripting client (curl, python-requests, axios, Go, Java) is recorded when the request carries the site's data key and no Referer or Origin header, as in the example below. Add either header to a scripting client and it is dropped like any other automated visit.

Example (cURL)

curl -X POST https://klar.alphabros.eu/api/collect \
  -H "Content-Type: application/json" \
  -d '{"s":"abc123","type":"pageview","p":"/pricing","r":"https://chatgpt.com/","data-key":"your-site-data-key"}'

The data key is the data-key value of your tracking snippet. It is public (it ships in your page) and only lets you send data. It is not an API v1 key: those start with klr_, read your stats, and must stay secret.

GET /api/v1/sites/:siteId/export

Download raw pageviews or events with a site API key.

Headers

Authorization: Bearer klr_your_api_key

Query parameters

  • type — pageviews or events (required)
  • period — today, 7d, 30d, 90d, year, or all (defaults to 30d)

Returns CSV, capped at 100,000 rows to match the session export. A capped response includes X-Export-Truncated: true. The endpoint uses the same per-key rate limit as the other /api/v1 endpoints.

Example (cURL)

curl -H "Authorization: Bearer klr_your_api_key" \
  "https://klar.alphabros.eu/api/v1/sites/abc123/export?type=pageviews&period=30d"

API v1

API v1 reads your stats. Every request needs a site API key, sent as a bearer token. A key starts with klr_ and belongs to one site. Create one while signed in with POST /api/keys and the body {"siteId": "abc123", "name": "Reports"}: the response carries the full key, which is not shown again. Every plan has API keys, Free included (up to 3).

Authorization: Bearer klr_your_api_key

Errors

  • 401 — no Authorization: Bearer header, or an unknown or expired key
  • 429 — the key's per-minute rate limit is used up (60 requests a minute by default)
  • 404 — no site has that ID, or the endpoint does not exist
  • 403 — the key belongs to another site

Period

start and end are ISO 8601 timestamps, for example 2026-10-01T00:00:00Z. Without start the period starts at the beginning of your data; without end it ends now.

GET /api/v1/sites/:siteId/channels

Pageviews by channel, and by AI assistant.

The six channels and the rules that assign them are described in AI assistant traffic. aiAssistants breaks the ai_assistant channel down by assistant.

Example (cURL)

curl -H "Authorization: Bearer klr_your_api_key" \
  "https://klar.alphabros.eu/api/v1/sites/abc123/channels?start=2026-10-01T00:00:00Z&end=2026-10-31T23:59:59Z"

Response

{
  "period": {
    "start": "2026-10-01T00:00:00.000Z",
    "end": "2026-10-31T23:59:59.000Z"
  },
  "channels": {
    "direct": 412,
    "search": 380,
    "social": 96,
    "ai_assistant": 57,
    "email": 31,
    "referral": 124
  },
  "aiAssistants": [
    {
      "id": "chatgpt",
      "label": "ChatGPT",
      "pageviews": 33,
      "visitors": 29
    },
    {
      "id": "perplexity",
      "label": "Perplexity",
      "pageviews": 15,
      "visitors": 14
    },
    {
      "id": "claude",
      "label": "Claude",
      "pageviews": 9,
      "visitors": 8
    }
  ],
  "total": 1100
}
  • Live data only: imported Plausible or Fathom history is not counted, in the channels or in total.
  • The channels are worked out for at most 1,000 distinct referrer and campaign-tag groups per request. On a site with more, the pageviews of the remaining groups count as referral, so the other channels can be slightly low.

GET /api/v1/sites/:siteId/referrers

Top referrers, with the channel summary.

Example (cURL)

curl -H "Authorization: Bearer klr_your_api_key" \
  "https://klar.alphabros.eu/api/v1/sites/abc123/referrers?start=2026-10-01T00:00:00Z&end=2026-10-31T23:59:59Z"

Response

{
  "referrers": [
    {
      "referrer": "(direct)",
      "count": 412,
      "conversions": 0,
      "type": "direct",
      "ctr": "0.00"
    },
    {
      "referrer": "https://www.google.com/",
      "count": 301,
      "conversions": 0,
      "type": "search",
      "ctr": "0.00"
    },
    {
      "referrer": "https://chatgpt.com/",
      "count": 33,
      "conversions": 0,
      "type": "ai_assistant",
      "ctr": "0.00"
    }
  ],
  "total": 1340,
  "summary": {
    "direct": 412,
    "search": 380,
    "social": 96,
    "ai_assistant": 57,
    "email": 31,
    "referral": 124
  }
}
  • referrers holds the top 50 referrer URLs of live pageviews. Visits with no referrer are grouped as (direct).
  • A row's type comes from its referrer only, so it can be ai_assistant but never email (Email comes from utm_medium).
  • summary is the same six-channel object as channels in /channels: live data only, with the same 1,000-group bound.
  • total also counts imported pageviews, so on a site with imported history it is larger than the sum of summary. In the example, 240 imported pageviews make the difference.
  • conversions is always 0 and ctr always "0.00".

Event Types

Common event names and their properties:

button_click

klar.track('button_click', {
  button: 'signup',
  location: 'header'
});

form_submit

klar.track('form_submit', {
  form: 'contact',
  fields: ['name', 'email']
});

purchase

klar.track('purchase', {
  product: 'Pro Plan',
  price: 29,
  currency: 'USD'
});

video_play

klar.track('video_play', {
  video_id: '123',
  duration: 45,
  provider: 'youtube'
});

search

klar.track('search', {
  query: 'analytics',
  results: 42
});

Browser Support

Klar supports all modern browsers:

  • Chrome / Edge (last 2 versions)
  • Firefox (last 2 versions)
  • Safari (last 2 versions)
  • Mobile browsers (iOS Safari, Chrome Mobile)

IE11 and older browsers are not supported.