Configure
Set your webhook URL, subscribed event types, and signing secret from the Business Dashboard → Developers → Setup (dashboard session — not via API key).
Developers → Setup — webhook URL, signing secret, and event subscriptions
- On first save, the signing secret is returned once (looks like
whsec_••••••••••••••••when masked) — store the full value securely. - Default subscription when omitted:
["shipment.status_changed"]. - Use Rotate secret if the secret may be compromised. The previous secret remains valid for about 24 hours.

Developers → Webhook deliveries
Event types
One durable event is stored per transition.
type is the most specific mapped type. Subscribing to shipment.status_changed receives status transitions (including create).
See Shipment statuses for how lifecycle statuses map to these events.
Event envelope
Every delivery is a JSON POST with this shape. Headers:Delivery and retries
Return a 2xx status to acknowledge receipt.
Delivery is at-least-once. Retries reuse the same event
id (evt_…) — make your handler idempotent. Run does not promise global ordering; use occurred_at, previous_status, and status.
In production, webhook URLs must use HTTPS. Run blocks private/reserved destinations and disables redirects when delivering.
Verify signatures
HMAC-SHA256 oforderId + status + timestamp, keyed with your whsec_… secret. Compare the hex digest to X-Run-Webhook-Signature.
Reject timestamps older than about 5 minutes. Always verify before trusting the body.