Skip to main content
Register an HTTPS endpoint and we POST an event to it when something changes, rather than you polling for it. Webhooks are enabled per account; ask us to switch them on.

Register an endpoint

Send the URL and the events you want. Use ["*"] to receive every event type, including ones added later.
The response includes the endpoint’s signing secret. You only see it here and when you rotate it, so store it now. You need it to verify signatures.
Each account can have up to 10 endpoints. To check your endpoint end to end, send a ping with POST /webhook_endpoints/{uuid}/test.

Events

Every change to a deposit link’s status sends one, so if you act on paid you also hear when a paid link is undone. GET /webhook_endpoints/event_types returns the current list.

What we send

A POST with a JSON body:
data.object is the object exactly as the matching GET returns it at the moment of the change. For deposit link events that is a DepositLink. livemode is false for events from the sandbox. Headers:
  • Streamlined-Signature: see below
  • Streamlined-Event-Id: the id above
  • Streamlined-Event-Type: the type above
  • Streamlined-Delivery-Id: this delivery. Unique per endpoint per event.

Verifying the signature

Streamlined-Signature looks like t=1757520251,v1=5257a869.... Compute an HMAC-SHA256 of <t>.<raw request body> with your endpoint’s secret, hex-encode it, and compare it with v1 in constant time. Reject the request if t is more than five minutes from your clock, which stops a captured request being replayed later. Use the raw body bytes you received, before any JSON parsing.

Responding, retries and failures

Start answering within 10 seconds and finish within 20. Return any 2xx and do the work afterwards; no response in time counts as a failure. A 2xx that arrives in time is a delivery even if the rest of your response body is slow, and we only read the first 2 KB of it. Anything else, including a redirect, is retried: after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours, 12 hours and 24 hours, eight attempts over about 45 hours. GET /webhook_endpoints/{uuid}/deliveries shows every delivery’s latest outcome, and one that gave up can be sent again with POST .../deliveries/{delivery_uuid}/retry. If five deliveries in a row give up without one getting through in between, the endpoint switches itself off (status: disabled, with a disabled_reason). Events that happen while it is off are not queued for it. Turn it back on with PATCH and status: enabled.

Guarantees

  • At least once. The same event can arrive more than once. Deduplicate on id, and acknowledge a repeat with a 2xx.
  • Not in order. Retries mean a later event can arrive first. Compare created_at, or fetch the object before acting on an irreversible change.
  • HTTPS to a public host. We will not deliver to a private, loopback or link-local address, and we do not follow redirects.