Atribu
API Reference

Visitors & Realtime

Visitor list, live visitor count, keywords, and attribution quality

Visitors & Realtime

Four endpoints for visitor data, realtime presence, search keywords, and attribution quality metrics.


Visitor List

Endpoint
GET /api/v1/visitors

Paginated list of all visitors (identified and anonymous). Returns PII fields like name and email.

Scope: visitors:read (must be explicitly granted)

PII access required

This endpoint returns personally identifiable information (name, email). Your API key must have the visitors:read scope explicitly granted. Keys with only analytics:read will receive a 403 Forbidden response.

Parameters

ParameterTypeRequiredDescription
date_fromstringYesStart date (YYYY-MM-DD)
date_tostringYesEnd date (YYYY-MM-DD)
searchstringNoSearch by name or email
limitnumberNoResults per page (default 10, max 100)
cursor_timestringNoPagination cursor (ISO timestamp)
cursor_idstringNoPagination cursor ID

Request

Request
curl -H "Authorization: Bearer atb_live_YOUR_KEY" \
  "https://www.atribu.app/api/v1/visitors?date_from=2026-03-01&date_to=2026-03-25&limit=5"
Request
const response = await fetch(
  "https://www.atribu.app/api/v1/visitors?date_from=2026-03-01&date_to=2026-03-25&limit=5",
  {
    headers: {
      Authorization: "Bearer atb_live_YOUR_KEY",
    },
  }
);
const data = await response.json();
Request
import requests

resp = requests.get(
    "https://www.atribu.app/api/v1/visitors",
    headers={"Authorization": "Bearer atb_live_YOUR_KEY"},
    params={
        "date_from": "2026-03-01",
        "date_to": "2026-03-25",
        "limit": 5,
    },
)
data = resp.json()

Response

Success response (200 OK)
{
  "data": [
    {
      "visitor_id": "uuid",
      "customer_profile_id": "uuid",
      "name": "John Doe",
      "email": "[email protected]",
      "country": "US",
      "device": "desktop",
      "browser": "Chrome",
      "os": "macOS",
      "channel": "Organic Search",
      "source": "google",
      "total_revenue": 450.00,
      "last_seen_at": "2026-03-25T08:30:00Z",
      "session_count": 5,
      "total_pageviews": 18,
      "touch_channels": ["Organic Search", "Direct", "Paid Social"]
    }
  ],
  "pagination": {
    "has_next": true,
    "cursor": "2026-03-25T08:30:00Z|uuid"
  },
  "meta": {
    "date_from": "2026-03-01",
    "date_to": "2026-03-25",
    "profile_id": "uuid"
  }
}

Response fields

FieldTypeDescription
visitor_idstringUnique visitor identifier (anonymous_id)
customer_profile_idstring | nullLinked customer profile (null for anonymous visitors)
namestringDisplay name or deterministic anonymous name (e.g. "Teal Falcon")
emailstring | nullEmail address if identified
countrystringTwo-letter country code
devicestringDevice type: desktop, mobile, tablet
browserstringBrowser name
osstringOperating system
channelstringClassified traffic channel (see Channels)
sourcestringTraffic source
total_revenuenumberTotal attributed cash revenue
last_seen_atstringISO timestamp of last activity
session_countnumberTotal sessions in the date range
total_pageviewsnumberTotal page views in the date range
touch_channelsstring[]All channels this visitor has interacted through

Realtime

Endpoint
GET /api/v1/realtime

Returns the number of visitors currently on your site (active in the last 5 minutes).

Scope: realtime:read

No date parameters

This endpoint returns a live snapshot. No date_from or date_to parameters are needed.

Request

Request
curl -H "Authorization: Bearer atb_live_YOUR_KEY" \
  "https://www.atribu.app/api/v1/realtime"
Request
const response = await fetch(
  "https://www.atribu.app/api/v1/realtime",
  {
    headers: {
      Authorization: "Bearer atb_live_YOUR_KEY",
    },
  }
);
const data = await response.json();
Request
import requests

resp = requests.get(
    "https://www.atribu.app/api/v1/realtime",
    headers={"Authorization": "Bearer atb_live_YOUR_KEY"},
)
data = resp.json()

Response

