Skip to main content
Register a URL and RAVN posts to it whenever a swap made with your key settles, gets refunded, or fails. This is a convenience notification layer on top of /status, not a replacement for it, see What this isn’t before you build on it.

Register a URL

Set webhookUrl on PATCH /v1/keys. It must be https://.
Save webhookSecret immediately. It’s only ever returned from this exact call, there’s no separate endpoint to retrieve it later. Losing it means you can no longer verify deliveries and have to register a new URL to get a fresh one, see below.
Re-registering a different webhookUrl on the same key keeps the same webhookSecret; only the first registration generates one. Enterprise keys don’t support webhooks yet and return 404 NOT_FOUND on this field.

What gets sent

When a swap executed with your x-api-key reaches a terminal state, RAVN POSTs this to your URL:
event is one of swap.settled, swap.refunded, or swap.failed. ts is the delivery timestamp, epoch milliseconds. deliveredOut and slippageBps can be null on a venue that doesn’t report them.

Verify the signature

Every request carries an x-ravn-signature header: sha256=<hex>, an HMAC-SHA256 of the exact raw JSON body using your webhookSecret. Verify it against the raw bytes, before you parse the body, not against a re-serialized copy of it.

What this isn’t

This is not a reliable, real-time push system, treat it as a convenience on top of polling.
  • Deliveries fire from a background settlement job that runs roughly every 5 minutes, so a webhook can lag up to that long behind what /status would already show you.
  • Delivery is best-effort and fired once. If your endpoint is down, times out, or the request otherwise fails, there is no retry and no way to recover that specific notification, it’s gone.
/status polling remains the only way to get a guaranteed final result. Use webhooks to avoid polling every swap constantly, not as your source of truth for whether one actually completed.