API reference

Analytics

Consent rates and traffic over time.

  1. GET/v1/analytics/changes
  2. GET/v1/analytics/geo
  3. GET/v1/analytics/summary
  4. GET/v1/analytics/timeseries
  5. GET/v1/analytics/vitals
GET/v1/analytics/changes

Consent-rate drops this week, with what else happened at the time

Week on week, per domain, for domains with enough decisions in both weeks to compare. Each drop names a publish or a newly seen tracker in the same window where there was one — a correlation, not a cause, and the wording says so.

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Responses
StatusBodyWhen
200ConsentChangesDto
200 body · ConsentChangesDto
FieldTypeWhat it is
items requiredConsentChangeDto[]Biggest drop first. Empty for a workspace where nothing moved, which is most weeks.
items[].domainId requiredstring
items[].hostname requiredstring
items[].current requirednumberAccept rate this week and last, as whole percentages.
items[].previous requirednumber
items[].deltaPct requirednumberNegative for a drop, in whole percentage points.
items[].cause required"unknown" | "publish" | "new_tracker"What else happened in the same week: publish (a banner was published), new_tracker (a tracker was seen for the first time) or unknown (nothing we can name).
items[].causeDetail requiredstring | nullWhat happened in the same window, in a customer's words.
items[].causeAt requiredstring | null
items[].summary requiredstringThe finding as one sentence — the same wording the digest email uses.
thresholdPct requirednumberThe drop, in percentage points, that has to be exceeded before a week is reported.
GET/v1/analytics/geo

Consent decisions by country

Explicit decisions only. Decisions with no country are returned as unknown rather than dropped, so the percentages can be read honestly.

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Parameters
NameWhereTypeWhat it is
rangequery"24h" | "7d" | "30d"
domainIdquerystring (uuid)
Responses
StatusBodyWhen
200AnalyticsGeoDto
200 body · AnalyticsGeoDto
FieldTypeWhat it is
range required"24h" | "7d" | "30d"
located requirednumberDecisions we could attribute to a country.
unknown requirednumberDecisions with no country. Reported rather than hidden: consent geography drives which regime applies, so a reader has to know how much of the picture is missing before drawing a conclusion from the percentages.
countries requiredCountryConsentDto[]Descending by decisions.
countries[].iso requiredstringISO-3166-1 alpha-2, e.g. "DE".
countries[].name requiredstringEnglish country name, or the code itself when we do not have a name for it.
countries[].gdpr requiredbooleanWhether GDPR / UK-GDPR applies here — drives the compliance framing, not the count.
countries[].decisions requirednumberExplicit decisions from this country in the window.
countries[].acceptAll requirednumber
countries[].rejectAll requirednumber
countries[].custom requirednumber
countries[].acceptRate requirednumberaccept-all / decisions (%).
countries[].share requirednumberThis country's share of all located decisions (%).
GET/v1/analytics/summary

Consent figures for this workspace, or for one domain

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Parameters
NameWhereTypeWhat it is
rangequery"24h" | "7d" | "30d"
domainIdquerystring (uuid)
Responses
StatusBodyWhen
200AnalyticsSummaryDto
200 body · AnalyticsSummaryDto
FieldTypeWhat it is
range required"24h" | "7d" | "30d"
impressions requirednumberBanner impressions (shown events) — the denominator.
decisions requirednumberTotal explicit decisions (accept/reject/custom).
acceptAll requirednumber
rejectAll requirednumber
custom requirednumber
gpc requirednumberOpt-outs the browser sent, not the visitor — Global Privacy Control. Counted here and nowhere else. A GPC opt-out is binding in California, Colorado and Connecticut and belongs on this screen, but it has no impression behind it: adding it to decisions would make the consent rate a fraction whose numerator the denominator cannot contain, and a site with enough GPC traffic would report more than a hundred per cent of its banners answered.
acceptRate requirednumberaccept-all ÷ decisions (%). Banner decisions only — see gpc.
consentRate requirednumberdecisions ÷ impressions (%) — how many shown banners got a choice.
categories requiredCategoryOptInDto
categories.analytics requirednumberOpt-in rate (%) among decisions for each optional category.
categories.marketing requirednumber
categories.preferences requirednumber
GET/v1/analytics/timeseries

Consent metrics over time (zero-filled buckets)

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Parameters
NameWhereTypeWhat it is
rangequery"24h" | "7d" | "30d"
domainIdquerystring (uuid)
Responses
StatusBodyWhen
200AnalyticsTimeseriesDto
200 body · AnalyticsTimeseriesDto
FieldTypeWhat it is
range required"24h" | "7d" | "30d"
bucket required"day" | "hour"
points requiredConsentPointDto[]
points[].t requiredstringBucket start, ISO-8601 (UTC).
points[].total requirednumberImpressions in the bucket.
points[].accept requirednumber
points[].reject requirednumber
points[].custom requirednumber
points[].rate requirednumberaccept-all ÷ decisions in the bucket (%).
GET/v1/analytics/vitals

Real-user performance for one domain, day by day

The daily 75th percentile of LCP, INP and CLS as the site’s own visitors measured them, for up to 90 days, alongside our banner’s own CI-measured layout shift. Empty until the domain has real-user measurement switched on.

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Parameters
NameWhereTypeWhat it is
domainId requiredquerystring
Responses
StatusBodyWhen
200WebVitalsDto
200 body · WebVitalsDto
FieldTypeWhat it is
days requiredWebVitalsDayDto[]Oldest first, up to 90 days. Empty when the domain has no measurement switched on.
days[].day requiredstringUTC day, ISO date.
days[].p75Lcp requirednumberLargest Contentful Paint, milliseconds.
days[].p75Inp requirednumber | nullInteraction to Next Paint, milliseconds. Null where no browser reported one.
days[].p75Cls requirednumberCumulative Layout Shift.
days[].samples requirednumberPage views this is computed from — a p75 over nine visits is noise.
latest requiredWebVitalsDayDto | nullThe latest complete day, or null when nothing has been rolled up yet.
latest.day requiredstringUTC day, ISO date.
latest.p75Lcp requirednumberLargest Contentful Paint, milliseconds.
latest.p75Inp requirednumber | nullInteraction to Next Paint, milliseconds. Null where no browser reported one.
latest.p75Cls requirednumberCumulative Layout Shift.
latest.samples requirednumberPage views this is computed from — a p75 over nine visits is noise.
bannerCls requirednumberOur own banner's contribution to layout shift, measured in CI on every build. Shown beside the site's own number because "did your banner do this?" is the question the chart exists to answer.

Next groupPortfolio