Receive a delivery on a self-managed webhook
POST/webhooks/w/:token
The one ingestion receiver (ADR-0012). {token} is the unguessable ingest token minted by
create_webhook / rotate_webhook; it routes the delivery to exactly one webhook, owned by
one endpoint. The webhook's source type fixes how the delivery is verified (ADR-0003):
- Signed source types (
github,gitea,stripe,slack,cairn): the raw request body is read and the provider's signature is verified before any parsing, in constant time, against the secret switchboard minted. A missing, malformed, or failing signature returns 401 and the payload is NOT persisted. Stripe, Slack, and Cairn additionally enforce a timestamp freshness window (default 300s) to blunt replay. genericandtelemetry(trust_mode=token): the token in the URL authenticates the caller; the body is not verified, and the event persists withverified=false.
On success the event is persisted, routing rules pick a queue (or drop the delivery), and one todo is created per target endpoint — the webhook's owner plus any route fan-out (ADR-0022). A redelivery with the same delivery id (or body) collapses onto the existing todo.
Request
Responses
- 202
- 401
- 404
- 413
- 429
- 503
Accepted. The body lists the todos the delivery produced, or says it was dropped.
Signature missing, malformed, or failed verification. Payload not persisted.
Unknown ingest token — the URL is wrong, or the webhook was rotated or deleted.
Body exceeds 5 MiB.
Rate limited. Honor Retry-After.
The webhook cannot produce work: no live target endpoint remains, or a signed webhook has no stored secret. Nothing is persisted, so the producer retries.