Authorization: Bearer <token>, and accept Content-Type: application/json. Base URL: https://api.keebai.com/v1.
Create a subscription
POST /v1/webhooks — returns the raw secret only once.
Response 201
List subscriptions
GET /v1/webhooks — returns every subscription on your company.
secret is not included in list or get-by-id. Only secret_prefix (the first 12 chars), which is enough to visually identify which key you’re using.
Get a subscription
GET /v1/webhooks/:id
Update a subscription
PATCH /v1/webhooks/:id — every field is optional.
- Reactivating a subscription that was auto-disabled by excessive failures (
is_active: true). - Adding or removing events without recreating it (preserves the secret).
- Changing the URL (preserves the secret).
Rotate secret
POST /v1/webhooks/:id/rotate-secret
create, with a new secret. The old one is invalidated immediately. For zero-downtime rotation, see security.
Dispatch a synthetic event (test)
POST /v1/webhooks/:id/test — sends a synthetic envelope with data._test: true to your URL.
webhooks test after deploying your endpoint to verify that HMAC verification still works.
List deliveries
GET /v1/webhooks/:id/deliveries?limit=50&cursor=<delivery_id>
status:
pending— queued, not yet attempted.success— 2xx response.failed— non-retryable failure (4xx other than 408/429), or retries are exhausted but still in the retry window.dead— exceeded the 5 attempts, no further retries.
Delete a subscription
DELETE /v1/webhooks/:id
Common errors
Auto-disable
If a subscription accumulates 50 consecutivedead deliveries, we mark it is_active: false with disabled_reason: 'excessive_failures' and email the owner. Reactivate via PATCH /v1/webhooks/:id { "is_active": true } once you’ve fixed the endpoint.
This stops an endpoint under maintenance from collecting noise for hours. The counter resets on the next successful delivery.