Export-ready webhooks
Export-ready webhooks
Receive an export.ready notification when your CSV is ready to download.
Subscriptions belong to the organization identified by your X-API-Key. They
cover all that organization's exports, not individual feeds or a whole white-label.
No organization or feed ID is accepted when configuring a webhook.
Only export.ready is supported. Notifications cover exports completed after
you register your webhook. Failed notifications do not affect your exports.
Create or test
POST /webhooks
| Input | Required | Description |
|---|---|---|
mode | Yes | create or test |
url | Yes | Public HTTPS URL, maximum 2,048 characters; no credentials or fragments |
enabled | No | Defaults to true; applies only to creation |
Code
201 Created
Code
Store the signing secret securely. It is returned once and never included in list or edit responses. To replace a lost secret, create a replacement webhook and delete the old one.
Test without saving
Code
200 OK
Code
Test mode sends an unsigned sample with test: true, dummy IDs, and null
download fields. No subscription or export is created. enabled is ignored.
Test notifications are sent once and are not retried.
A delivery failure also returns 200 with delivered: false, for example:
Code
Never process unsigned tests as real exports. Production events must pass signature verification. Disallowed destinations return 422 before a test is sent.
List
GET /webhooks?limit=25&offset=0
limit defaults to 25 (1–100). offset defaults to 0 (zero or greater).
200 OK
Code
last_delivery is null before an attempt completes. Its status is delivered,
retrying, or failed. Follow next_offset while has_more is true.
Edit
PATCH /webhooks/{webhook_id}
Send at least one field. Omitted fields remain unchanged; null is not accepted.
Code
200 OK returns id, url, event, enabled, created_at, and updated_at:
Code
Disabling cancels pending deliveries and retries. Re-enabling applies to future events only. URL changes apply to pending deliveries; an in-flight request may still finish at the previous URL. The signing secret stays the same.
Delete
DELETE /webhooks/{webhook_id}
No request body. Returns 204 No Content. Pending deliveries and retries are removed; an in-flight request may finish.
Event delivered to your URL
Code
feed_id may be null for exports not associated with a saved feed. row_count
is the number of rows in the CSV. Downloads are gzip-compressed CSV files
(.csv.gz). Keep download links private.
Download your file before download_expires_at. Links are valid for up to one
hour and cannot outlast the file's availability. Each retry includes a new link
with the same event ID and creation time. Notifications cannot be delivered
after the file expires.
Verify production signatures
Code
Compute HMAC-SHA256 over timestamp + "." + raw_request_body, using the complete
whsec_... secret as UTF-8 bytes. Compare signatures in constant time and reject
timestamps more than five minutes old. Verify before parsing or processing the body.
Code
Acknowledgement and retries
Return any 2xx within 10 seconds. Queue your own processing before replying; do not wait for the CSV download. Redirects are not followed. All non-2xx responses, connection failures, and timeouts are retried after 1 minute, 5 minutes, 30 minutes, 2 hours, and 12 hours, measured from the preceding failed attempt. There are at most six attempts. Retry times are approximate.
Delivery is at least once: duplicates and out-of-order events are possible.
Deduplicate using id. A successful HTTP response stops retries. Inspect
last_delivery for failures; no manual replay endpoint is included.
Errors and limits
| Status | Meaning |
|---|---|
| 401 | Invalid or inactive API key |
| 404 | Webhook missing or belongs to another organization |
| 422 | Invalid fields, unresolved hostname, or disallowed destination |
| 429 | Organization rate limit exceeded; observe Retry-After |
Tests allow 10 requests per minute per organization. Creation and updates each allow 30 per minute. Invalid destination requests also count toward these limits.
Code
Use a publicly reachable HTTPS endpoint with a valid certificate. Localhost and private-network URLs are not supported.