DialerBee APIv1 · 1.0.0-rc6

Webhooks

List webhook events

GET /v1/webhook-events

Scope
webhooks:read
Tier
Tier 1
Data
Account data
Idempotency
Idempotency-Key: not used
Limit
Up to 100 per page (default 50)

Events of the last 30 days, newest first, each with its deliveries. Delivery is at least once: de-duplicate on the event id.

Parameters

NameInTypeRequiredDescription
limitqueryintegerno (min 1; max 100; default 50)
cursorquerystringnopage.next_cursor from the previous page. Opaque; bound to your account, API client and filters. (min length 1; max length 1024)
typequeryone of call.completed, ai_call.completed, disposition.logged, appointment.booked, appointment.moved, appointment.cancelled, webhook.testno
webhook_idquerystring (WebhookEndpointId)no
X-Correlation-IDheaderstringnoYour own trace value, logged with the request. Metadata only, never identity. (min length 1; max length 128)

Response

200: One page of events.

HeaderMeaning
X-Request-IDThe DialerBee request id. Quote it to support. Every response carries X-Request-ID: req_<ULID>, or edge_<32 hex> when the edge answered before the request reached the API.
Cache-ControlAlways no-store.

Examples

Request example

curl

curl -sS -X GET \
  "https://app.dialerbee.com/api/v1/webhook-events?limit=50" \
  -H "Authorization: Bearer $DIALERBEE_API_KEY"

Python (SDK)

from dialerbee import DialerBee

db = DialerBee()  # reads DIALERBEE_API_KEY from the environment

page = db.webhook_events.list(limit=50)
for item in page:  # this page, then every following page
    print(item.id)

Response example

200

{
  "data": [
    {
      "id": "evt_0f8fad5b-d9cb-469f-a165-70867728950e",
      "type": "call.completed",
      "created_at": "2026-09-29T09:15:00Z",
      "api_version": "v1",
      "schema_version": 1,
      "deliveries": [
        {
          "id": "whd_0f8fad5b-d9cb-469f-a165-70867728950e",
          "webhook_id": "wh_0f8fad5b-d9cb-469f-a165-70867728950e",
          "status": "delivered",
          "attempts": 1,
          "replay_of": null,
          "last_status_code": 200,
          "last_attempt_at": "2026-09-29T11:58:00Z",
          "next_attempt_at": "2026-09-30T10:00:00Z",
          "delivered_at": "2026-09-29T12:00:02Z",
          "failure_reason": null,
          "created_at": "2026-09-29T09:15:00Z"
        }
      ]
    }
  ],
  "page": {
    "next_cursor": "c1.example-opaque-cursor",
    "has_more": true
  }
}

Error examples

400 invalid_cursor

{
  "type": "https://docs.dialerbee.com/errors/invalid-cursor",
  "title": "Invalid cursor",
  "status": 400,
  "detail": "The cursor is not valid for this request: it was changed, it belongs to another list or other filters, or it expired.",
  "instance": "urn:dialerbee:request:req_01K6BZ3M9X4T7Q2V8N5R6P1W0C",
  "code": "invalid_cursor",
  "request_id": "req_01K6BZ3M9X4T7Q2V8N5R6P1W0C"
}

403 insufficient_scope

{
  "type": "https://docs.dialerbee.com/errors/insufficient-scope",
  "title": "Not permitted",
  "status": 403,
  "detail": "The API client does not hold the scope this operation requires.",
  "instance": "urn:dialerbee:request:req_01K6BZ3M9X4T7Q2V8N5R6P1W0C",
  "code": "insufficient_scope",
  "request_id": "req_01K6BZ3M9X4T7Q2V8N5R6P1W0C"
}

401 invalid_api_key

{
  "type": "https://docs.dialerbee.com/errors/invalid-api-key",
  "title": "Invalid API key",
  "status": 401,
  "detail": "The Authorization header is missing, is not Bearer dbk_live_..., or the key is not recognised, has expired or was revoked (one answer for every key problem, so a key's state is never revealed).",
  "instance": "urn:dialerbee:request:req_01K6BZ3M9X4T7Q2V8N5R6P1W0C",
  "code": "invalid_api_key",
  "request_id": "req_01K6BZ3M9X4T7Q2V8N5R6P1W0C"
}

Errors

StatusCodeTitle
401invalid_api_keyInvalid API key
403api_access_disabledAPI access disabled
403ip_not_allowedIP address not allowed
403insufficient_scopeNot permitted
400credential_in_urlCredential in URL
400, 422validation_failedInvalid request
400invalid_cursorInvalid cursor
429rate_limit_exceededToo many requests
503temporarily_unavailableTemporarily unavailable
503upstream_unavailableTemporarily unavailable
502upstream_invalid_responseUpstream error
500internal_errorInternal error

Objects

WebhookEventList

FieldTypeRequiredDescription
dataarray of WebhookEventyes
pagePageyesPass next_cursor as cursor to get the next page. null means this is the last page.

Page

Pass next_cursor as cursor to get the next page. null means this is the last page.

FieldTypeRequiredDescription
next_cursorstring or nullyes (max length 1024)
has_morebooleanyes

WebhookEvent

FieldTypeRequiredDescription
idstring (WebhookEventId)yesA webhook event. Retries and replays keep the same event id. evt_ + a lower-case UUID.
typeone of call.completed, ai_call.completed, disposition.logged, appointment.booked, appointment.moved, appointment.cancelled, webhook.testyes
created_atstring (date-time)yes
api_versionone of v1yes
schema_versionintegeryes (min 1)
deliveriesarray of WebhookDeliveryyes

WebhookDelivery

FieldTypeRequiredDescription
idstring (WebhookDeliveryId)yesOne delivery of an event to one endpoint. A replay is a new delivery. whd_ + a lower-case UUID.
webhook_idstring (WebhookEndpointId)yesA webhook endpoint. wh_ + a lower-case UUID.
statusone of pending, retry_scheduled, delivered, failed, cancelledyes
attemptsintegeryes
replay_ofstring (WebhookDeliveryId) or nullyes
last_status_codeinteger or nullyes
last_attempt_atstring (date-time) or nullyes
next_attempt_atstring (date-time) or nullyes
delivered_atstring (date-time) or nullyes
failure_reasonstring or nullyesWhy the delivery stopped being retried, if it did.
created_atstring (date-time)yes