Delivery records

Delivery records let you see what happened to each webhook delivery for an endpoint whether it succeeded, is retrying, or failed, and the last HTTP status observed. They are sanitized diagnostics: receiver response bodies, headers, signatures, secrets, and raw payloads are never captured. This view is read-only and does not replay, reset, or delete deliveries. For the signature and retry model see Webhooks overview.

GET/v1/control-plane/webhook-endpoints/{id}/deliveries

List deliveries

Lists the newest sanitized delivery records for one non-deleted webhook endpoint owned by the authenticated account. The endpoint is diagnostic only there is no replay, reset, delete, or patch. Deliveries can be retried by the platform and may appear more than once for the same event, so reconcile by event_id rather than by delivery id.

Request
curl "https://api-sandbox.emfakt.com/v1/control-plane/webhook-endpoints/we_zp8wM2uUYWcKiM5xdATxAg/deliveries" \  -H "Authorization: Bearer <access_token>"
200 response
{  "data": [    {      "id": "wd_2kCYq4m4G7YbUjvH0kC1dg",      "object": "webhook_delivery",      "event_id": "evt_V3sGDb5VXxLxzGzvYVw0Pw",      "event_type": "invoice.accepted",      "endpoint_id": "we_zp8wM2uUYWcKiM5xdATxAg",      "status": "succeeded",      "attempt_count": 1,      "last_http_status": 200,      "last_error_summary": null,      "next_retry_at": null,      "created_at": "2026-06-01T10:18:30Z",      "updated_at": "2026-06-01T10:18:31Z",      "last_attempted_at": "2026-06-01T10:18:31Z",      "delivered_at": "2026-06-01T10:18:31Z"    },    {      "id": "wd_6DnDrtNabjwjYH8NfRMSnQ",      "object": "webhook_delivery",      "event_id": "evt_XjW1g8KMqJj6fW3Az7bXzQ",      "event_type": "invoice.upo_available",      "endpoint_id": "we_zp8wM2uUYWcKiM5xdATxAg",      "status": "retrying",      "attempt_count": 1,      "last_http_status": 500,      "last_error_summary": "Webhook endpoint returned HTTP 500.",      "next_retry_at": "2026-06-01T10:19:31Z",      "created_at": "2026-06-01T10:18:30Z",      "updated_at": "2026-06-01T10:18:31Z",      "last_attempted_at": "2026-06-01T10:18:31Z",      "delivered_at": null    }  ]}

Delivery statuses

A delivery aggregates the outcome of one event to one endpoint across its attempts. The status reflects where that delivery currently stands.

  • pending

    The delivery was planned but has not been attempted yet.

  • delivering

    A worker has claimed the delivery and is sending it.

  • succeeded

    The endpoint returned a 2xx response.

  • retrying

    A retryable failure 429, 5xx, timeout, connection failure, or unexpected sender error occurred and attempts remain. next_retry_at gives the next attempt time.

  • failed

    A non-retryable failure a 3xx, a 4xx other than 429, an exhausted retryable failure, an unsafe delivery-time target, or a deterministic preparation failure.

  • endpoint_disabled

    The endpoint was disabled or deleted before send, so no HTTP request was made. attempt_count stays 0.

The WebhookDelivery object

Each record is a sanitized aggregate. last_error_summary is a product-owned, status-only string such as Webhook endpoint returned HTTP 500. receiver response bodies are never read into application-visible text, persisted, or returned.

  • idstring

    Public delivery ID, prefixed wd_. Do not de-duplicate by this value; use event_id.

  • objectwebhook_delivery

    Object type.

  • event_idstring

    Public event ID this delivery carries. Use it to de-duplicate.

  • event_typestring

    The event type delivered, one of the six invoice lifecycle events.

  • endpoint_idstring

    Public webhook endpoint ID.

  • statusstring

    Aggregate delivery status, as described above.

  • attempt_countinteger

    Number of outbound HTTP attempts. Stays 0 for endpoint_disabled.

  • last_http_statusinteger | null

    Last HTTP status received, or null for transport failures and not-yet-attempted deliveries.

  • last_error_summarystring | null

    Product-owned status-only failure summary, or null on success.

  • next_retry_atstring | null

    Next retry time while retrying; otherwise null.

  • created_atstring

    When the delivery was planned.

  • updated_atstring

    Last update timestamp.

  • last_attempted_atstring | null

    Last attempt timestamp, or null if never attempted.

  • delivered_atstring | null

    Successful delivery timestamp, or null if not yet delivered.