Stripe webhook (payments at signing)
Called by Stripe only — there is no session, and the request is authenticated by the Stripe-Signature header (t=<unix time>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">) checked over the raw body, against every configured signing secret (the platform endpoint and the Connect endpoint have different ones), before the body is parsed. A delivery more than five minutes from now is refused. Each event is claimed by its id in the same transaction that applies it, so a redelivery changes nothing and a failed apply rolls the claim back. A payment's status only moves along the allowed transitions, and a terminal state (canceled, refunded) never moves again, so out-of-order delivery is harmless. An event about something this service does not know is acknowledged with 200 so Stripe stops retrying it. Only a failure a retry could fix (500, including an event that arrived before the row it depends on) asks for redelivery.
View as MarkdownHeader Parameters
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/webhooks/stripe" \ -H "Stripe-Signature: string" \ -H "Content-Type: application/json" \ -d '{}'{ "ok": true}Where a payment stands (EAS-119)
Polled by the signer's page after the card is confirmed. When Stripe's webhook has not landed yet and the payment is still open, the PaymentIntent is read from Stripe, so a signer who has just paid is never left waiting on webhook delivery.
Confirm a signing request is genuine
EAS-122. Resolves a verification code — printed in every signature-request email, independent of and never derivable from the recipient's actual signing token — to the minimal facts needed to recognize the request: who really sent it, which document, when, and its current status. Never returns document contents, field values, a file URL, or any recipient's email address. This confirms the request RECORD is genuine; it does not and cannot vouch that the sender is trustworthy or that their account hasn't been compromised. Unauthenticated, IP rate-limited tighter than the rest of the public surface (resolving a short code by exact match is the one public route here where guessing is realistic). An unknown code and a malformed one return the identical 404 — there is no way to distinguish "never issued" from "garbage input".