Webhooks push change to you instead of you polling for it. Register an endpoint, choose event types, and handle at-least-once delivery.
POST /v1/webhook_endpoints
{ "url": "https://you.example/hooks/commercecensus",
"events": ["price.changed", "availability.changed"] }
→ 201 { "endpoint_id": "whe_2f81", "secret": "whsec_…" }At-least-once, never exactly-once. Deduplicate on the `webhook-id` header. Return a 2xx quickly — acknowledge first, process asynchronously. A handler that does real work inline will eventually time out and cause redelivery.
| Attempt | Delay |
|---|---|
| 1 | 1 minute |
| 2 | 5 minutes |
| 3 | 30 minutes |
| 4 | 2 hours |
| 5+ | Dead-letter |
Dead-lettered events are not lost. The event log is replayable by cursor, so you can recover a gap yourself at 2am rather than filing a ticket.
GET /v1/events?after=evt_01JQ8Z3M4K&type=price.changed