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.
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.
curl "https://api-sandbox.emfakt.com/v1/control-plane/webhook-endpoints/we_zp8wM2uUYWcKiM5xdATxAg/deliveries" \ -H "Authorization: Bearer <access_token>"{ "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.
pendingThe delivery was planned but has not been attempted yet.
deliveringA worker has claimed the delivery and is sending it.
succeededThe endpoint returned a
2xxresponse.retryingA retryable failure
429,5xx, timeout, connection failure, or unexpected sender error occurred and attempts remain.next_retry_atgives the next attempt time.failedA non-retryable failure a
3xx, a4xxother than429, an exhausted retryable failure, an unsafe delivery-time target, or a deterministic preparation failure.endpoint_disabledThe endpoint was disabled or deleted before send, so no HTTP request was made.
attempt_countstays0.
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.
idstringPublic delivery ID, prefixed
wd_. Do not de-duplicate by this value; useevent_id.objectwebhook_deliveryObject type.
event_idstringPublic event ID this delivery carries. Use it to de-duplicate.
event_typestringThe event type delivered, one of the six invoice lifecycle events.
endpoint_idstringPublic webhook endpoint ID.
statusstringAggregate delivery status, as described above.
attempt_countintegerNumber of outbound HTTP attempts. Stays
0forendpoint_disabled.last_http_statusinteger | nullLast HTTP status received, or null for transport failures and not-yet-attempted deliveries.
last_error_summarystring | nullProduct-owned status-only failure summary, or null on success.
next_retry_atstring | nullNext retry time while
retrying; otherwise null.created_atstringWhen the delivery was planned.
updated_atstringLast update timestamp.
last_attempted_atstring | nullLast attempt timestamp, or null if never attempted.
delivered_atstring | nullSuccessful delivery timestamp, or null if not yet delivered.