Register an endpoint
Send the URL and the events you want. Use["*"] to receive every event type, including ones added later.
ping with POST /webhook_endpoints/{uuid}/test.
Events
Every change to a deposit link’s status sends one, so if you act onpaid you also hear when a paid link is undone.
GET /webhook_endpoints/event_types returns the current list.
What we send
APOST 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 belowStreamlined-Event-Id: theidaboveStreamlined-Event-Type: thetypeaboveStreamlined-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 any2xx 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 a2xx. - 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.