Skip to main content
Webhooks tell your server when a payment is confirmed. Prism sends a signed JSON 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:
  1. Build the signed content: {webhook-id}.{webhook-timestamp}.{raw body}. Use the raw body bytes, before any JSON parsing.
  2. Take the part of your secret after whsec_ and base64-decode it. That is the HMAC key.
  3. Compute HMAC-SHA256 of the signed content and base64-encode it.
  4. Accept the request if any v1 value in webhook-signature matches. Use a constant-time compare.
  5. Reject timestamps more than 5 minutes from your clock.
While a rotated secret is still valid, the header holds two v1 values, one per secret.

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 Failed or Delivered event, one at a time. A resend keeps the same webhook-id.
Delivery is at-least-once while the endpoint is enabled. The same event can arrive more than once, so de-duplicate on 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 same webhook-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-id as an idempotency key.
  • After an outage, reconcile with the payments API instead of relying only on webhooks.
Last modified on September 29, 2026