Skip to main content
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:
  1. Read raw request body
  2. Verify signature and enforce timestamp freshness window
  3. Deduplicate by webhook-id
  4. Process event

Minimal operations

List endpoints
Rotate secret
Send test event
For delivery history and redelivery endpoints, use the API Reference tab.