Docs

API reference

Every endpoint of the 3x REST API v1 (157 routes), generated from the route contracts the API itself is built from. The machine-readable form is the OpenAPI 3.1 document at GET /v1/openapi.json; an interactive reference is served at /docs/api and a markdown rendering of the full schemas at /docs/api.md. Conventions (authentication, errors, pagination, idempotency, rate limits, filters) are described in the other pages of the API section.

System

OperationEndpointAuth
system.healthGET /v1/healthpublic
system.cronGET /v1/cron/{job}CRON_SECRET

system.health

GET /v1/health – Health check.

  • Auth: public
  • Response: 200 JSON (Health)

system.cron

GET /v1/cron/{job} – Run scheduled jobs (Vercel Cron / external scheduler).

job = tick (all due jobs) or a single job name from the job registry. Bearer CRON_SECRET.

  • Auth: CRON_SECRET
  • Response: 200 JSON (CronResult)

Path parameters:

NameTypeRequiredDescription
jobstringyes

Ingest

OperationEndpointAuth
ingest.collectPOST /v1/epublishable key (pk_3x_…)
ingest.collectAliasPOST /v1/collectpublishable key (pk_3x_…)
ingest.clientConfigGET /v1/c/{pk}publishable key (pk_3x_…)
ingest.scriptGET /v1/s/{file}public
ingest.sdkPackageGET /v1/sdk/{file}public

ingest.collect

POST /v1/e – Collect a tracking batch (browser SDK).

text/plain JSON WireBatch v2 with the publishable key in k. Always answers without body: 204 accepted or dropped (bots, budgets), 400 invalid, 403 origin/key, 413 too large, 429 rate limited.

  • Auth: publishable key (pk_3x_…)
  • Response: 204, no body
  • Body: text/plain (WireBatch)

ingest.collectAlias

POST /v1/collect – Alias of POST /v1/e (same handler; /v1/e is shorter and blocker-neutral).

  • Auth: publishable key (pk_3x_…)
  • Response: 204, no body
  • Body: text/plain (WireBatch)

ingest.clientConfig

GET /v1/c/{pk} – Client configuration for a publishable key.

  • Auth: publishable key (pk_3x_…)
  • Response: 200 JSON (ClientConfig)

Path parameters:

NameTypeRequiredDescription
pkstringyes

ingest.script

GET /v1/s/{file} – Browser SDK script (x3.js, x3.full.js, x3.{video,sections,forms,identify,consent,bookings}.js, versioned x3@1.2.3.js); ?k=pk_… inlines the client config.

  • Auth: public
  • Response: 200 javascript

Path parameters:

NameTypeRequiredDescription
filestringyes

Query parameters:

NameTypeRequiredDescription
kstringno

ingest.sdkPackage

GET /v1/sdk/{file} – npm tarball of @3x-engine/sdk built with this deployment – npm install <api origin>/v1/sdk/3x-engine-sdk-<version>.tgz (used by the install recipes).

  • Auth: public
  • Response: 200 gzip

Path parameters:

NameTypeRequiredDescription
filestringyes

Events

OperationEndpointAuth
ingest.serverEventsPOST /v1/projects/{project}/eventssecret key or user session · events:write · Idempotency-Key
analytics.liveEventsGET /v1/projects/{project}/events/livesecret key or user session · analytics:read
events.catalogGET /v1/projects/{project}/event-catalogsecret key or user session · analytics:read
eventSchemas.upsertPUT /v1/projects/{project}/event-schemas/{name}secret key or user session · config:write
eventSchemas.deleteDELETE /v1/projects/{project}/event-schemas/{name}secret key or user session · config:write
events.validatePOST /v1/events/validatepublic

ingest.serverEvents

POST /v1/projects/{project}/events – Send server-side events attached to a browser session.

  • Auth: secret key or user session · events:write · Idempotency-Key
  • Response: 202 JSON (ServerEventsResult)
  • Body: application/json (ServerEvents)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

analytics.liveEvents

GET /v1/projects/{project}/events/live – Events received since a cursor (long-poll up to ?wait=20 seconds, ≤ 200 rows).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (LiveEvents)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
cursorstringno
waitstringno
namesstring | string[]no
limitstringno
include_test"0" | "1" | "true" | "false"no

events.catalog

GET /v1/projects/{project}/event-catalog – Built-in events, presets, registered and observed custom events.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

eventSchemas.upsert

PUT /v1/projects/{project}/event-schemas/{name} – Register or update a custom event schema.

  • Auth: secret key or user session · config:write
  • Response: 200 JSON (EventSchema)
  • Body: application/json (EventSchemaWrite)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
namestringyes

eventSchemas.delete

DELETE /v1/projects/{project}/event-schemas/{name} – Remove a custom event schema (events stay; they become unregistered).

  • Auth: secret key or user session · config:write
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
namestringyes

events.validate

