For background on why webhooks are required and how transactions move through states, see Event-driven design.
Setting up webhooks
Register a webhook endpoint
Manage webhooks
| Method | Path | Purpose |
|---|---|---|
GET | /v1/application/{id}/webhook | List all webhooks |
POST | /v1/application/{id}/webhook | Add a webhook |
PATCH | /v1/application/{id}/webhook/{webhookId} | Update a webhook |
DELETE | /v1/application/{id}/webhook/{webhookId} | Remove a webhook |
POST | /v1/application/{id}/webhook/{webhookId}/rotate-secret | Rotate the signing secret |
Verifying webhook signatures
Every webhook delivery is signed with your webhook secret using HMAC-SHA256. Always verify the signature before processing the payload.Compute the expected signature
Calculate HMAC-SHA256 over the raw request body using your current webhook secret.
Using the Go SDK
The SDK provides constant-time webhook verification with replay protection:Rotating webhook secrets
Rotate your webhook secret periodically:Best practices
- Respond with
200quickly — acknowledge receipt before doing heavy processing. Queue the event for async handling. - Handle duplicates — webhook deliveries may be retried. Use the event ID for idempotency.
- Verify every delivery — never process unverified webhook payloads.
- Use HTTPS — webhook URLs must use HTTPS in production.
- Rotate secrets regularly — treat webhook secrets like passwords.

