Webhooks
For payload format and signature verification, see the Webhooks guide. This page is the management API.
POST /v1/webhooks
{ "url": "https://your-app.com/webhooks/zillow", "events": ["job.succeeded", "job.failed"], "description": "production"}201 response — secret is shown once.
{ "data": { "id": "f3...", "url": "https://your-app.com/webhooks/zillow", "events": ["job.succeeded", "job.failed"], "active": true, "created_at": "...", "secret": "whsec_AbCdEf..." }, "request_id": "..."}If events is omitted, you’ll receive all four:
job.succeeded, job.failed, job.timed_out, job.aborted.
GET /v1/webhooks
{ "data": [ { "id": "...", "url": "...", "events": [...], "active": true, "description": "production", "created_at": "...", "revoked_at": null } ], "request_id": "..."}Secrets are never returned on read — only at creation.
DELETE /v1/webhooks/{id}
Soft-revoke. Returns 204 No Content. We stop sending events immediately.
GET /v1/webhooks/{id}/deliveries
Per-attempt delivery log for debugging.
| Query | Type | Notes |
|---|---|---|
limit | int | default 50, max 200 |
{ "data": [ { "id": 8412, "job_id": "8c2a...", "event": "job.succeeded", "attempt": 1, "status_code": 200, "delivered": true, "attempted_at": "...", "response_preview": "{\"ok\":true}" }, { "id": 8411, "job_id": "8c2a...", "event": "job.succeeded", "attempt": 1, "status_code": 503, "delivered": false, "attempted_at": "...", "response_preview": "Service Unavailable" } ], "request_id": "..."}If delivered: false, we retry up to 2 more times with quadratic backoff.
After 3 failed attempts the event is dropped. Refire by querying
/v1/jobs/{id} from your side.