Skip to main content
The webhook subscriptions API lets each organization register one or more HTTPS endpoints that receive signed, retried webhook deliveries for mapping events. This is the API behind the Developers → Webhooks page in the app. For a conceptual overview see Webhooks Overview. For signature verification see Verifying signatures. For delivery semantics see Retries and delivery.
All endpoints require an API key in the X-API-Key header. The two new event types (MAPPING_ERROR_RESOLVED, INVENTORY_DUPLICATE_RESOLVED) require a Pro or above plan.

POST /api/v1/webhook-subscriptions

Create a subscription. Returns the freshly generated signing secret exactly once — store it before responding.

Request body

string
Human-readable label.
string
required
HTTPS endpoint that will receive deliveries. Must use https://, must resolve to a non-private IP outside of dev.
string[]
required
Array of event types this subscription should receive. One or more of:
  • MAPPING_COMPLETED — all plans
  • MAPPING_ERROR_RESOLVED — Pro and above
  • INVENTORY_DUPLICATE_RESOLVED — Pro and above
string
Header name attached to every request (e.g., X-API-Key).
string
Value for apiKeyName. Stored encrypted at rest.
object
Extra headers as a key-value map.
string
default:"ACTIVE"
ACTIVE or INACTIVE. Inactive subscriptions don’t receive deliveries.

Response

string
Subscription UUID.
string
Only returned on this initial response. Store it now; we won’t show it again. Used for HMAC verification — see Verifying signatures.
string
Masked form for UI display (e.g., whsec_••••5d4d). Returned on every read.
string[]
Echoed event subscriptions.
string
ACTIVE or INACTIVE.
string
PLAN_DOWNGRADE if auto-disabled by a plan downgrade. Otherwise null.

Example


GET /api/v1/webhook-subscriptions

List subscriptions for the organization. signingSecret is never returned — only signingSecretMasked.
boolean
default:"false"
When true, only ACTIVE subscriptions are returned.

GET /api/v1/webhook-subscriptions/

Retrieve one subscription. signingSecret is masked.

PUT /api/v1/webhook-subscriptions/

Replace the subscription. Same body schema as create. Returns 403 if any event in events is not permitted for the org’s current plan.

DELETE /api/v1/webhook-subscriptions/

Permanently delete the subscription and its delivery history. Returns 204 No Content.

POST /api/v1/webhook-subscriptions//rotate-secret

Generate a new signing secret and invalidate the old one. Returns the new secret once.

GET /api/v1/webhook-subscriptions//deliveries

Recent delivery attempts for inspection and debugging.
integer
default:"50"
Max rows. Capped at 200.

Response

object[]

POST /api/v1/webhook-subscriptions//test

Enqueue a synthetic webhook.test event for the subscription. Useful to confirm your endpoint receives and verifies signed payloads end-to-end.
The synthetic event flows through the same scheduler + retry pipeline as real events. Check /deliveries for the result within ~30 seconds.

Error codes


Operational guards

  • Quota: 10 active subscriptions per organization.
  • URL safety: https:// only; loopback and RFC 1918 hosts are rejected outside dev.
  • Payload cap: 64 KB. Larger payloads get { truncated: true, dataRef } and the data is queryable via API.
  • Backpressure: when PENDING deliveries for one org exceeds 10,000, new events for that org are dropped silently and an hourly audit entry records the drop.