POST /v1/events/validate – Validate a custom event payload against the built-in catalog (and a project's schemas when authorized).

  • Auth: public
  • Response: 200 JSON (EventValidateResult)
  • Body: application/json (EventValidate)

Auth

OperationEndpointAuth
auth.signupPOST /v1/auth/signuppublic
auth.loginPOST /v1/auth/loginpublic
auth.logoutPOST /v1/auth/logoutdashboard user session
auth.meGET /v1/auth/medashboard user session
auth.sudoPOST /v1/auth/sudodashboard user session
auth.magicLinkPOST /v1/auth/magic-linkpublic
auth.magicLinkVerifyPOST /v1/auth/magic-link/verifypublic
auth.passwordPOST /v1/auth/passworddashboard user session · sudo
auth.invitationInfoGET /v1/invitations/{token}public
auth.invitationAcceptPOST /v1/invitations/{token}/acceptdashboard user session
oauthGrants.mineGET /v1/auth/oauth-grantsdashboard user session

auth.signup

POST /v1/auth/signup – Create a user (self-signup when enabled, or with an invitation token).

  • Auth: public
  • Response: 201 JSON (SessionToken)
  • Body: application/json (Signup)

auth.login

POST /v1/auth/login – Log in with e-mail and password; returns a session token (x3s_…).

  • Auth: public
  • Response: 200 JSON (SessionToken)
  • Body: application/json (Login)

auth.logout

POST /v1/auth/logout – Revoke the current session (all=true: every session of the user).

  • Auth: dashboard user session
  • Response: 200 JSON (Ok)
  • Body: application/json

Body fields:

NameTypeRequiredDescription
allbooleanno

auth.me

GET /v1/auth/me – Current user, memberships and accessible projects.

  • Auth: dashboard user session
  • Response: 200 JSON (Me)

auth.sudo

POST /v1/auth/sudo – Re-authenticate for sensitive actions (15 minutes).

  • Auth: dashboard user session
  • Response: 200 JSON
  • Body: application/json (Sudo)

POST /v1/auth/magic-link – Request a magic link (same response whether the account exists).

  • Auth: public
  • Response: 202 JSON (Ok)
  • Body: application/json (MagicLinkRequest)

auth.magicLinkVerify

POST /v1/auth/magic-link/verify – Exchange a magic-link token for a session.

  • Auth: public
  • Response: 200 JSON (SessionToken)
  • Body: application/json (MagicLinkVerify)

auth.password

POST /v1/auth/password – Change the password (sudo).

  • Auth: dashboard user session · sudo
  • Response: 200 JSON (Ok)
  • Body: application/json (PasswordChange)

auth.invitationInfo

GET /v1/invitations/{token} – Invitation details for the accept page.

  • Auth: public
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
tokenstringyes

auth.invitationAccept

POST /v1/invitations/{token}/accept – Accept an invitation as the logged-in user.

  • Auth: dashboard user session
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
tokenstringyes

oauthGrants.mine

GET /v1/auth/oauth-grants – Connected apps (OAuth grants) of the logged-in user.

  • Auth: dashboard user session
  • Response: 200 JSON

Organizations

OperationEndpointAuth
orgs.listGET /v1/orgssecret key or user session
orgs.createPOST /v1/orgsdashboard user session
orgs.getGET /v1/orgs/{org}secret key or user session
orgs.updatePATCH /v1/orgs/{org}secret key or user session · org:admin
orgs.deleteDELETE /v1/orgs/{org}dashboard user session · org:admin · sudo
audit.listGET /v1/orgs/{org}/auditsecret key or user session · org:admin
oauthGrants.listGET /v1/orgs/{org}/oauth-grantssecret key or user session · org:admin
oauthGrants.revokeDELETE /v1/orgs/{org}/oauth-grants/{id}secret key or user session

orgs.list

GET /v1/orgs – Organizations of the caller.

  • Auth: secret key or user session
  • Response: 200 JSON

orgs.create

POST /v1/orgs – Create an organization (the caller becomes owner).

  • Auth: dashboard user session
  • Response: 201 JSON (Organization)
  • Body: application/json (OrganizationCreate)

orgs.get

GET /v1/orgs/{org} – Organization.

  • Auth: secret key or user session
  • Response: 200 JSON (Organization)

Path parameters:

NameTypeRequiredDescription
orgstringyes

orgs.update

PATCH /v1/orgs/{org} – Rename an organization.

  • Auth: secret key or user session · org:admin
  • Response: 200 JSON (Organization)
  • Body: application/json (OrganizationUpdate)

Path parameters:

NameTypeRequiredDescription
orgstringyes

orgs.delete

DELETE /v1/orgs/{org} – Delete an organization with all projects and data (owner, sudo).

  • Auth: dashboard user session · org:admin · sudo
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
orgstringyes

audit.list

GET /v1/orgs/{org}/audit – Audit log (keys, members, projects, config, conversions, connections).

  • Auth: secret key or user session · org:admin
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
orgstringyes

Query parameters:

NameTypeRequiredDescription
limitstringno
cursorstringno
projectstringno
actionstringno

oauthGrants.list

GET /v1/orgs/{org}/oauth-grants – OAuth grants into the organization (all members).

  • Auth: secret key or user session · org:admin
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
orgstringyes

oauthGrants.revoke

DELETE /v1/orgs/{org}/oauth-grants/{id} – Revoke an OAuth grant (all its tokens).

  • Auth: secret key or user session
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
orgstringyes
idstringyes

Members

OperationEndpointAuth
members.listGET /v1/orgs/{org}/memberssecret key or user session · org:admin
members.updatePATCH /v1/orgs/{org}/members/{userId}dashboard user session · org:admin · sudo
members.removeDELETE /v1/orgs/{org}/members/{userId}dashboard user session · org:admin · sudo
invitations.listGET /v1/orgs/{org}/invitationssecret key or user session · org:admin
invitations.createPOST /v1/orgs/{org}/invitationsdashboard user session · org:admin · sudo
invitations.revokeDELETE /v1/orgs/{org}/invitations/{id}secret key or user session · org:admin

members.list

GET /v1/orgs/{org}/members – Members of an organization.

  • Auth: secret key or user session · org:admin
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
orgstringyes

members.update

PATCH /v1/orgs/{org}/members/{userId} – Change a member's role or personal-data permission (sudo).

  • Auth: dashboard user session · org:admin · sudo
  • Response: 200 JSON (Member)
  • Body: application/json (MemberUpdate)

Path parameters:

NameTypeRequiredDescription
orgstringyes
userIdstringyes

members.remove

DELETE /v1/orgs/{org}/members/{userId} – Remove a member (sudo; the last owner cannot be removed).

  • Auth: dashboard user session · org:admin · sudo
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
orgstringyes
userIdstringyes

invitations.list

GET /v1/orgs/{org}/invitations – Open and past invitations.

  • Auth: secret key or user session · org:admin
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
orgstringyes

invitations.create

POST /v1/orgs/{org}/invitations – Invite a member (link valid 7 days, single use).

  • Auth: dashboard user session · org:admin · sudo
  • Response: 201 JSON (InvitationCreated)
  • Body: application/json (InvitationCreate)

Path parameters:

NameTypeRequiredDescription
orgstringyes

invitations.revoke

DELETE /v1/orgs/{org}/invitations/{id} – Revoke an invitation.

  • Auth: secret key or user session · org:admin
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
orgstringyes
idstringyes

Keys

OperationEndpointAuth
keys.listGET /v1/orgs/{org}/keyssecret key or user session · org:admin
keys.createPOST /v1/orgs/{org}/keyssecret key or user session · org:admin · sudo
keys.rollPOST /v1/orgs/{org}/keys/{id}/rollsecret key or user session · org:admin · sudo
keys.revokeDELETE /v1/orgs/{org}/keys/{id}secret key or user session · org:admin · sudo
publishableKeys.listGET /v1/projects/{project}/publishable-keyssecret key or user session · analytics:read
publishableKeys.createPOST /v1/projects/{project}/publishable-keyssecret key or user session · project:admin
publishableKeys.rollPOST /v1/projects/{project}/publishable-keys/{id}/rollsecret key or user session · project:admin
proxyKeys.listGET /v1/projects/{project}/proxy-keyssecret key or user session · project:admin
proxyKeys.createPOST /v1/projects/{project}/proxy-keyssecret key or user session · project:admin
proxyKeys.revokeDELETE /v1/projects/{project}/proxy-keys/{id}secret key or user session · project:admin
publishableKeys.revokeDELETE /v1/projects/{project}/publishable-keys/{id}secret key or user session · project:admin

keys.list

GET /v1/orgs/{org}/keys – Secret keys of the organization (never the secret).

  • Auth: secret key or user session · org:admin
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
orgstringyes

keys.create

POST /v1/orgs/{org}/keys – Create a secret key – the value is returned once (sudo for users; scopes ≤ caller's).

  • Auth: secret key or user session · org:admin · sudo
  • Response: 201 JSON (ApiKeyCreated)
  • Body: application/json (SecretKeyCreate)

Path parameters:

NameTypeRequiredDescription
orgstringyes

keys.roll

POST /v1/orgs/{org}/keys/{id}/roll – Roll a secret key: new key now, the old one expires after the overlap (default 7 days).

  • Auth: secret key or user session · org:admin · sudo
  • Response: 201 JSON (ApiKeyCreated)
  • Body: application/json (KeyRoll)

Path parameters:

NameTypeRequiredDescription
orgstringyes
idstringyes

keys.revoke

DELETE /v1/orgs/{org}/keys/{id} – Revoke a secret key immediately.

  • Auth: secret key or user session · org:admin · sudo
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
orgstringyes
idstringyes

publishableKeys.list

GET /v1/projects/{project}/publishable-keys – Publishable keys (pk_3x_…) of the project.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

publishableKeys.create

POST /v1/projects/{project}/publishable-keys – Create a publishable key.

  • Auth: secret key or user session · project:admin
  • Response: 201 JSON (ApiKeyCreated)
  • Body: application/json (PublishableKeyCreate)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

publishableKeys.roll

POST /v1/projects/{project}/publishable-keys/{id}/roll – Roll a publishable key (old key keeps working during the overlap).

  • Auth: secret key or user session · project:admin
  • Response: 201 JSON (ApiKeyCreated)
  • Body: application/json (KeyRoll)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
idstringyes

proxyKeys.list

GET /v1/projects/{project}/proxy-keys – First-party proxy keys of the project (secret keys with exactly ingest:proxy; never the secret).

  • Auth: secret key or user session · project:admin
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

proxyKeys.create

POST /v1/projects/{project}/proxy-keys – Create a proxy key (scope ingest:proxy, bound to this project) – the value is returned once.

Requires project:admin and the right to grant ingest:proxy (owners/admins; keys and OAuth grants that hold ingest:proxy). Keys created by an OAuth grant or another key are bound to it.

  • Auth: secret key or user session · project:admin
  • Response: 201 JSON (ApiKeyCreated)
  • Body: application/json (ProxyKeyCreate)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

proxyKeys.revoke

DELETE /v1/projects/{project}/proxy-keys/{id} – Revoke a proxy key.

  • Auth: secret key or user session · project:admin
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
idstringyes

publishableKeys.revoke

DELETE /v1/projects/{project}/publishable-keys/{id} – Revoke a publishable key.

  • Auth: secret key or user session · project:admin
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
idstringyes

Projects

OperationEndpointAuth
projects.listGET /v1/projectssecret key or user session
projects.createPOST /v1/orgs/{org}/projectssecret key or user session · project:create
projects.getGET /v1/projects/{project}secret key or user session
projects.updatePATCH /v1/projects/{project}secret key or user session · project:admin
projects.deleteDELETE /v1/projects/{project}secret key or user session · org:admin · sudo
projects.getConfigGET /v1/projects/{project}/configsecret key or user session · analytics:read
projects.updateConfigPATCH /v1/projects/{project}/configsecret key or user session · project:admin
projects.statusGET /v1/projects/{project}/statussecret key or user session · analytics:read
projects.purgeDataPOST /v1/projects/{project}/purgesecret key or user session · project:admin · sudo

projects.list

GET /v1/projects – Projects the caller can access (all orgs).

  • Auth: secret key or user session
  • Response: 200 JSON

Query parameters:

NameTypeRequiredDescription
orgstringno
slugstringno

projects.create

POST /v1/orgs/{org}/projects – Create a project (returns it with its first publishable key); a project-narrowed key/grant gains access to it.

  • Auth: secret key or user session · project:create
  • Response: 201 JSON (ProjectCreated)
  • Body: application/json (ProjectCreate)

Path parameters:

NameTypeRequiredDescription
orgstringyes

projects.get

GET /v1/projects/{project} – Project.

  • Auth: secret key or user session
  • Response: 200 JSON (Project)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

projects.update

PATCH /v1/projects/{project} – Update project settings (name, time zone, currency, retention, limits …).

  • Auth: secret key or user session · project:admin
  • Response: 200 JSON (Project)
  • Body: application/json (ProjectUpdate)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

projects.delete

DELETE /v1/projects/{project} – Delete a project and all its data (sudo).

  • Auth: secret key or user session · org:admin · sudo
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

projects.getConfig

GET /v1/projects/{project}/config – Tracking configuration (domains, origins, page groups, personal pages, consent, presets …).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (ProjectTrackingConfigResponse)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

projects.updateConfig

PATCH /v1/projects/{project}/config – Update tracking configuration (top-level keys replace stored values; bumps configRev).

  • Auth: secret key or user session · project:admin
  • Response: 200 JSON (ProjectTrackingConfigResponse)
  • Body: application/json (TrackingConfigPatch)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

projects.status

GET /v1/projects/{project}/status – Tracking status: database, storage, cleanup, rescoring progress, budgets, proxy warning, last event.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (ProjectStatus)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

projects.purgeData

POST /v1/projects/{project}/purge – Delete tracking data in a date range or all of it (sudo).

  • Auth: secret key or user session · project:admin · sudo
  • Response: 200 JSON
  • Body: application/json

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Body fields:

NameTypeRequiredDescription
scope"all" | "range" | "test"yes
fromstringno
tostringno

Analytics

OperationEndpointAuth
analytics.overviewGET /v1/projects/{project}/analytics/overviewsecret key or user session · analytics:read
analytics.timeseriesGET /v1/projects/{project}/analytics/timeseriessecret key or user session · analytics:read
analytics.funnelGET /v1/projects/{project}/analytics/funnelsecret key or user session · analytics:read
analytics.breakdownGET /v1/projects/{project}/analytics/breakdownsecret key or user session · analytics:read
analytics.relevanceRankingGET /v1/projects/{project}/analytics/relevance-rankingsecret key or user session · analytics:read
analytics.pagesGET /v1/projects/{project}/analytics/pagessecret key or user session · analytics:read
analytics.scrollGET /v1/projects/{project}/analytics/scrollsecret key or user session · analytics:read
analytics.sectionsGET /v1/projects/{project}/analytics/sectionssecret key or user session · analytics:read
analytics.engagementGET /v1/projects/{project}/analytics/engagementsecret key or user session · analytics:read
analytics.clicksGET /v1/projects/{project}/analytics/clickssecret key or user session · analytics:read
analytics.videosGET /v1/projects/{project}/analytics/videossecret key or user session · analytics:read
analytics.videoRetentionGET /v1/projects/{project}/analytics/videos/{video}/retentionsecret key or user session · analytics:read
analytics.answersGET /v1/projects/{project}/analytics/answerssecret key or user session · analytics:read
analytics.flowGET /v1/projects/{project}/analytics/flowsecret key or user session · analytics:read
analytics.goalsGET /v1/projects/{project}/analytics/goalssecret key or user session · analytics:read
analytics.filterOptionsGET /v1/projects/{project}/analytics/filter-optionssecret key or user session · analytics:read
analytics.eventsGET /v1/projects/{project}/analytics/eventssecret key or user session · analytics:read
sql.queryPOST /v1/projects/{project}/sqlsecret key or user session · analytics:read
schema.getGET /v1/projects/{project}/schemasecret key or user session · analytics:read

analytics.overview

GET /v1/projects/{project}/analytics/overview – KPIs, extras, time series, default funnel, previous-period comparison.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (Overview)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
bucket"hour" | "day" | "week"no
compare"0" | "1" | "true" | "false"no

analytics.timeseries

GET /v1/projects/{project}/analytics/timeseries – Zero-filled series of sessions, visitors, pageviews, conversions.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
bucket"hour" | "day" | "week"no

analytics.funnel

GET /v1/projects/{project}/analytics/funnel – Funnel steps (default funnel or ?funnel=<key>).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
funnelstringno

analytics.breakdown

GET /v1/projects/{project}/analytics/breakdown – Full session aggregate per value of a dimension.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (Breakdown)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
dimension"channel" | "utm_source" | "utm_medium" | "utm_campaign" | "utm_content" | "utm_term" | "utm_id" | "ref_host" | "entry_page" | "entry_group" | "variant" | "device" | "browser" | "os" | "country" | "lang" | "exit_page" | "exit_group" | "entry_host" | "screen" | "stitch" | "attr_from" | "click_id" | "converted" | "quiz_answers" | "consent" | "relevance_tier" | "goal" | "ad_platform" | "ad_campaign" | "ad_adset" | "ad" | "day" | "week" | "month" | "hour_of_day" | "weekday"yes
sortstringno
dir"asc" | "desc"no
limitstringno
min_sessionsstringno

analytics.relevanceRanking

GET /v1/projects/{project}/analytics/relevance-ranking – Rank values of a dimension by relevance (default utm_campaign).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (RelevanceRanking)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
dimension"channel" | "utm_source" | "utm_medium" | "utm_campaign" | "utm_content" | "utm_term" | "utm_id" | "ref_host" | "entry_page" | "entry_group" | "variant" | "device" | "browser" | "os" | "country" | "lang"no
sort"avg" | "hot" | "hot_rate" | "engaged_rate" | "sessions"no
min_sessionsstringno
limitstringno

analytics.pages

GET /v1/projects/{project}/analytics/pages – Pages: pageviews, sessions, entries, exits, engagement, scroll, fold-only, clicks, video.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
limitstringno

analytics.scroll

GET /v1/projects/{project}/analytics/scroll – Scroll curve, fold-only rate, fold share, milestones (restored scroll positions excluded).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match

analytics.sections

GET /v1/projects/{project}/analytics/sections – Section reach per page.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
limitstringno

analytics.engagement

GET /v1/projects/{project}/analytics/engagement – Engaged-time distribution per pageview or session.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
level"pageview" | "session"no

analytics.clicks

GET /v1/projects/{project}/analytics/clicks – Top clicks by label/kind/tag/href/section.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
limitstringno

analytics.videos

GET /v1/projects/{project}/analytics/videos – Video plays, start rate, watched time, coverage, completion, retention.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match

analytics.videoRetention

GET /v1/projects/{project}/analytics/videos/{video}/retention – Downsampled retention curve of one video, overall and per format.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
videostringyes

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
stepstringno

analytics.answers

GET /v1/projects/{project}/analytics/answers – Questionnaire (quiz) funnel and option distribution per question.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
questionnairestringno

analytics.flow

GET /v1/projects/{project}/analytics/flow – Entry pages, exit pages and page transitions.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
limitstringno

analytics.goals

GET /v1/projects/{project}/analytics/goals – Goal completions (sessions, rate, value).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match

analytics.filterOptions

GET /v1/projects/{project}/analytics/filter-options – Top values per filter dimension for the date range.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (FilterOptions)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match

analytics.events

GET /v1/projects/{project}/analytics/events – Raw events with session context (names, prop containment, prop text search).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (EventsQueryResult)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
namesstring | string[]no
propsstringno
prop_keystringno
prop_textstringno
session_idstringno
order"asc" | "desc"no
limitstringno

sql.query

POST /v1/projects/{project}/sql – Read-only SQL over the project's analytics tables (one SELECT/WITH, row-level isolated).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (SqlResult)
  • Body: application/json

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Body fields:

NameTypeRequiredDescription
querystringyes
maxRowsintno

schema.get

GET /v1/projects/{project}/schema – Tables and columns available to SQL, filter semantics, conventions.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (SchemaDoc)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Sessions

OperationEndpointAuth
sessions.listGET /v1/projects/{project}/sessionssecret key or user session · analytics:read
sessions.getGET /v1/projects/{project}/sessions/{sessionId}secret key or user session · analytics:read

sessions.list

GET /v1/projects/{project}/sessions – Sessions explorer (sortable, paginated).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (SessionList)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
sort"started_at" | "relevance" | "engaged" | "pages" | "clicks" | "scroll" | "video"no
dir"asc" | "desc"no
limitstringno
offsetstringno

sessions.get

GET /v1/projects/{project}/sessions/{sessionId} – One session: attribution, relevance breakdown, pageviews with merged timeline, conversions, leads.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (SessionDetail)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
sessionIdstringyes

Query parameters:

NameTypeRequiredDescription
sections"0" | "1" | "true" | "false"no
locale"en" | "de"no

Goals & funnels

OperationEndpointAuth
goals.listGET /v1/projects/{project}/goalssecret key or user session · analytics:read
goals.createPOST /v1/projects/{project}/goalssecret key or user session · config:write
goals.updatePATCH /v1/projects/{project}/goals/{key}secret key or user session · config:write
goals.deleteDELETE /v1/projects/{project}/goals/{key}secret key or user session · config:write
funnels.listGET /v1/projects/{project}/funnelssecret key or user session · analytics:read
funnels.createPOST /v1/projects/{project}/funnelssecret key or user session · config:write
funnels.updatePATCH /v1/projects/{project}/funnels/{key}secret key or user session · config:write
funnels.deleteDELETE /v1/projects/{project}/funnels/{key}secret key or user session · config:write
questionnaires.listGET /v1/projects/{project}/questionnairessecret key or user session · analytics:read
questionnaires.upsertPUT /v1/projects/{project}/questionnaires/{id}secret key or user session · config:write
questionnaires.deleteDELETE /v1/projects/{project}/questionnaires/{id}secret key or user session · config:write

goals.list

GET /v1/projects/{project}/goals – Goals.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
archived"0" | "1" | "true" | "false"no

goals.create

POST /v1/projects/{project}/goals – Create a goal (bumps goalsVersion → sessions are recomputed in the background).

  • Auth: secret key or user session · config:write
  • Response: 201 JSON (Goal)
  • Body: application/json (GoalWrite)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

goals.update

PATCH /v1/projects/{project}/goals/{key} – Update a goal.

  • Auth: secret key or user session · config:write
  • Response: 200 JSON (Goal)
  • Body: application/json

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
keystringyes

Body fields:

NameTypeRequiredDescription
namestringno
matchobjectno
isConversionbooleanno
valuenumber | nullno
sortintno
archivedbooleanno

goals.delete

DELETE /v1/projects/{project}/goals/{key} – Delete a goal.

  • Auth: secret key or user session · config:write
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
keystringyes

funnels.list

GET /v1/projects/{project}/funnels – Funnel definitions.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

funnels.create

POST /v1/projects/{project}/funnels – Create a funnel.

  • Auth: secret key or user session · config:write
  • Response: 201 JSON (Funnel)
  • Body: application/json (FunnelWrite)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

funnels.update

PATCH /v1/projects/{project}/funnels/{key} – Update a funnel.

  • Auth: secret key or user session · config:write
  • Response: 200 JSON (Funnel)
  • Body: application/json

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
keystringyes

Body fields:

NameTypeRequiredDescription
namestringno
mode"independent" | "sequential"no
stepsobject[]no
isDefaultbooleanno
sortintno

funnels.delete

DELETE /v1/projects/{project}/funnels/{key} – Delete a funnel.

  • Auth: secret key or user session · config:write
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
keystringyes

questionnaires.list

GET /v1/projects/{project}/questionnaires – Questionnaire (quiz) definitions.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

questionnaires.upsert

PUT /v1/projects/{project}/questionnaires/{id} – Create or replace a questionnaire (validates quiz_answer events, labels answer analytics).

  • Auth: secret key or user session · config:write
  • Response: 200 JSON (Questionnaire)
  • Body: application/json

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
idstringyes

Body fields:

NameTypeRequiredDescription
labelstring | objectyes
questionsobject[]yes

questionnaires.delete

DELETE /v1/projects/{project}/questionnaires/{id} – Delete a questionnaire.

  • Auth: secret key or user session · config:write
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
idstringyes

Relevance

OperationEndpointAuth
relevance.getGET /v1/projects/{project}/relevancesecret key or user session · analytics:read
relevance.updatePUT /v1/projects/{project}/relevancesecret key or user session · config:write
relevance.previewPOST /v1/projects/{project}/relevance/previewsecret key or user session · analytics:read
relevance.rescorePOST /v1/projects/{project}/relevance/rescoresecret key or user session · config:write

relevance.get

GET /v1/projects/{project}/relevance – Active relevance model, version history and rescoring progress.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (RelevanceState)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

relevance.update

PUT /v1/projects/{project}/relevance – Save a new relevance model version (all sessions are rescored retroactively).

  • Auth: secret key or user session · config:write
  • Response: 200 JSON (RelevanceState)
  • Body: application/json

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Body fields:

NameTypeRequiredDescription
configobjectyes
notestringno

relevance.preview

POST /v1/projects/{project}/relevance/preview – Score distribution of a proposed model on recent sessions (nothing is stored).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (RelevancePreview)
  • Body: application/json

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Body fields:

NameTypeRequiredDescription
configobjectyes
sampleintno

relevance.rescore

POST /v1/projects/{project}/relevance/rescore – Run a rescoring chunk now (normally done by the scheduler).

  • Auth: secret key or user session · config:write
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Conversions

OperationEndpointAuth
conversions.listGET /v1/projects/{project}/conversionssecret key or user session · conversions:read
conversions.createPOST /v1/projects/{project}/conversionssecret key or user session · conversions:write · Idempotency-Key
conversions.getGET /v1/projects/{project}/conversions/{id}secret key or user session · conversions:read
conversions.retryPOST /v1/projects/{project}/conversions/{id}/retrysecret key or user session · conversions:write
conversions.updateStatusPATCH /v1/projects/{project}/conversions/{id}/statussecret key or user session · conversions:write
conversions.beaconPOST /v1/cbpublishable key (pk_3x_…)
conversions.googleAdsFeedGET /v1/projects/{project}/feeds/google-ads.csvpublic
conversionDefinitions.listGET /v1/projects/{project}/conversion-definitionssecret key or user session · conversions:read
conversionDefinitions.upsertPUT /v1/projects/{project}/conversion-definitions/{key}secret key or user session · conversions:write + config:write
conversionDefinitions.deleteDELETE /v1/projects/{project}/conversion-definitions/{key}secret key or user session · conversions:write + config:write
destinations.listGET /v1/projects/{project}/destinationssecret key or user session · conversions:read
destinations.updatePUT /v1/projects/{project}/destinations/{provider}secret key or user session · project:admin · sudo
destinations.testPOST /v1/projects/{project}/destinations/{provider}/testsecret key or user session · project:admin

conversions.list

GET /v1/projects/{project}/conversions – Conversions with per-provider upload status (never hashes, IP, user agent).

  • Auth: secret key or user session · conversions:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
status"held" | "pending" | "uploaded" | "skipped"no
source"quiz" | "booking" | "whatsapp_manual" | "manual" | "event" | "goal" | "lead" | "api"no
definitionstringno
session_idstringno
provider"meta" | "linkedin" | "google_ads" | "tiktok"no
provider_status"pending" | "uploaded" | "feed" | "failed" | "skipped" | "not_configured" | "dry_run" | "error"no
daysstringno
include_test"0" | "1" | "true" | "false"no
limitstringno
cursorstringno

conversions.create

POST /v1/projects/{project}/conversions – Record a conversion and upload it to the configured destinations.

sessionId (from the browser's getIds()) or match {at, windowMinutes, …} to find the session; contact data is hashed on receipt. Ambiguous matches return ≤ 10 candidates. Idempotent via eventId and the Idempotency-Key header.

  • Auth: secret key or user session · conversions:write · Idempotency-Key
  • Response: 200 JSON (ConversionCreateResult)
  • Body: application/json (ConversionCreate)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

conversions.get

GET /v1/projects/{project}/conversions/{id} – One conversion.

  • Auth: secret key or user session · conversions:read
  • Response: 200 JSON (Conversion)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
idstringyes

conversions.retry

POST /v1/projects/{project}/conversions/{id}/retry – Retry uploads (default: every provider not uploaded/feed); force resets attempts.

  • Auth: secret key or user session · conversions:write
  • Response: 200 JSON (Conversion)
  • Body: application/json (ConversionRetry)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
idstringyes

conversions.updateStatus

PATCH /v1/projects/{project}/conversions/{id}/status – Manual bookkeeping of conversion/provider status.

  • Auth: secret key or user session · conversions:write
  • Response: 200 JSON (Conversion)
  • Body: application/json (ConversionStatusUpdate)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
idstringyes

conversions.beacon

POST /v1/cb – Browser conversion beacon (booking parity): allowed origins only, ≤ 4 KB, 4/min/IP, one per session and definition.

  • Auth: publishable key (pk_3x_…)
  • Response: 202, no body
  • Body: text/plain

Body fields:

NameTypeRequiredDescription
kstringyes
definitionstringyes
eventIdstringyes
sidstring | nullyes
pvstring | nullyes
urlstring | nullyes
attrobject | nullyes
testbooleanyes
emstringno
emgstringno
fnstringno
lnstringno
phstringno
fbpstringno
fbcstringno
ttpstringno

conversions.googleAdsFeed

GET /v1/projects/{project}/feeds/google-ads.csv – Google Ads scheduled-upload CSV (HTTP Basic with the feed credentials; last 60 days).

  • Auth: public
  • Response: 200 csv

Path parameters:

NameTypeRequiredDescription
projectstringyes

Query parameters:

NameTypeRequiredDescription
sourcestringno
definitionstringno

conversionDefinitions.list

GET /v1/projects/{project}/conversion-definitions – Conversion definitions (trigger → provider events).

  • Auth: secret key or user session · conversions:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

conversionDefinitions.upsert

PUT /v1/projects/{project}/conversion-definitions/{key} – Create or replace a conversion definition.

  • Auth: secret key or user session · conversions:write + config:write
  • Response: 200 JSON (ConversionDefinition)
  • Body: application/json (ConversionDefinitionWrite)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
keystringyes

conversionDefinitions.delete

DELETE /v1/projects/{project}/conversion-definitions/{key} – Delete a conversion definition (existing conversions keep it as text).

  • Auth: secret key or user session · conversions:write + config:write
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
keystringyes

destinations.list

GET /v1/projects/{project}/destinations – Conversion destinations (Meta, LinkedIn, Google Ads, TikTok) – secrets are never returned.

  • Auth: secret key or user session · conversions:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

destinations.update

PUT /v1/projects/{project}/destinations/{provider} – Configure a destination (settings, encrypted secrets, transport direct/composio/feed, mode).

  • Auth: secret key or user session · project:admin · sudo
  • Response: 200 JSON (Destination)
  • Body: application/json (DestinationWrite)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
provider"meta" | "linkedin" | "google_ads" | "tiktok"yes

destinations.test

POST /v1/projects/{project}/destinations/{provider}/test – Send a test event (Meta test_event_code, Google validateOnly, LinkedIn/TikTok validation).

  • Auth: secret key or user session · project:admin
  • Response: 200 JSON (DestinationTestResult)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
provider"meta" | "linkedin" | "google_ads" | "tiktok"yes

Leads

OperationEndpointAuth
leads.listGET /v1/projects/{project}/leadssecret key or user session · leads:read
leads.getGET /v1/projects/{project}/leads/{id}secret key or user session · leads:read
leads.createPOST /v1/projects/{project}/leadssecret key or user session · leads:write · Idempotency-Key
leads.deleteDELETE /v1/projects/{project}/leads/{id}secret key or user session · leads:write
leads.exportGET /v1/projects/{project}/leads.csvsecret key or user session · leads:read

leads.list

GET /v1/projects/{project}/leads – Leads (personal data).

  • Auth: secret key or user session · leads:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
daysstringno
formstringno
source"identify" | "api" | "import"no
include_test"0" | "1" | "true" | "false"no
include_spam"0" | "1" | "true" | "false"no
limitstringno
cursorstringno

leads.get

GET /v1/projects/{project}/leads/{id} – One lead.

  • Auth: secret key or user session · leads:read
  • Response: 200 JSON (Lead)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
idstringyes

leads.create

POST /v1/projects/{project}/leads – Record a lead from the site's server (optionally with a conversion).

  • Auth: secret key or user session · leads:write · Idempotency-Key
  • Response: 201 JSON
  • Body: application/json (LeadCreate)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

leads.delete

DELETE /v1/projects/{project}/leads/{id} – Erase a lead (GDPR); linked conversions lose their hashed identifiers.

  • Auth: secret key or user session · leads:write
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
idstringyes

leads.export

GET /v1/projects/{project}/leads.csv – CSV export of leads.

  • Auth: secret key or user session · leads:read
  • Response: 200 csv

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
daysstringno
include_test"0" | "1" | "true" | "false"no
include_spam"0" | "1" | "true" | "false"no

Ads

OperationEndpointAuth
ads.connections.listGET /v1/projects/{project}/ad-connectionssecret key or user session · ads:read
ads.connections.createPOST /v1/projects/{project}/ad-connectionsdashboard user session · ads:write · sudo
ads.connections.completePOST /v1/projects/{project}/ad-connections/{id}/completedashboard user session · ads:write
ads.connections.discoverGET /v1/projects/{project}/ad-connections/{id}/accountssecret key or user session · ads:write
ads.connections.deleteDELETE /v1/projects/{project}/ad-connections/{id}secret key or user session · ads:write · sudo
ads.accounts.listGET /v1/projects/{project}/ad-accountssecret key or user session · ads:read
ads.accounts.selectPUT /v1/projects/{project}/ad-accountssecret key or user session · ads:write
ads.sync.runPOST /v1/projects/{project}/ads/syncsecret key or user session · ads:write
ads.sync.runsGET /v1/projects/{project}/ads/sync-runssecret key or user session · ads:read
ads.reportGET /v1/projects/{project}/ads/reportsecret key or user session · ads:read
ads.timeseriesGET /v1/projects/{project}/ads/timeseriessecret key or user session · ads:read
ads.unmatchedGET /v1/projects/{project}/ads/unmatchedsecret key or user session · ads:read
ads.entitiesGET /v1/projects/{project}/ads/entitiessecret key or user session · ads:read
ads.mappingRules.listGET /v1/projects/{project}/ads/mapping-rulessecret key or user session · ads:read
ads.mappingRules.createPOST /v1/projects/{project}/ads/mapping-rulessecret key or user session · ads:write
ads.mappingRules.deleteDELETE /v1/projects/{project}/ads/mapping-rules/{id}secret key or user session · ads:write
ads.utmTemplatesGET /v1/projects/{project}/ads/utm-templatessecret key or user session · ads:read
ads.orgConnections.listGET /v1/orgs/{org}/ad-connectionssecret key or user session · org:admin
ads.orgConnections.createPOST /v1/orgs/{org}/ad-connectionsdashboard user session · org:admin · sudo
ads.orgConnections.completePOST /v1/orgs/{org}/ad-connections/{id}/completedashboard user session · org:admin
ads.orgConnections.discoverGET /v1/orgs/{org}/ad-connections/{id}/accountssecret key or user session · org:admin
ads.orgConnections.deleteDELETE /v1/orgs/{org}/ad-connections/{id}dashboard user session · org:admin · sudo
ads.webhookPOST /v1/webhooks/composiowebhook signature

ads.connections.list

GET /v1/projects/{project}/ad-connections – Ad-platform connections of the project.

  • Auth: secret key or user session · ads:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

ads.connections.create

POST /v1/projects/{project}/ad-connections – Start connecting an ad platform (returns the hosted OAuth URL, valid 10 minutes).

  • Auth: dashboard user session · ads:write · sudo
  • Response: 201 JSON (AdConnectionStarted)
  • Body: application/json (AdConnectionCreate)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

ads.connections.complete

POST /v1/projects/{project}/ad-connections/{id}/complete – Finish the OAuth callback (nonce + connected account verified) and discover ad accounts.

  • Auth: dashboard user session · ads:write
  • Response: 200 JSON
  • Body: application/json (AdConnectionComplete)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
idstringyes

ads.connections.discover

GET /v1/projects/{project}/ad-connections/{id}/accounts – Ad accounts reachable through a connection.

  • Auth: secret key or user session · ads:write
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
idstringyes

ads.connections.delete

DELETE /v1/projects/{project}/ad-connections/{id} – Disconnect (revoke at Composio); cost data is kept unless purge=true.

  • Auth: secret key or user session · ads:write · sudo
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
idstringyes

Query parameters:

NameTypeRequiredDescription
purge"true" | "false"no

ads.accounts.list

GET /v1/projects/{project}/ad-accounts – Ad accounts assigned to the project.

  • Auth: secret key or user session · ads:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

ads.accounts.select

PUT /v1/projects/{project}/ad-accounts – Assign ad accounts of a connection to the project (starts a 90-day backfill).

  • Auth: secret key or user session · ads:write
  • Response: 200 JSON
  • Body: application/json (AdAccountsSelect)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

ads.sync.run

POST /v1/projects/{project}/ads/sync – Queue a sync (entities, metrics, Google click_view, backfill, session matching).

  • Auth: secret key or user session · ads:write
  • Response: 202 JSON
  • Body: application/json (AdSyncRequest)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

ads.sync.runs

GET /v1/projects/{project}/ads/sync-runs – Recent sync runs and their status.

  • Auth: secret key or user session · ads:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
limitstringno
platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no

ads.report

GET /v1/projects/{project}/ads/report – Spend × sessions × conversions: CPC, cost per session, cost per relevant session, CPL, ROAS.

  • Auth: secret key or user session · ads:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
level"platform" | "campaign" | "adset" | "ad"no
sortstringno
dir"asc" | "desc"no
limitstringno
relevant_minstringno

ads.timeseries

GET /v1/projects/{project}/ads/timeseries – Daily/weekly spend next to sessions, relevant sessions and conversions.

  • Auth: secret key or user session · ads:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
bucket"day" | "week"no

ads.unmatched

GET /v1/projects/{project}/ads/unmatched – Paid sessions whose UTMs could not be tied to an ad entity (for manual mapping).

  • Auth: secret key or user session · ads:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
fromstringnoStart day YYYY-MM-DD (project time zone, inclusive). Wins over preset.
tostringnoEnd day YYYY-MM-DD (inclusive). Default today.
preset"today" | "yesterday" | "7d" | "14d" | "30d" | "90d" | "365d" | "this_month" | "last_month" | "all"noDate range when from/to are absent. Default 30d; all = last 731 days.
pagestringnoCanonical page path, e.g. /pricing
page_groupstringnoPage group key from the project config
page_mode"any" | "entry" | "exit"noSession metrics: any = a pageview on page/page_group (default), entry = entered there, exit = left there
channel"google_ads" | "google_organic" | "bing" | "search_other" | "meta" | "linkedin" | "tiktok" | "social_other" | "email" | "ai_assistant" | "referral" | "direct" | "other"no
utm_sourcestringno
utm_mediumstringno
utm_campaignstringno
utm_contentstringno
utm_termstringno
utm_idstringno
ref_hoststringnoEntry referrer host, e.g. www.google.com
variantstringnoPage variant of the entry pageview
device"mobile" | "tablet" | "desktop" | "unknown"no
browser"chrome" | "safari" | "firefox" | "edge" | "samsung" | "opera" | "other"no
os"windows" | "macos" | "ios" | "android" | "linux" | "chromeos" | "other"no
countrystringnoISO country code, uppercase
langstringno
screen"xs" | "sm" | "md" | "lg" | "xl"no
converted"0" | "1" | "true" | "false"no
hasstring | string[]no
goalstring | string[]no
eventstring | string[]no
click_id"any" | "none" | "gclid" | "gbraid" | "wbraid" | "fbclid" | "li_fat_id" | "ttclid" | "msclkid"noany/none or a specific click id present on the session
traffic"paid" | "organic"nopaid = an ad click id or a paid utm_medium (cpc, paid, …) on the session; organic = neither
stitch"new" | "memory" | "storage" | "hash"no
consent"0" | "1" | "true" | "false"no
include_test"0" | "1" | "true" | "false"no
min_relevancestringno
max_relevancestringno
relevance_tierstringnoTier key, e.g. hot
ad_platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
ad_account_idstringno
ad_campaign_idstringno
ad_adset_idstringno
ad_idstringno
ad_match"matched" | "unmatched"noSessions with/without an ad-entity match
limitstringno

ads.entities

GET /v1/projects/{project}/ads/entities – Synced campaigns, ad sets and ads (search by name/id).

  • Auth: secret key or user session · ads:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
platform"google_ads" | "meta_ads" | "linkedin_ads" | "tiktok_ads"no
level"campaign" | "adset" | "ad"no
qstringno
limitstringno

ads.mappingRules.list

GET /v1/projects/{project}/ads/mapping-rules – Manual UTM → ad entity mapping rules.

  • Auth: secret key or user session · ads:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

ads.mappingRules.create

POST /v1/projects/{project}/ads/mapping-rules – Create a mapping rule (sessions are re-matched in the background).

  • Auth: secret key or user session · ads:write
  • Response: 201 JSON (AdMappingRule)
  • Body: application/json (AdMappingRuleWrite)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

ads.mappingRules.delete

DELETE /v1/projects/{project}/ads/mapping-rules/{id} – Delete a mapping rule.

  • Auth: secret key or user session · ads:write
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
idstringyes

ads.utmTemplates

GET /v1/projects/{project}/ads/utm-templates – Recommended ID-based UTM templates per platform.

  • Auth: secret key or user session · ads:read
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

ads.orgConnections.list

GET /v1/orgs/{org}/ad-connections – Org-level ad-platform connections (usable by every project of the organization).

  • Auth: secret key or user session · org:admin
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
orgstringyes

ads.orgConnections.create

POST /v1/orgs/{org}/ad-connections – Start an org-level ad-platform connection (returns the hosted OAuth URL, valid 10 minutes).

  • Auth: dashboard user session · org:admin · sudo
  • Response: 201 JSON (AdConnectionStarted)
  • Body: application/json (AdConnectionCreate)

Path parameters:

NameTypeRequiredDescription
orgstringyes

ads.orgConnections.complete

POST /v1/orgs/{org}/ad-connections/{id}/complete – Finish the OAuth callback of an org-level connection and discover ad accounts.

  • Auth: dashboard user session · org:admin
  • Response: 200 JSON
  • Body: application/json (AdConnectionComplete)

Path parameters:

NameTypeRequiredDescription
orgstringyes
idstringyes

ads.orgConnections.discover

GET /v1/orgs/{org}/ad-connections/{id}/accounts – Ad accounts reachable through an org-level connection.

  • Auth: secret key or user session · org:admin
  • Response: 200 JSON

Path parameters:

NameTypeRequiredDescription
orgstringyes
idstringyes

ads.orgConnections.delete

DELETE /v1/orgs/{org}/ad-connections/{id} – Disconnect an org-level connection (its accounts are removed from every project); cost data is kept unless purge=true.

  • Auth: dashboard user session · org:admin · sudo
  • Response: 204, no body

Path parameters:

NameTypeRequiredDescription
orgstringyes
idstringyes

Query parameters:

NameTypeRequiredDescription
purge"true" | "false"no

ads.webhook

POST /v1/webhooks/composio – Composio webhook (connected account expired/activated); signature verified.

  • Auth: webhook signature
  • Response: 204, no body

Setup

OperationEndpointAuth
setup.frameworksGET /v1/setup/frameworkspublic
setup.detectPOST /v1/setup/detectpublic
setup.instructionsGET /v1/setup/instructionspublic
setup.snippetGET /v1/projects/{project}/setup/snippetsecret key or user session · project:admin
setup.verifyPOST /v1/projects/{project}/setup/verifysecret key or user session · project:admin
setup.statusGET /v1/projects/{project}/setup/statussecret key or user session · analytics:read
setup.progressPATCH /v1/projects/{project}/setupsecret key or user session · analytics:read
setup.installationGET /v1/projects/{project}/setup/installationsecret key or user session · analytics:read
setup.promptsGET /v1/projects/{project}/setup/promptssecret key or user session · analytics:read
setup.promptGET /v1/projects/{project}/setup/prompts/{kind}secret key or user session · analytics:read
setup.testConversionPOST /v1/projects/{project}/setup/test-conversionsecret key or user session · project:admin
setup.mcpActivityGET /v1/projects/{project}/setup/mcp-activitysecret key or user session · analytics:read
setup.detectStackPOST /v1/projects/{project}/setup/detect-stacksecret key or user session · analytics:read

setup.frameworks

GET /v1/setup/frameworks – Supported frameworks and proxy options.

  • Auth: public
  • Response: 200 JSON

setup.detect

POST /v1/setup/detect – Detect framework/router/proxy option from package.json dependencies and a file list.

  • Auth: public
  • Response: 200 JSON (DetectStackResult)
  • Body: application/json (DetectStackInput)

setup.instructions

GET /v1/setup/instructions – Ordered install steps (files, code, env vars, commands) for a framework.

  • Auth: public
  • Response: 200 JSON (SetupInstructions)

Query parameters:

NameTypeRequiredDescription
framework"next-app" | "next-pages" | "react-vite" | "astro" | "wordpress" | "webflow-html" | "shopify" | "other"yes
proxy"route-handler" | "cloudflare-worker" | "nginx" | "netlify" | "wordpress" | "cname" | "none"no
consent"none" | "custom" | "cookiebot" | "usercentrics" | "complianz" | "borlabs" | "google_consent_mode"no
typescript"true" | "false"no
projectstringno

setup.snippet

GET /v1/projects/{project}/setup/snippet – Install code with the project's real publishable key, API origin and proxy path.

  • Auth: secret key or user session · project:admin
  • Response: 200 JSON (SetupInstructions)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
framework"next-app" | "next-pages" | "react-vite" | "astro" | "wordpress" | "webflow-html" | "shopify" | "other"yes
proxy"route-handler" | "cloudflare-worker" | "nginx" | "netlify" | "wordpress" | "cname" | "none"no
consent"none" | "custom" | "cookiebot" | "usercentrics" | "complianz" | "borlabs" | "google_consent_mode"no
typescript"true" | "false"no

setup.verify

POST /v1/projects/{project}/setup/verify – Verify an installation: fetch the page (SSRF-guarded), check snippet/proxy/CSP, look for recent events.

  • Auth: secret key or user session · project:admin
  • Response: 200 JSON (VerifyInstallationResult)
  • Body: application/json (VerifyInstallationInput)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

setup.status

GET /v1/projects/{project}/setup/status – Onboarding status per step, derived from real data (tracking, goals, ad platforms, conversions, Claude/MCP, team).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (SetupStatus)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

setup.progress

PATCH /v1/projects/{project}/setup – Wizard position, dismissal and manual step overrides (skip, re-open, team done).

Each key in steps needs one of the step's scopes (goals: config:write, ads: ads:write, conversions: project:admin, ai: analytics:read, team: org:admin); dismissed needs project:admin; lastStep alone needs analytics:read. Returns the fresh status.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (SetupStatus)
  • Body: application/json (SetupProgressUpdate)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

setup.installation

GET /v1/projects/{project}/setup/installation – Live installation check: hosts seen, SDK version, proxy, consent, custom events, last verification (test traffic included).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (SetupInstallation)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
sincestringno

setup.prompts

GET /v1/projects/{project}/setup/prompts – Ready-made Claude Code prompts for this project (titles and descriptions).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (SetupPromptList)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
locale"de" | "en"no

setup.prompt

GET /v1/projects/{project}/setup/prompts/{kind} – One project-specific Claude Code prompt (never contains secrets).

Kinds install, events and server_conversions need config:write or project:admin; mcp_analysis, troubleshoot and connection_test need analytics:read.

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (SetupPrompt)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)
kind"install" | "events" | "server_conversions" | "mcp_analysis" | "troubleshoot" | "connection_test"yes

Query parameters:

NameTypeRequiredDescription
stack"next-app" | "next-pages" | "react-vite" | "astro" | "wordpress" | "webflow-html" | "shopify" | "other" | "auto"no
site_urlstringno
proxy"auto" | "on" | "off"no
locale"de" | "en"no

setup.testConversion

POST /v1/projects/{project}/setup/test-conversion – Send one synthetic test conversion to a configured provider in its test mode and return the provider's answer.

  • Auth: secret key or user session · project:admin
  • Response: 200 JSON (SetupTestConversionResult)
  • Body: application/json (SetupTestConversion)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

setup.mcpActivity

GET /v1/projects/{project}/setup/mcp-activity – Newest MCP calls for this project (Claude connection test).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (SetupMcpActivity)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Query parameters:

NameTypeRequiredDescription
limitstringno

setup.detectStack

POST /v1/projects/{project}/setup/detect-stack – Guess the website's stack from its HTML (SSRF-guarded fetch of an allowed origin).

  • Auth: secret key or user session · analytics:read
  • Response: 200 JSON (SetupDetectStackResult)
  • Body: application/json (SetupDetectStack)

Path parameters:

NameTypeRequiredDescription
projectstringyesProject id, project-slug or org-slug/project-slug (URL-encode the slash as %2F)

Docs

OperationEndpointAuth
docs.openapiGET /v1/openapi.jsonpublic
docs.listGET /v1/docspublic
docs.searchGET /v1/docs/searchpublic
docs.getGET /v1/docs/{slug}public
docs.getMarkdownGET /v1/docs/{slug}.mdpublic
docs.referenceGET /docs/apipublic
docs.referenceMarkdownGET /docs/api.mdpublic
docs.llmsGET /llms.txtpublic
docs.llmsFullGET /llms-full.txtpublic

docs.openapi

GET /v1/openapi.json – OpenAPI 3.1 document.

  • Auth: public
  • Response: 200 JSON

docs.list

GET /v1/docs – Documentation index.

  • Auth: public
  • Response: 200 JSON

docs.search

GET /v1/docs/search – Full-text search over guides and the API reference.

  • Auth: public
  • Response: 200 JSON

Query parameters:

NameTypeRequiredDescription
qstringyes
limitstringno

docs.get

GET /v1/docs/{slug} – One guide as markdown (slug with slashes URL-encoded or as path segments).

  • Auth: public
  • Response: 200 JSON (Doc)

Path parameters:

NameTypeRequiredDescription
slugstringyes

docs.getMarkdown

GET /v1/docs/{slug}.md – One guide as raw markdown (links point to other .md guides).

  • Auth: public
  • Response: 200 markdown

Path parameters:

NameTypeRequiredDescription
slugstringyes

docs.reference

GET /docs/api – Interactive API reference (Scalar) rendered from the OpenAPI document.

  • Auth: public
  • Response: 200 html

docs.referenceMarkdown

GET /docs/api.md – API reference as markdown (every endpoint with auth, scopes, parameters).

  • Auth: public
  • Response: 200 markdown

docs.llms

GET /llms.txt – llms.txt index of the documentation (https://llmstxt.org).

  • Auth: public
  • Response: 200 text

docs.llmsFull

GET /llms-full.txt – Every guide concatenated as markdown, for LLM context.

  • Auth: public
  • Response: 200 text