List a site's engagement exposure events over a period
Returns the raw funnel events the dashboard's Exposures tab lists, newest first: a widget shown, a launcher shown, a conversation opened, a starter question shown, the resume button. This is a debug-grade view of single events, not a metric: read the Engagement report for aggregates. A row carries an opaque session id and, when one exists, the conversation id. The page has no total. A cursor is bound to the period, the device and the type it was issued for. `from` and `to` are required UTC days, at most 366 days apart.
Authorization
ApiKeyAuth A WorkOS org-scoped API key, created from the dashboard's organization settings page. Identifies the tenant every read and write is scoped to. Missing, malformed, unknown, revoked, expired, or non-organization-owned keys all return 401 (no distinction, so the response can't be used to probe which keys or org ids exist).
In: header
Path Parameters
The site id (prefixed site_). A site id that isn't yours is a 404, same as any other cross-tenant id.
Query Parameters
First UTC calendar day of the period, YYYY-MM-DD, included.
dateLast UTC calendar day of the period, YYYY-MM-DD, included. The period is at most 366 days.
dateOnly this device. One value: for several devices, make one call each.
Value in
- "desktop"
- "mobile"
- "tablet"
- "unknown"
Only events of this type.
Value in
- "exposure"
- "launcher_shown"
- "conversation_opened"
- "widget_shown"
- "widget_mount_unresolved"
- "widget_loaded"
- "widget_mounted"
- "starter_question_shown"
- "resume_button_shown"
- "resume_button_opened"
- "resume_button_hidden"
The meta.nextCursor of the previous page, with the same filters.
The page size, 1 to 100.
1 <= value <= 10050Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X GET "https://example.com/api/v1/sites/string/exposures?from=2019-08-24&to=2019-08-24"{ "data": [ { "id": "evt_01kvnwmagvf27rc9cze5rm9e1r", "type": "launcher_shown", "sessionId": "b6f0c2e4-2a57-4c3c-9b0e-1f4a7d2c8e11", "conversationId": null, "device": "mobile", "occurredAt": "2026-10-14T09:30:12.123Z" } ], "meta": { "nextCursor": null }}Get the label vocabulary
Returns the published label taxonomy: every label with its key, kind, block and allowed values, an English display name for each label, block and value, and the derived tokens. A token is `<key>:<value>`. The vocabulary is exactly the set of tokens the `labels.all`, `labels.any` and `labels.none` filters of the conversation collection accept, so build a filter from what you read here. The display names are English text for explaining a label to a person: match on `key` and on the tokens, never on a `displayName`. It needs a valid API key like every route and returns no tenant data: it is the same for every organization.
Check the tag now
Runs the tag check of the site now, as the Installation tab's Check now button does: AISA loads the site's homepage once, looks for the tag, records what it found, and opens or closes the site's alert as the hourly check would (an alert opens only for a site whose tag was seen before, and a confirmed miss emails the organization's admins). The answer is what this load found: `present`, `absent`, or `unverifiable` when the page could not be read, in which case nothing is decided and no alert changes. A site can be checked once a minute, counting the hourly check: a second request inside that minute is refused with `429` and a `Retry-After` header. A site with tag monitoring off, or with no address, is refused with `tag_check_unavailable`. It changes no setting, so it records no audit entry.