Success response (200 OK)
{
  "data": {
    "visitors_online": 24
  },
  "meta": {
    "profile_id": "uuid"
  }
}

Keywords

Endpoint
GET /api/v1/keywords

Returns Google Search Console keyword performance data. Requires an active GSC integration.

Scope: analytics:read

Parameters

ParameterTypeRequiredDescription
date_fromstringYesStart date (YYYY-MM-DD)
date_tostringYesEnd date (YYYY-MM-DD)
limitnumberNoMax results (default 50, max 100)

Request

Request
curl -H "Authorization: Bearer atb_live_YOUR_KEY" \
  "https://www.atribu.app/api/v1/keywords?date_from=2026-03-01&date_to=2026-03-25&limit=10"
Request
const response = await fetch(
  "https://www.atribu.app/api/v1/keywords?date_from=2026-03-01&date_to=2026-03-25&limit=10",
  {
    headers: {
      Authorization: "Bearer atb_live_YOUR_KEY",
    },
  }
);
const data = await response.json();
Request
import requests

resp = requests.get(
    "https://www.atribu.app/api/v1/keywords",
    headers={"Authorization": "Bearer atb_live_YOUR_KEY"},
    params={
        "date_from": "2026-03-01",
        "date_to": "2026-03-25",
        "limit": 10,
    },
)
data = resp.json()

Response

Success response (200 OK)
{
  "data": [
    {
      "keyword": "marketing attribution tool",
      "impressions": 2400,
      "clicks": 180,
      "ctr": 7.5,
      "avg_position": 4.2
    },
    {
      "keyword": "roas calculator",
      "impressions": 1800,
      "clicks": 95,
      "ctr": 5.3,
      "avg_position": 6.8
    }
  ],
  "meta": {
    "date_from": "2026-03-01",
    "date_to": "2026-03-25",
    "profile_id": "uuid"
  }
}

Response fields

FieldTypeDescription
keywordstringSearch query term
impressionsnumberTimes your site appeared in search results
clicksnumberTimes users clicked through to your site
ctrnumberClick-through rate (clicks / impressions x 100)
avg_positionnumberAverage ranking position in search results

Quality

Endpoint
GET /api/v1/quality

Returns attribution data quality metrics -- how well your tracking captures marketing source data.

Scope: analytics:read

Parameters

ParameterTypeRequiredDescription
date_fromstringYesStart date (YYYY-MM-DD)
date_tostringYesEnd date (YYYY-MM-DD)

Request

Request
curl -H "Authorization: Bearer atb_live_YOUR_KEY" \
  "https://www.atribu.app/api/v1/quality?date_from=2026-03-01&date_to=2026-03-25"
Request
const response = await fetch(
  "https://www.atribu.app/api/v1/quality?date_from=2026-03-01&date_to=2026-03-25",
  {
    headers: {
      Authorization: "Bearer atb_live_YOUR_KEY",
    },
  }
);
const data = await response.json();
Request
import requests

resp = requests.get(
    "https://www.atribu.app/api/v1/quality",
    headers={"Authorization": "Bearer atb_live_YOUR_KEY"},
    params={
        "date_from": "2026-03-01",
        "date_to": "2026-03-25",
    },
)
data = resp.json()

Response

Success response (200 OK)
{
  "data": {
    "total_events": 1450,
    "with_full_utms": 890,
    "with_fbclid_only": 320,
    "with_no_tracking": 240,
    "coverage_percent": 83.45
  },
  "meta": {
    "date_from": "2026-03-01",
    "date_to": "2026-03-25",
    "profile_id": "uuid"
  }
}

Response fields

FieldTypeDescription
total_eventsnumberTotal tracked events in the period
with_full_utmsnumberEvents with complete UTM parameters
with_fbclid_onlynumberEvents with only a click ID (fbclid/gclid) but no UTMs
with_no_trackingnumberEvents with no marketing source data at all
coverage_percentnumberPercentage of events that have at least some attribution data

Improving coverage

A low coverage_percent usually means UTM parameters are missing from your ad URLs. Ensure all campaigns include utm_source, utm_medium, and utm_campaign parameters. Click IDs (fbclid, gclid) are added automatically by ad platforms.

On this page