Quickstart: receive your first webhook
Three delivery surfaces take Orbit events off the platform; this guide helps you pick one, then walks the full registered-endpoint loop — tunnel, register, verify, replay — end to end.Step 1 — Pick a delivery surface
Start with the Tester when you’re experimenting. Graduate to a registered endpoint as soon as the integration is real — the tester cannot sign requests, so it never exercises your verification logic. Choose an event sink when per-endpoint receivers are the wrong shape — Kafka, batch, or many event types over one destination.
The rest of this guide walks the registered-endpoint loop. If you’re only here to explore, open the Webhook Tester and come back when a request fails signature checks.
Step 2 — Expose a local endpoint with a tunnel
Run any bare HTTP listener locally and put a public URL in front of it:Step 3 — Register the endpoint in the console (or over the API)
In the dashboard, go to Developer → Webhooks → Add endpoint (also reachable under Settings → Webhooks). Paste your tunnel URL, subscribe to one or two event types, and save. The console shows the cleartext signing secret (whsec_...) exactly once — copy it into an environment variable now.
The same registration over the API:
wh_...) and the one-time cleartext secret. Narrow events lists keep test traffic sane; * is a production decision, not a development one.
Step 4 — Receive and verify the signature
Registered deliveries arrive signed with anX-Orbit-Signature header in t=<unix>,v1=<hex> format. Your receiver must verify HMAC_SHA256(secret, "<t>.<raw body>") over the raw request bytes — before any JSON middleware parses them — and reject timestamps older than 5 minutes. A minimal Node check:
2xx within the 30-second delivery window and dedupe on the envelope id — retries and replays re-deliver the same id. The full contract (retry schedule, dead-letter queue, proven-dead statuses) is on Webhooks overview; Build your first webhook receiver has a complete implementation in two languages, and Webhook security ships verifiers in seven.
Step 5 — Replay deliveries from the console
Every delivery attempt is inspectable in Developer → Webhooks → Events — pick a row to see the payload and the response your server returned. A failed delivery can be re-sent with Replay on the delivery row, so you can fix your receiver and re-fire the same signed event without triggering new traffic. Deliveries that exhaust the retry schedule land in the dead-letter queue under Developer → Webhooks → Dead-letter queue, replayable for 7 days. When you have a backlog to re-fire rather than one row, use the bulk-replay flow on that screen. Both paths are covered in Inspecting deliveries.Step 6 — Move to an event sink when you outgrow HTTP receivers
A registered endpoint per receiver is the right shape until it isn’t — the move-off signals are concrete:- Your downstream is Kafka. Point the
kafkasink at your brokers and stop running HTTP receivers for every event group. - You want batches, not per-event POSTs. The
http_batchsink flushes a JSON array of envelopes at a configurable batch size. - You’re subscribing
*to catch everything. One sink carrying the whole taxonomy beats a fleet of wildcard endpoints.
credentials_configured boolean, never the secret. The record shape is byte-identical to the webhook envelope, so a consumer you write today keeps working when sink delivery goes live; until then, keep the durable traffic on webhooks and use the sink only to stage the config. The full fan-out model is on Webhook fan-out: one event, many destinations.
See also
- Test webhooks with the Webhook Tester — unsigned synthetic sends for iteration
- Build your first webhook receiver — full receiver walkthrough in Node and Python
- Build a durable webhook consumer — production-grade receiver with queued processing
- Event Sinks API — Kafka and HTTP-batch sink configuration
- Webhook fan-out — how one event reaches every subscription