For AI agents: a documentation index is available at https://docs.coverbase.com/llms.txt — this page is also available in markdown by appending .md to the URL.
The Webhooks API manages webhook subscription records and can send a manual test delivery to a registered endpoint. For the delivery format, fan-out, signature verification, and the event catalog, see the Webhooks guide. For the audit trail of every attempt, see Webhook delivery history.
All endpoints are org-scoped to the API key. See API conventions for authentication and the error envelope.
Register a webhook
POST /v1/webhooks201 Created.
Request body
The public HTTPS endpoint Coverbase will POST to. Rejected with
400 invalid_url if it is not HTTPS, carries credentials, uses a non-standard port, or resolves to a private / loopback / link-local / metadata address. See URL restrictions.Event type strings to subscribe to. Strictly validated against the event catalog — any value not in the catalog fails with
422 invalid_event_types. Use the exact, case-sensitive values (e.g. Vendor.Created).Shared secret used to sign deliveries (HMAC-SHA256). Must be at least 16 characters. Write-only — it is never returned in any response.
Optional human-readable label.
Defaults to
true. When false, the subscription is created in a disabled state.Example request
Example response
201 Created:
Response fields
Webhook ID (
cbwh_...).The registered HTTPS endpoint.
Subscribed event strings.
The label, if set.
true when the subscription is active.Unix timestamp (seconds) when the webhook was created.
Status of the most recent recorded delivery attempt — one of
delivered, timeout, error, skipped — or null if there are no recorded deliveries yet.Fraction of recorded attempts that were
delivered, 0–1 (rounded to 4 dp). null when there are no recorded deliveries.Total recorded delivery attempts for this webhook.
0 when none.Error responses
Validation is applied in this order:secret, then url, then events.
| Status | Body | When |
|---|---|---|
| 400 | {"detail": {"code": "weak_secret", "message": "Secret must be at least 16 characters."}} | secret is shorter than 16 characters. Checked first. |
| 400 | {"detail": {"code": "invalid_url", "message": "Webhook URL must be HTTPS and must not target a private, link-local, loopback, or metadata address."}} | url is not a public HTTPS endpoint. See URL restrictions. |
| 422 | {"detail": {"code": "invalid_event_types", "message": "Unsupported event type(s): ..."}} | events contains a value not in the event catalog. |
| 422 | Standard validation error | Required fields missing or wrong type. See API conventions. |
List webhooks
GET /v1/webhooksExample response
last_delivery_status, delivery_success_rate, and delivery_count.
Update a webhook
PATCH /v1/webhooks/{webhook_id}null fields are left unchanged. Returns the updated webhook (same shape as the create response).
Request body
New endpoint. If provided, must start with
https://.Replace the subscribed event list. Strictly validated against the event catalog — an unsupported value fails with
422 invalid_event_types.Rotate the signing secret. If provided, must be at least 16 characters.
Update the label.
Enable or disable the subscription.
Example requests
Update events
Rotate the secret
Error responses
| Status | Body | When |
|---|---|---|
| 400 | {"detail": {"code": "weak_secret", "message": "..."}} | A new secret shorter than 16 characters was supplied. |
| 400 | {"detail": {"code": "invalid_url", "message": "Webhook URL must be HTTPS and must not target a private, link-local, loopback, or metadata address."}} | A new url that is not a public HTTPS endpoint was supplied. |
| 422 | {"detail": {"code": "invalid_event_types", "message": "Unsupported event type(s): ..."}} | A new events value is not in the event catalog. |
| 404 | {"detail": {"code": "webhook_not_found", "message": "Webhook not found."}} | The webhook_id does not exist or is not in the API key’s org. |
Delete a webhook
DELETE /v1/webhooks/{webhook_id}204 No Content.
cURL
| Status | Body | When |
|---|---|---|
| 204 | (empty) | Archived successfully. |
| 404 | {"detail": {"code": "webhook_not_found", "message": "Webhook not found."}} | The webhook_id does not exist or is not in the API key’s org. |
Test a webhook
POST /v1/webhooks/{webhook_id}/testRequest body
Event type string to send in the test delivery. Unlike subscription
events, this is not validated against the catalog — any string is accepted, including webhook.test.Optional. The object delivered as the envelope’s
data. Defaults to {"test": true}.Example request
Custom payload
Default payload
Example response
delivered reflects that the test was enqueued, not that the receiver accepted it. response_status and response_time_ms are always null on this response because delivery happens out of band. The actual attempt (and the receiver’s real status) is recorded in delivery history. The delivered envelope’s data is your payload (default {"test": true}).Error responses
| Status | Body | When |
|---|---|---|
| 404 | {"detail": {"code": "webhook_not_found", "message": "Webhook not found."}} | The webhook_id does not exist or is not in the API key’s org. |
List delivery attempts
GET /v1/webhooks/{webhook_id}/deliveriescURL
| Status | Body | When |
|---|---|---|
| 404 | {"detail": {"code": "webhook_not_found", "message": "Webhook not found."}} | The webhook_id does not exist or is not in the API key’s org. |
Appendix A: cURL quick reference
One block per endpoint, copy-paste ready. Set these once:Setup
Create a webhook
Validation errors
List webhooks (with delivery health)
Update a webhook
Send a test delivery
Delivery history (paginated, newest first)
Delete a webhook
Org-level API IP allowlist