POST to one
HTTPS URL per project. Signing follows the Standard Webhooks
specification, so any Standard Webhooks library can verify the requests.
Set up
1
Open the Webhooks settings
In the Prism Console, go to Settings → Webhooks.
2
Enter your endpoint URL
The URL must use
https on port 443. Local, private, and link-local addresses are not allowed.3
Pass the reachability test
Prism sends a signed
webhook.test event to your URL. Your endpoint must answer with a 2xx status
within 10 seconds, or the save is rejected. The error message names the reason, for example
timeout or http_status.4
Copy the signing secret
Prism shows the signing secret (
whsec_...) once. Store it in your secret manager. You need it to
verify every request.Events
Payload
Amounts are strings in token units, not in the smallest unit.
asset is the token symbol. New
fields may be added at any time. Fields are never removed without a new apiVersion.
Verify signatures
Every request has three headers:
To verify a request:
- Build the signed content:
{webhook-id}.{webhook-timestamp}.{raw body}. Use the raw body bytes, before any JSON parsing. - Take the part of your secret after
whsec_and base64-decode it. That is the HMAC key. - Compute HMAC-SHA256 of the signed content and base64-encode it.
- Accept the request if any
v1value inwebhook-signaturematches. Use a constant-time compare. - Reject timestamps more than 5 minutes from your clock.
v1 values, one per secret.
- TypeScript
- Python
Retries and auto-disable
- Prism tries each event up to 3 times: at once, after 1 minute, and after 5 minutes.
- Only a 2xx response counts as success. Redirects count as failures and are not followed.
- Each call times out after 10 seconds.
- After 3 failed calls in a row, or any
410 Gone, Prism disables the endpoint and shows a banner in Settings → Webhooks. Fix your endpoint, then turn it back on. The reachability test runs again. - When you turn an endpoint back on, payments confirmed in the last 24 hours that were not sent are delivered once. Older ones are not. Use the payments API to reconcile a longer outage.
- The delivery log shows every event with its status, attempts, and last result. You can resend a
FailedorDeliveredevent, one at a time. A resend keeps the samewebhook-id.
webhook-id. A strict de-duplicator also ignores a deliberate resend of an event you
already processed. That is expected.
Delete an endpoint
Prism stops sending at once. The delivery log is kept and stays visible. Events that were still waiting are not sent to the deleted URL. After you add a new endpoint, you can resend any event from the old endpoint to the new one. It keeps the samewebhook-id.
Rotate the secret
Rotating creates a new signing secret, shown once. The old secret keeps signing for 24 hours, so you can deploy the new one without dropping events.Best practices
- Return 2xx quickly, then process the event in the background.
- Use
webhook-idas an idempotency key. - After an outage, reconcile with the payments API instead of relying only on webhooks.