Webhooks notify your system when shelf state changes.
How webhooks work
Register a webhook endpoint once, then submit as many documents as you need.
Every shelf lifecycle event is automatically delivered to all matching endpoints — you don’t create a new webhook per document.
Do not create a webhook on every document submission. This accumulates
endpoints, complicates secret management, and provides no benefit — a single
endpoint already receives events for all your shelves.
Subscribable events
webhook.ping is a test event triggered only by POST /v1/webhooks/{webhookPublicId}/ping.
Register an endpoint
The signing secret is returned on create and rotate.
Endpoint URL requirements
- Must be an absolute URL without username/password credentials
- In production, must use
https://
- In production, if a port is provided, it must be
443
- Host must resolve
- Resolved IPs cannot be private, loopback, link-local, or special-purpose
localhost, *.localhost, and .local are rejected in production
- In non-production,
http://localhost and http://*.localhost are allowed
Invalid URL checks return 400 with code=VALIDATION_ERROR and details:
Delivery contract
-
At-least-once delivery
-
Use
webhook-id as idempotency key
-
Verify signature before processing
-
webhook-id
-
webhook-timestamp
-
webhook-signature (v1,<base64-hmac>)
-
webhook-attempt
-
webhook-endpoint-id
Signed payload format:
Signature verification example
Handler checklist:
- Read raw request body
- Verify signature and enforce timestamp freshness window
- Deduplicate by
webhook-id
- Process event
Minimal operations
List endpoints
Rotate secret
Send test event
For delivery history and redelivery endpoints, use the API Reference tab.