Skip to content

Webhook Ingest

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.

HeaderDescription
X-Idempotency-KeyOptional. Deduplicate deliveries. If omitted, a UUID is generated.
Content-TypeMust be application/json.
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.

  1. The payload and headers are stored in Postgres
  2. The delivery ID is published to a Redis Stream (XADD)
  3. A fan-out worker picks it up (XREADGROUP)
  4. The source transform script runs (if configured)
  5. Each active action is dispatched
  6. 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.