Skip to main content

What this lets you do

Build against the exact payload of every event type Traceten delivers. All examples on this page are complete, valid deliveries under api_version: "2026-07-01". Every delivery shares the same envelope: id, type, api_version, created, and a type-specific data object. This page documents each type and its data. All wire fields are snake_case. The taxonomy is additive-only. New types may be added; existing types and fields are never removed or renamed. Route on type and ignore values you do not recognize.

ai_session.classified

Fires when a session on your site is classified as AI-referred. Exactly one delivery per AI session, deduplicated per session, sent the moment classification completes. This is the default subscription for new endpoints.

data fields

conversion.attributed

Fires when a conversion (a purchase or any custom goal) is attributed to an AI source, immediately after Traceten records the attribution. A conversion with no AI-referred session in its journey never fires this event. Exactly one event per conversion, not one per attribution model: the top-level fields carry the canonical model (last-touch in v1), and models[] carries the full four-model breakdown for the same AI source. Because the breakdown is scoped to the canonical (last-touch) source, a model that credits a different source shows credit_fraction: 0 for it. A money-carrying conversion (Stripe or Shopify purchase). This journey had two AI touches, ChatGPT first and Perplexity last, so first-touch assigns Perplexity nothing:
For a non-purchase goal, revenue_cents_attributed and currency are absent at the top level and every models[].revenue_cents_attributed is null. There is no money to split, and Traceten never fabricates a $0. A signup attributed to a single AI touch:
Note the distinction: 0 means “this model assigned no credit to a real-money conversion”; null means “this conversion carries no money at all”.

data fields

webhook.ping

The test and verification event. Sent in exactly two situations: once automatically when you register an endpoint (to verify it), and whenever you click Send test event on the endpoint detail page. It never fires as part of your site’s traffic. It travels the exact same signing and delivery path as real events, so a successful ping proves the real path works, and its outcome drives the endpoint’s verification status. Unlike real events, a ping gets exactly one attempt. It never enters the retry schedule; if it fails, click Send test event again.

data fields

site_id means two different things across event types. On ai_session.classified and conversion.attributed, site_id is your site key, the ttid_… value used as data-site in the snippet. On webhook.ping it is the site’s internal UUID from the dashboard URL. The two never equal each other. If your handler keys anything on site_id, branch on event type first, or ignore the ping’s site_id and match on the endpoint instead.

What webhooks never carry

Payloads are stable projections of Traceten’s internal records, not the records themselves. The following fields exist internally but are deliberately excluded from every event, permanently: Additionally, the url field in ai_session.classified is reduced to origin + path before delivery. Query strings and fragments routinely carry emails, tokens, and session state, so they are stripped and structurally cannot ride along. conversion.attributed carries no visitor_id. That is not a privacy exclusion (visitor_id is pseudonymous and is included in ai_session.classified); the credited session_id is simply sufficient to attribute a conversion. Join the two event types on session_id if you need visitor-level analysis. See what data we collect for the full picture of what Traceten does and does not store.

Next