Webhook Ingest
Ingest a webhook
Section titled “Ingest a webhook”POST /webhooks/{slug}Content-Type: application/json
{"event": "deployment", "status": "success"}This is the endpoint you give to third-party services (GitHub, Stripe, etc.) as your webhook URL.
Headers
Section titled “Headers”| Header | Description |
|---|---|
X-Idempotency-Key | Optional. Deduplicate deliveries. If omitted, a UUID is generated. |
Content-Type | Must be application/json. |
Response
Section titled “Response”HTTP/1.1 202 Accepted
{ "delivery_id": "a1b2c3d4-...", "status": "pending"}In record mode, the status will be "recorded" instead of "pending", and no fan-out occurs.
What happens next
Section titled “What happens next”- The payload and headers are stored in Postgres
- The delivery ID is published to a Redis Stream (
XADD) - A fan-out worker picks it up (
XREADGROUP) - The source transform script runs (if configured)
- Each active action is dispatched
- Delivery attempts are recorded with response details
If the Redis publish fails, the delivery is still safe in Postgres. A background poll loop catches any pending deliveries that weren’t picked up from the stream.