/sites/{siteId}/tag-eventsRead tag events
What actually fired on this site, newest first: page views, the events that occurred on them, the tags that ran and the requests those tags sent.
Auth header
Authorization: Bearer tsk_live_…The key needsmonitoring:read
Parameters
siteIdstringin pathrequiredThe site id, from GET /v1/sites.
fromstringin queryoptionalISO-8601. Inclusive lower bound on receivedAt.
tostringin queryoptionalISO-8601. Inclusive upper bound on receivedAt.
limitstringin queryoptionalRow cap. Capped by the service's own ceiling.
batchIdstringin queryoptionalOne page view's rows.
Example request
curl "https://app.tagsentry.ai/api/v1/sites/3f6c1b8e-2d4a-4c7e-9a51-0b8f2e6d7c10/tag-events" \ -H "Authorization: Bearer tsk_live_…"Response 200
dataarray of objectrequireddata[].idstringrequireddata[].siteIdstringrequireddata[].batchIdstringrequiredOne page view. Rows sharing a batchId happened on the same page.
data[].seqintegerrequiredOrder within the batch. Seq 0 is always the batch row.
data[].kindstringrequiredbatch | tag | event | request
data[].receivedAtstringrequiredOur clock. The only orderable time here -- a client's is never trusted.
data[].pageMsinteger | nullrequireddata[].subjectIdstring | nullrequiredPresent on the batch row only. Links the page view to the consent decision that permitted it.
data[].containerIdstring | nullrequireddata[].tagIdstring | nullrequireddata[].statusstring | nullrequireddata[].executionMsinteger | nullrequireddata[].eventNamestring | nullrequireddata[].ordinalinteger | nullrequireddata[].hoststring | nullrequireddata[].originstring | nullrequireddata[].pathstring | nullrequireddata[].initiatorTypestring | nullrequireddata[].paramNamesarray of string | nullrequireddata[].occurrencesinteger | nullrequireddata[].transferBytesinteger | nullrequireddata[].durationMsinteger | nullrequireddata[].bufferedboolean | nullrequireddata[].truncatedboolean | nullrequiredlimitintegerrequiredThe row cap applied to the underlying read.
truncatedbooleanrequiredTrue when the read came back at its cap. When true, this page is NOT the whole answer -- narrow the window. Tag events are a time window, not a paged list.
truncationHintstringoptional
Example response
{ "data": [ { "id": "3f6c1b8e-2d4a-4c7e-9a51-0b8f2e6d7c10", "siteId": "3f6c1b8e-2d4a-4c7e-9a51-0b8f2e6d7c10", "batchId": "3f6c1b8e-2d4a-4c7e-9a51-0b8f2e6d7c10", "seq": 0, "kind": "…", "receivedAt": "2026-09-26T14:02:00.000Z", "pageMs": 0, "subjectId": "3f6c1b8e-2d4a-4c7e-9a51-0b8f2e6d7c10", "containerId": "3f6c1b8e-2d4a-4c7e-9a51-0b8f2e6d7c10", "tagId": "12", "status": "…", "executionMs": 0, "eventName": "…", "ordinal": 0, "host": "www.google-analytics.com", "origin": "…", "path": "…", "initiatorType": "…", "paramNames": [ "…" ], "occurrences": 0, "transferBytes": 0, "durationMs": 0, "buffered": false, "truncated": false } ], "limit": 50, "truncated": false, "truncationHint": "…"}More about this endpoint
Served from the site's own region -- see the X-TagSentry-Region response header.
This is a time WINDOW, not a paged list. If truncated is true the window was too wide and you are NOT looking at the whole answer; narrow from/to.
Zero events does not mean the snippet is not installed. Monitoring runs only after a consent decision that grants the category it rides on, so a correct install on a site whose visitors reject analytics reports zero forever, correctly. The only honest reading of zero is "we have not heard from it yet".
Errors400 · 401 · 403 · 404 · 500
400The request did not validate against this operation's schema.401Missing, malformed, unknown, revoked or expired API key. These are deliberately indistinguishable in the response -- distinguishing them would confirm to a caller that a token was once real.403The key authenticated but does not carry the scope(s) this operation requires, or (`domain_not_verified`) the site's domain is not verified, so its consent records are not released.404No such resource on this account. A site id belonging to a DIFFERENT account answers 404, never 403 -- a 403 would confirm the id exists somewhere.500Something failed on our side. The requestId in the body is what to quote.
Every error has the same body: { error: { code, message, requestId } }.
From the OpenAPI document, version 2026-08-26. Raw OpenAPI