Planned. Commercial only. Webhooks are specified here so you can design
against them and are not yet accepting endpoints. Contact your account
manager to join the pilot. Follow the changelog
for the release date.
webhooks feature, which is only available on Commercial plans.
Webhooks are a signal, not a data channel. Payloads identify what changed; fetch the current state from the API or the change feed. Deliveries are not counted against your daily quota; the fetches they trigger are.
Topics
Subscribe per topic when you register the endpoint in the developer console.
Delivery
Each delivery is an HTTPSPOST with a JSON body and three headers.
data.seq matches the change feed sequence number, so you can either fetch the record directly or advance your cursor.
Respond with any 2xx within 10 seconds. Do the real work asynchronously.
Verify the signature
Every delivery is signed with the endpoint’s secret, shown once when you create the endpoint.1
Parse the header
Split on
,, then on =, to get t and v1.2
Check the timestamp
Reject if
|now - t| is more than 5 minutes. This limits replay of captured deliveries.3
Recompute
Compute
HMAC-SHA256(secret, f"{t}.{body}") over the raw request body bytes, hex-encoded.4
Compare in constant time
Reject if it does not match
v1.Endpoint verification
When you register an endpoint, we send aping delivery (X-LLM-Stats-Event: ping) signed like any other. The endpoint becomes active only after it returns 2xx to the ping. Endpoints must be HTTPS with a valid certificate and must not redirect.
Retries and duplicates
If your endpoint does not return2xx within 10 seconds, we retry with the same X-LLM-Stats-Delivery id:
After the last attempt the delivery is marked failed and visible in the developer console. Because retries happen after timeouts, you may receive an event you already processed. Deduplicate on
X-LLM-Stats-Delivery (or id), and make handlers idempotent.
Ordering
Deliveries are not ordered. Two events for the same entity can arrive out of order, and a retried event can arrive after a newer one. Do not apply webhook payloads as state. Use them to trigger a fetch of the current record, or comparedata.seq with the last sequence you applied and skip anything older.
Suspension
An endpoint is revoked after 20 consecutive failed deliveries (each delivery counts once, after its final attempt). Revoked endpoints stop receiving events; you are notified by email and in the developer console. Re-enable it from the console after fixing the endpoint — it goes through verification again. Events that occurred while the endpoint was revoked are not delivered; use replay or the change feed to catch up.Replay
From the developer console you can redeliver any event from the last 30 days to an active endpoint. Replayed deliveries carry a newX-LLM-Stats-Delivery id and a fresh signature timestamp, so they pass the tolerance check and are not deduplicated against the original. For anything older than 30 days, or after an outage longer than that, resync with the change feed, which retains 13 months.