Skip to main content

Two channels

You can also point Ops URL at a Slack incoming webhook — we detect hooks.slack.com and format the payload as a Slack block.

Signature

Every request carries:
Verify with constant-time comparison. SDK helper:
Always use the raw body for verification. JSON-parsed bodies will fail because of whitespace normalization.

Secret rotation

Rotate from the dashboard. We dual-sign with old and new secret for 5 minutes to give your handler time to deploy the new value. After 5 min the old secret is rejected.

Retry schedule

7 attempts over 24 h: 1m, 5m, 15m, 1h, 4h, 12h, 24h. After 50 failures in 6 h the webhook URL is auto-paused — you get a webhook_paused ops event, and the order events queue up but are not dropped (they replay on resume). Resume manually with:

URL requirements

  • HTTPS required in production. HTTP allowed only when URL is http://localhost:* with a pk_test_ key.
  • Public IP. We block private ranges, cloud metadata endpoints (169.254.169.254, metadata.google.internal) and link-local addresses via SSRF guard at registration.
  • DNS rebinding protection: we resolve and pin the IP for 5 min on first delivery.

Event payload

Sandbox

Webhooks fire from sandbox orders too, but with "sandbox": true field at the top level. Filter or accept based on your testing strategy. Sandbox webhook signatures use a separate whsec_test_... secret.