WEBHOOK

Authorizations

Authorization
string
header
required

A secret API key. Publishable keys cannot reach this API. A key may carry an expiry, and an expired key is refused exactly like an unknown one, with a 401 that names no reason; check the key's expires_at in the dashboard rather than inferring it from a response. When a merchant rolls a key's secret they choose a grace window of up to 3 days, and for its duration BOTH the new secret and the one it replaced authenticate, so an integration moves over on its own deploy schedule instead of at the instant the button is pressed. Move before the window closes: after it, the old secret is refused. Nothing else about this contract moves with a roll. The key keeps its id and its scopes, so the only thing an integration updates is the credential itself.

Headers

webhook-id
string
required

Unique id for this delivery, stable across every retry of it. Deduplicate on this value.

webhook-timestamp
string
required

Unix seconds at which the delivery was signed. Part of the signed input, and what you check to refuse a replayed capture.

webhook-signature
string
required

One or more space-separated signatures, each v1,<base64 hmac-sha256>. Accept if any verifies.

webhook-event-type
string
required

The topic that fired, matching the envelope's event field. Lets you route before parsing the body.

Body

application/json

The body of a webhook delivery. Every topic uses this envelope, so one parser handles all of them and routing is a switch on event rather than on which handler received the request.

COMPATIBILITY. Changes are additive: new fields may appear inside data at any time, so parse leniently and ignore what you do not recognise. A field is never removed or retyped under the same schema_version; a change that would break a receiver arrives as a bumped schema_version, which is what makes branching on it possible instead of guessing from the fields present.

There is deliberately no id field in the body. The delivery id travels as the webhook-id header and is the value to deduplicate on.

schema_version
string
required

The payload contract version. Branch on it rather than on field presence; a receiver written for one version cannot be assumed to handle the next.

Allowed value: "1"
event
string
required

The topic that fired, one of the values in WebhookTopic other than the * wildcard, which subscribes but never appears on the wire. It is also sent as the webhook-event-type header, so a receiver can route before parsing.

occurred_at
string<date-time>
required

When the event happened, UTC. NOT when the delivery was sent: a retry hours later carries the original value, because the payload is a snapshot of the moment rather than a fresh read.

data
object
required

The resource the event is about, snapshotted when the event occurred. Its fields depend on event; see the examples on the delivery request below, which are the frozen bodies this platform actually sends.

Response

Any 2xx acknowledges the delivery and it is not retried. Answer before doing slow work. A body is read and discarded.