Skip to main content
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 notify your endpoint when the dataset changes, so you can pull the affected records (or the next change-feed page) immediately instead of waiting for a scheduled sync. They require the 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 HTTPS POST 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.
Secrets can be rotated from the developer console. During rotation, deliveries are signed with the new secret; keep the old one for the tolerance window if you want to accept in-flight retries.

Endpoint verification

When you register an endpoint, we send a ping 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 return 2xx 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 compare data.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 new X-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.