Skip to main content
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.
Coverbase records every webhook delivery attempt as an audit row. Whether the delivery came from a domain-event fan-out, a workflow send_webhook action, or a manual test, there is one history record per attempt — including retries and deliveries that were blocked by the URL restrictions. Use the history to debug failing receivers, confirm a delivery happened, and monitor delivery health over time. The aggregate health of a subscription (last_delivery_status, delivery_success_rate, delivery_count) is also surfaced on the webhook object.

List delivery attempts

method
GET
GET /v1/webhooks/{webhook_id}/deliveries
Returns the delivery attempts for one webhook, newest first, paginated. Org-scoped to the API key.

Path parameters

webhook_id
string
required
The webhook subscription ID (cbwh_...).

Query parameters

limit
integer
default:"50"
Page size. Clamped to the range 1100 (values outside the range are clamped, not rejected).
offset
integer
default:"0"
Number of records to skip. Negative values are clamped to 0.

Example request

cURL
curl "https://api.coverbase.app/v1/webhooks/cbwh_d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9/deliveries?limit=50&offset=0" \
  -H "Authorization: Bearer ak_live_xxx"
Python
import os
import requests

API_KEY = os.environ["COVERBASE_API_KEY"]
BASE_URL = "https://api.coverbase.app"
webhook_id = "cbwh_d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9"

resp = requests.get(
    f"{BASE_URL}/v1/webhooks/{webhook_id}/deliveries",
    headers={"Authorization": f"Bearer {API_KEY}"},
    params={"limit": 50, "offset": 0},
    timeout=30,
)
resp.raise_for_status()
print(resp.json())

Example response

{
  "data": [
    {
      "id": "cbwhd_9c7b4a2e8b3c1a4d9e7f2c5b6a8d1e3f",
      "webhook_id": "cbwh_d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9",
      "event_id": "cbevt_8b3c1a4d9e7f2c5b6a8d1e3f9c7b4a2e",
      "event_type": "Vendor.Created",
      "status": "delivered",
      "response_status": 200,
      "response_time_ms": 142,
      "error": null,
      "payload": { "event_type": "Vendor.Created", "vendor_id": "cbvndr_e448ba62882143f3ba0c140bb2e30162" },
      "attempted_at": 1747400001,
      "created_at": 1747400001
    }
  ],
  "total": 1,
  "limit": 50,
  "offset": 0
}

Response fields

data
object[]
The page of delivery attempts, newest first. Each item:
total
integer
Total recorded attempts for this webhook, ignoring limit/offset. Page until offset + len(data) >= total.
limit
integer
The effective page size after clamping.
offset
integer
The effective offset after clamping.

Delivery status values

StatusMeaning
deliveredThe receiver returned an HTTP response (any status code). response_status and response_time_ms are populated.
timeoutThe request exceeded the 10-second per-attempt timeout.
errorA connection error, or the URL was blocked by the delivery-time SSRF re-check. error carries detail.
skippedThe subscription was not deliverable at send time (e.g. archived between dispatch and delivery).
delivered means a response was received, not that the receiver “succeeded”. If your endpoint returns a non-2xx, the attempt is still recorded as delivered with that response_status, and the delivery is retried.

Error responses

StatusBodyWhen
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.

Pagination example

Next page
curl "https://api.coverbase.app/v1/webhooks/cbwh_d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9/deliveries?limit=50&offset=50" \
  -H "Authorization: Bearer ak_live_xxx"
See API conventions → Timestamps for the epoch-seconds convention used by attempted_at and created_at.