POST we send to a URL you own when something happens to your processor — a paid
sale, a failed run. You register one URL per processor, we sign every call so you can prove it came
from us, and we keep retrying until your endpoint answers.
One webhook per processor. Register it in My Processors → Webhooks, or over the API.
Register, and prove you own the endpoint
When you save a URL we immediately send it a one-time verificationPOST. Your endpoint must
answer 2xx. Only then does the webhook activate.
This step is not paperwork. A wallet signature proves you asked for the webhook; it does not prove
the target agreed to receive our calls. The verification ping is what stops anyone pointing us at
a stranger’s server. Until your endpoint answers it, the webhook is registered but inactive and
delivers nothing.
The URL must be
https on port 443, a real hostname (no IP addresses), and not one of our own domains.
Redirects are not followed — a redirect is a second URL nobody verified.whsec_…). Save it now — it is never shown
again. Registering again mints a new one, and is also how you re-verify after a change.
What you receive
Three event types, each a JSON body:
The payload carries the run’s identity and outcome — never the caller’s input or output, which are
their data, not yours:
Verify the signature
Every delivery carries anX-SGL-Signature header in Stripe’s format:
v1 is hmac-sha256(secret, "{t}.{rawBody}"). Recompute it over the raw request body and reject
anything that does not match — an unsigned or wrongly-signed call is not from us. The t timestamp is
inside the signed string, so you can also reject anything too old to be a genuine, timely event.
X-SGL-Event (the type) and X-SGL-Delivery (the delivery id — use it to dedupe, since
a retried delivery reuses it).
Retries, and auto-disable
Answer2xx fast — we time out a delivery after 10 seconds. If your endpoint is down or slow, we
retry with backoff — roughly 1 minute, then 5, 15, an hour, and on out to a day, eight attempts in
all. Do the slow work after you have acknowledged; a webhook handler that blocks on your own
processing is a webhook handler that times out.
After 20 consecutive failed deliveries the webhook auto-disables so we never hammer a dead
endpoint. Re-register (which re-verifies) to turn it back on. A delivery older than about a day is
dropped unsent rather than arriving stale.
Events are derived from your sales, not emitted from the payment path, so a webhook problem can only
ever delay a notification — it can never affect a buyer’s payment or your runs.
Test it
The Send test ping button (orPOST /processors/{slug}/webhook/test) delivers a test.ping event
through the real signing-and-delivery path, and tells you exactly what your endpoint answered. Use it
to confirm your signature check before a real sale depends on it.
