Skip to content

Testing and troubleshooting webhooks

When to use this guide: You need to prove an endpoint works, inspect delivery history, or fix a Webhooks failure. Inbound Sources paste-URL issues belong in Sources and delivery and SEP setup guides.

  1. Register the webhook and store the signing secret (Setting up webhooks).
  2. Implement signature verification (Payloads and signatures).
  3. Call POST /api/v1/webhooks/:id/test (write scope) — returns 202 with { "eventId": "osevt_…" } and queues a test.ping delivery.
  4. Confirm your endpoint returned 2xx and that GET /api/v1/webhooks/:id/deliveries shows SUCCEEDED.

You can also send test and inspect deliveries under Dashboard → Webhooks, or from Try the API when OpenAPI lists these paths.

POST /api/v1/webhooks/:id/deliveries/:deliveryId/replay creates a new delivery linked via replayOfDeliveryId. Use this after fixing your endpoint or after an auto-disable incident.

If you never receive sync.failed / sync.recovered, confirm the webhook is isActive, enabledEvents includes those types (or is empty), and that a real healthy↔failing transition occurred for a source×connection. Use GET /api/v1/events to see whether events were emitted without a successful delivery.

Common causes:

  • Webhooks not enabled (canUseWebhooks)
  • Connection-scoped key used on /api/v1/webhooks*
  • Missing write scope on a mutation

See Errors and rate limits and Creating API keys.

  • Verify against the raw body bytes.
  • Confirm you stored the latest secret after create or rotate.
  • Reject only after a constant-time compare; check clock skew against t= (for example a 5-minute window).

OutboundSync accepts HTTPS only and rejects private, loopback, and link-local targets (including DNS that resolves to private space). Use a publicly reachable HTTPS endpoint.

Twenty consecutive DEAD deliveries disable the endpoint. Fix the handler, then PATCH { "isActive": true } or re-enable in the dashboard. Optionally replay recent dead deliveries.