Webhooks
Webhook-Endpunkte registrieren und Zustellungen einsehen oder erneut senden.
Register webhook endpoints and inspect/replay lifecycle deliveries.
Operationen
-
GET/webhook-endpointsList webhook endpoints for the active tenant/entity -
POST/webhook-endpointsRegister a webhook endpoint -
GET/webhook-endpoints/{id}Get one webhook endpoint (masked secret) -
PATCH/webhook-endpoints/{id}Update a webhook endpoint (url / subscribedTypes / status) -
DELETE/webhook-endpoints/{id}Disable a webhook endpoint (soft-delete) -
POST/webhook-endpoints/{id}/reveal-secretReveal the full signing secret (audit-logged, repeatable) -
POST/webhook-endpoints/{id}/rotate-secretRotate the signing secret -
POST/webhook-endpoints/{id}/test-eventSend a synthetic test event (async, "Testereignis senden") -
GET/webhook-endpoints/{id}/deliveriesPer-endpoint delivery log (cursor-paginated) -
GET/webhook-deliveriesTenant-wide webhook delivery log (cursor-paginated) -
GET/webhook-deliveries/{id}One delivery + its ordered attempt timeline -
POST/webhook-deliveries/{id}/replayReplay a delivery (async, "Erneut senden")
List webhook endpoints for the active tenant/entity
GET /webhook-endpoints
Admin/owner only (requireTenantContext + requireRole('admin')). Bounded, small set per tenant. Secrets are never returned here — only the masked secretPrefix. Each item also carries lastDeliveredAt, the last successful delivery instant.
- Erforderlicher Scope
- keiner
- Zugang
- nur mit angemeldeter Sitzung – ein API-Schlüssel wird abgelehnt
(
oidc-only)
Antworten
-
200The tenant's webhook endpoints (masked secrets).
application/jsonobject -
403Caller lacks the admin role (
insufficient_role).
Register a webhook endpoint
POST /webhook-endpoints
Creates an endpoint and returns it WITH the full signing secret exactly once (secret, prominence: show-once, but also retrievable later via /reveal-secret). mode is fixed at creation to the caller's active auth-context mode and is never mutable afterward; supplying a different mode (or a non-active entityId) is a 400. url must be HTTPS. Honors the optional Idempotency-Key header so a retried registration does not create a second endpoint minting a second signing secret (the same duplicate-is-dangerous case as POST /tenants/{tenantId}/api-keys). A retry of a registration that already succeeded answers 409 idempotency_replay_secret_withheld with the endpoint it created, minus secret; read the secret again with /reveal-secret.
- Erforderlicher Scope
- keiner
- Zugang
- nur mit angemeldeter Sitzung – ein API-Schlüssel wird abgelehnt
(
oidc-only)
Parameter
| Parameter | In | Typ | Beschreibung |
|---|---|---|---|
Idempotency-Key | Header | string | Optional client-supplied key that makes this mutating request safe to retry. The FIRST request runs and its outcome is recorded keyed by Länge: max. 255 |
Request-Body erforderlich
application/json CreateWebhookEndpoint
Antworten
-
201Created. Body is the endpoint plus the full plaintext secret.
application/jsonWebhookEndpointWithSecret -
400Validation error, non-HTTPS url,
mode_mismatch, orentity_mismatch. -
403Caller lacks the admin role.
-
409Idempotency-Key conflict, on a route whose success body carries a one-time secret.
IDEMPOTENCY_KEY_REUSED_WITH_DIFFERENT_BODY— the key was already used with a different request body;REQUEST_IN_PROGRESS— the first request bearing this key is still in flight (retryable);idempotency_replay_secret_withheld— the first request bearing this key already SUCCEEDED. Nothing new was created. The secret it returned is shown only once and is never stored for a replay, so this answer carries the created resource inresourcewithout the secret. Do not retry it.application/jsonIdempotencyConflictOrSecretWithheldError
Get one webhook endpoint (masked secret)
GET /webhook-endpoints/{id}
- Erforderlicher Scope
- keiner
- Zugang
- nur mit angemeldeter Sitzung – ein API-Schlüssel wird abgelehnt
(
oidc-only)
Parameter
| Parameter | In | Typ | Beschreibung |
|---|---|---|---|
id erforderlich | Pfad | string (uuid) | Webhook endpoint id. |
Antworten
-
200The endpoint (masked
secretPrefix, never the plaintext).application/jsonWebhookEndpoint -
404Not found / not visible to the caller.
Update a webhook endpoint (url / subscribedTypes / status)
PATCH /webhook-endpoints/{id}
mode is NOT mutable — a body containing mode (or any unknown field) is rejected 400. Every successful update writes an audit-log entry.
- Erforderlicher Scope
- keiner
- Zugang
- nur mit angemeldeter Sitzung – ein API-Schlüssel wird abgelehnt
(
oidc-only)
Parameter
| Parameter | In | Typ | Beschreibung |
|---|---|---|---|
id erforderlich | Pfad | string (uuid) | Webhook endpoint id. |
Request-Body erforderlich
application/json UpdateWebhookEndpoint
Antworten
-
200The updated endpoint.
application/jsonWebhookEndpoint -
400Validation error (incl. an attempt to change
mode). -
404Not found / not visible.
Disable a webhook endpoint (soft-delete)
DELETE /webhook-endpoints/{id}
Soft-delete: flips status='disabled' so the delivery log stays referentially intact. Audit-logged.
- Erforderlicher Scope
- keiner
- Zugang
- nur mit angemeldeter Sitzung – ein API-Schlüssel wird abgelehnt
(
oidc-only)
Parameter
| Parameter | In | Typ | Beschreibung |
|---|---|---|---|
id erforderlich | Pfad | string (uuid) | Webhook endpoint id. |
Antworten
-
204Disabled.
-
404Not found / not visible.
Reveal the full signing secret (audit-logged, repeatable)
POST /webhook-endpoints/{id}/reveal-secret
Decrypts and returns the full plaintext signing secret (the secret is retrievable, not hash-only). Writes an audit-log entry on EVERY call (a repeatable toggle, not show-once).
- Erforderlicher Scope
- keiner
- Zugang
- nur mit angemeldeter Sitzung – ein API-Schlüssel wird abgelehnt
(
oidc-only)
Parameter
| Parameter | In | Typ | Beschreibung |
|---|---|---|---|
id erforderlich | Pfad | string (uuid) | Webhook endpoint id. |
Antworten
-
200The full plaintext signing secret.
application/jsonobject -
404Not found / not visible.
Rotate the signing secret
POST /webhook-endpoints/{id}/rotate-secret
Generates a new signing secret and returns it once; the old secret stops validating immediately (no overlap window). Audit-logged.
- Erforderlicher Scope
- keiner
- Zugang
- nur mit angemeldeter Sitzung – ein API-Schlüssel wird abgelehnt
(
oidc-only)
Parameter
| Parameter | In | Typ | Beschreibung |
|---|---|---|---|
id erforderlich | Pfad | string (uuid) | Webhook endpoint id. |
Antworten
-
200The endpoint plus the new full plaintext secret.
application/jsonWebhookEndpointWithSecret -
404Not found / not visible.
Send a synthetic test event (async, "Testereignis senden")
POST /webhook-endpoints/{id}/test-event
Enqueues a synthetic=true event (document_id=null, representative metadata-only payload) and the SINGLE delivery targeting ONLY this endpoint, dispatched through the normal delivery worker (signed identically to a real delivery). Returns 202 with the delivery id to poll (GET /webhook-deliveries/{id}) — it does NOT POST synchronously. eventCode must be in the endpoint's subscribed set (else 400 event_not_subscribed). Synthetic events are never metered / never counted as a lifecycle transition. Audit-logged.
- Erforderlicher Scope
- keiner
- Zugang
- nur mit angemeldeter Sitzung – ein API-Schlüssel wird abgelehnt
(
oidc-only)
Parameter
| Parameter | In | Typ | Beschreibung |
|---|---|---|---|
id erforderlich | Pfad | string (uuid) | Webhook endpoint id. |
Request-Body erforderlich
application/json object
Antworten
-
202The synthetic event's enqueued delivery (poll its id).
application/jsonEnqueuedWebhookDelivery -
400Not subscribed to eventCode (
event_not_subscribed), or validation error. -
404Endpoint not found / not visible.
Per-endpoint delivery log (cursor-paginated)
GET /webhook-endpoints/{id}/deliveries
Cursor-paginated ({ data, nextCursor }), keyset over (created_at, id), newest first. Metadata only — no request/response bodies. 404 if the endpoint is not visible to the caller.
- Erforderlicher Scope
- keiner
- Zugang
- nur mit angemeldeter Sitzung – ein API-Schlüssel wird abgelehnt
(
oidc-only)
Parameter
| Parameter | In | Typ | Beschreibung |
|---|---|---|---|
id erforderlich | Pfad | string (uuid) | Webhook endpoint id. |
cursor | Query | string | Opaque keyset cursor from a prior page's |
limit | Query | integer | Page size for cursor-paginated reads. Standard: 25 Bereich: ≥ 1, ≤ 100 |
eventCode | Query | WebhookEventCode | Filter by the STABLE event code. |
status | Query | string | Filter by delivery status. A single value exact-matches; a comma-separated set (e.g. Muster: ^(pending|delivering|succeeded|retrying|failed)(,(pending|delivering|succeeded|retrying|failed))*$ |
from | Query | string (date-time) | Inclusive |
to | Query | string (date-time) | Inclusive |
Antworten
-
200A page of delivery records for this endpoint.
application/jsonWebhookDeliveryPage -
400The query string was refused. Three distinguishable facts share this status, and a client should branch on the
errorcode rather than on the status:unknown_query_parameter— the request named one or more query parameters this deployment does not define, andparameterslists their names. Nothing was filtered and nothing was written. This is a DEPLOY-ORDER signal: it is what a client released ahead of the API sees, and it replaces the older behaviour in which an unrecognised parameter was silently ignored and the request answered200 OKwith the UNFILTERED collection — indistinguishable, to the caller, from the filter having been applied.validation_error— a parameter this endpoint does define carried an unusable value (including a required one being absent or too short).issues[]names the parameter and what was wrong with it.invalid_cursor— on cursor-paginated endpoints, the pagination cursor is malformed. No response on this path ever echoes a submitted VALUE; only parameter names appear.application/jsonUnknownQueryParameterError | ValidationError -
404Endpoint not found / not visible.
Tenant-wide webhook delivery log (cursor-paginated)
GET /webhook-deliveries
Cursor-paginated latest-state delivery log across the tenant's endpoints. Metadata only, no bodies. Served from the parent row — no join. Filter by endpointId/eventCode/status/date range.
- Erforderlicher Scope
- keiner
- Zugang
- nur mit angemeldeter Sitzung – ein API-Schlüssel wird abgelehnt
(
oidc-only)
Parameter
| Parameter | In | Typ | Beschreibung |
|---|---|---|---|
cursor | Query | string | Opaque keyset cursor from a prior page's |
limit | Query | integer | Page size for cursor-paginated reads. Standard: 25 Bereich: ≥ 1, ≤ 100 |
endpointId | Query | string (uuid) | Restrict to one endpoint's deliveries. |
eventCode | Query | WebhookEventCode | Filter by the STABLE event code. |
status | Query | string | Filter by delivery status. A single value exact-matches; a comma-separated set (e.g. Muster: ^(pending|delivering|succeeded|retrying|failed)(,(pending|delivering|succeeded|retrying|failed))*$ |
from | Query | string (date-time) | Inclusive |
to | Query | string (date-time) | Inclusive |
Antworten
-
200A page of delivery records.
application/jsonWebhookDeliveryPage -
400The query string was refused. Three distinguishable facts share this status, and a client should branch on the
errorcode rather than on the status:unknown_query_parameter— the request named one or more query parameters this deployment does not define, andparameterslists their names. Nothing was filtered and nothing was written. This is a DEPLOY-ORDER signal: it is what a client released ahead of the API sees, and it replaces the older behaviour in which an unrecognised parameter was silently ignored and the request answered200 OKwith the UNFILTERED collection — indistinguishable, to the caller, from the filter having been applied.validation_error— a parameter this endpoint does define carried an unusable value (including a required one being absent or too short).issues[]names the parameter and what was wrong with it.invalid_cursor— on cursor-paginated endpoints, the pagination cursor is malformed. No response on this path ever echoes a submitted VALUE; only parameter names appear.application/jsonUnknownQueryParameterError | ValidationError
One delivery + its ordered attempt timeline
GET /webhook-deliveries/{id}
Returns the delivery latest-state PLUS its attempts[] (oldest→newest), which backs the per-attempt timeline. Metadata only.
- Erforderlicher Scope
- keiner
- Zugang
- nur mit angemeldeter Sitzung – ein API-Schlüssel wird abgelehnt
(
oidc-only)
Parameter
| Parameter | In | Typ | Beschreibung |
|---|---|---|---|
id erforderlich | Pfad | string (uuid) | Delivery id. |
Antworten
-
200The delivery with its attempt history.
application/jsonWebhookDeliveryDetail -
404Not found / not visible.
Replay a delivery (async, "Erneut senden")
POST /webhook-deliveries/{id}/replay
Creates a NEW delivery record, linked to the original, referencing the same frozen event + endpoint, pending with no attempts yet, dispatched through the normal delivery worker. The original delivery and its attempt history stay IMMUTABLE; the replayed body is byte-identical (re-signed with a fresh timestamp — legally safe per UStAE 14c.1 Abs. 4 Satz 7). Returns 202 with the new delivery id to poll. Audit-logged.
- Erforderlicher Scope
- keiner
- Zugang
- nur mit angemeldeter Sitzung – ein API-Schlüssel wird abgelehnt
(
oidc-only)
Parameter
| Parameter | In | Typ | Beschreibung |
|---|---|---|---|
id erforderlich | Pfad | string (uuid) | The original delivery id to replay. |
Antworten
-
202The new replay delivery (poll its id).
application/jsonEnqueuedWebhookDelivery -
404Original delivery not found / not visible.
Datenmodelle
Jedes Datenmodell dieser Gruppe einmal, mit allen Feldern – auch den verschachtelten. Verschachtelte Objekte sind aufklappbar; ein benannter Typ verweist auf seinen eigenen Abschnitt.
WebhookEndpointListItem object
A WebhookEndpoint as returned by the list endpoint, plus lastDeliveredAt — the instant of the last SUCCESSFUL delivery to this endpoint, computed by a JOIN over the delivery records (MAX(completed_at) FILTER (status='succeeded')), never denormalized onto the endpoint row.
| Feld | Typ | Beschreibung |
|---|---|---|
id erforderlich | string (uuid) | |
tenantId | string (uuid) | |
entityId erforderlich | string (uuid) | null | NULL would be a whole-tenant endpoint (deferred; always the active entity today). |
mode erforderlich | string | Set at creation, never mutable. Werte: "live", "test" |
url erforderlich | string | HTTPS receiver URL. |
subscribedTypes erforderlich | Array<WebhookEventCode> | |
status erforderlich | string | Werte: "active", "disabled" |
secretPrefix erforderlich | string | Masked signing-secret identifier ( |
secretRotatedAt erforderlich | string (date-time) | |
createdBy erforderlich | string (uuid) | |
createdAt erforderlich | string (date-time) | |
updatedAt erforderlich | string (date-time) | |
lastDeliveredAt erforderlich | string (date-time) | null | Timestamp of the last successful delivery to this endpoint; null if none has ever succeeded. |
Verwendet von:
GET /webhook-endpoints
CreateWebhookEndpoint object
| Feld | Typ | Beschreibung |
|---|---|---|
url erforderlich | string | HTTPS-only receiver URL (non-HTTPS rejected 400). |
subscribedTypes erforderlich | Array<WebhookEventCode> | Elemente: min. 1 |
mode | string | Optional; must equal the caller's active mode (else 400). Fixed at creation. Werte: "live", "test" |
entityId | string (uuid) | Optional; must equal the caller's active entity (else 400). |
Verwendet von:
POST /webhook-endpoints
WebhookEndpointWithSecret object
A WebhookEndpoint plus the full plaintext secret, returned once.
| Feld | Typ | Beschreibung |
|---|---|---|
id erforderlich | string (uuid) | |
tenantId | string (uuid) | |
entityId erforderlich | string (uuid) | null | NULL would be a whole-tenant endpoint (deferred; always the active entity today). |
mode erforderlich | string | Set at creation, never mutable. Werte: "live", "test" |
url erforderlich | string | HTTPS receiver URL. |
subscribedTypes erforderlich | Array<WebhookEventCode> | |
status erforderlich | string | Werte: "active", "disabled" |
secretPrefix erforderlich | string | Masked signing-secret identifier ( |
secretRotatedAt erforderlich | string (date-time) | |
createdBy erforderlich | string (uuid) | |
createdAt erforderlich | string (date-time) | |
updatedAt erforderlich | string (date-time) | |
secret erforderlich | string | The full plaintext signing secret. Shown once here; retrievable later via |
Verwendet von:
POST /webhook-endpoints , POST /webhook-endpoints/{id}/rotate-secret
IdempotencyConflictOrSecretWithheldError object
| Feld | Typ | Beschreibung |
|---|---|---|
error erforderlich | string | Werte: "IDEMPOTENCY_KEY_REUSED_WITH_DIFFERENT_BODY", "REQUEST_IN_PROGRESS", "idempotency_replay_secret_withheld" |
message | string | |
resource | object | Only with |
Verwendet von:
POST /webhook-endpoints
WebhookEndpoint object
A registered webhook receiver. The signing secret is NEVER present here — only the masked secretPrefix (whsec_ + first 8 chars).
| Feld | Typ | Beschreibung |
|---|---|---|
id erforderlich | string (uuid) | |
tenantId | string (uuid) | |
entityId erforderlich | string (uuid) | null | NULL would be a whole-tenant endpoint (deferred; always the active entity today). |
mode erforderlich | string | Set at creation, never mutable. Werte: "live", "test" |
url erforderlich | string | HTTPS receiver URL. |
subscribedTypes erforderlich | Array<WebhookEventCode> | |
status erforderlich | string | Werte: "active", "disabled" |
secretPrefix erforderlich | string | Masked signing-secret identifier ( |
secretRotatedAt erforderlich | string (date-time) | |
createdBy erforderlich | string (uuid) | |
createdAt erforderlich | string (date-time) | |
updatedAt erforderlich | string (date-time) |
Verwendet von:
GET /webhook-endpoints/{id} , PATCH /webhook-endpoints/{id}
UpdateWebhookEndpoint object
Mutable fields only. mode is intentionally absent — including it (or any unknown field) is rejected 400 (mode is immutable).
- Mindestens 1 Feld(er)
| Feld | Typ | Beschreibung |
|---|---|---|
url | string | HTTPS-only. |
subscribedTypes | Array<WebhookEventCode> | Elemente: min. 1 |
status | string | Werte: "active", "disabled" |
Verwendet von:
PATCH /webhook-endpoints/{id}
WebhookEventCode string
A STABLE internal event code (never the wire label). The dashboard maps these to display labels via event-types.ts: transmission_accepted→"sent", transmission_rejected→"rejected". The Zahlungsabgleich two-sided-emit codes are additive: invoice_paid→"invoice.paid" (an issued invoice became fully paid), payment_partial→"payment.partial" (a partial payment was allocated), payment_reconciled→"payment.reconciled" (a payment reconciled an invoice without a clean full flip, e.g. an overpayment). The retraction code is additive too: payment_reversed→"payment.reversed" (a recorded allocation was reversed by a compensating entry; if that takes the invoice back below fully paid it also un-pays it).
⭐ The payment family is a SEQUENCE, not a set of terminal flags. invoice.paid may be delivered more than once for one invoice; it may be followed by payment.reversed; and that may be followed by invoice.paid again — because a receivable can be settled, retracted and settled again. Apply them in created_at order — not arrival order — and treat the latest created_at as current. Ordering by arrival rebuilds the very bug this contract avoids: delivery is at-least-once on a 1m→24h retry ladder, so a retried invoice.paid can reach you after a payment.reversed. Two events with different ids are two distinct occurrences even when type is identical; invoice.paid is not a latch, and the absence of a further event is not confirmation.
The document-lifecycle codes (issued, archived, transmission_accepted, transmission_rejected) are unchanged: those transitions happen once per document by nature and are still emitted at most once.
- Werte: "issued", "transmission_accepted", "transmission_rejected", "archived", "invoice_paid", "payment_reconciled", "payment_partial", "payment_reversed"
Verwendet von:
POST /webhook-endpoints/{id}/test-event , GET /webhook-endpoints/{id}/deliveries , GET /webhook-deliveries
EnqueuedWebhookDelivery object
The delivery enqueued by a test-event or replay action — poll deliveryId via GET /webhook-deliveries/{id} for its outcome.
| Feld | Typ | Beschreibung |
|---|---|---|
deliveryId erforderlich | string (uuid) | |
eventId erforderlich | string (uuid) | The frozen event this delivery sends. |
synthetic erforderlich | boolean | true for a test event; carried through the delivery. |
replayOf erforderlich | string (uuid) | null | The original delivery id for a replay; null for a test event. |
Verwendet von:
POST /webhook-endpoints/{id}/test-event , POST /webhook-deliveries/{id}/replay
WebhookDeliveryPage object
A cursor-paginated page of deliveries ({ data, nextCursor }).
| Feld | Typ | Beschreibung |
|---|---|---|
data erforderlich | Array<WebhookDelivery> | |
nextCursor erforderlich | string | null | Opaque cursor for the next page; null on the last page. |
Verwendet von:
GET /webhook-endpoints/{id}/deliveries , GET /webhook-deliveries
UnknownQueryParameterError object
The request named query parameters this endpoint does not define. A list endpoint refuses them rather than ignoring them, so a caller can never mistake an UNFILTERED collection for a filtered one.
| Feld | Typ | Beschreibung |
|---|---|---|
error erforderlich | string | Werte: "unknown_query_parameter" |
parameters erforderlich | Array<string> | The unrecognised parameter NAMES, deduplicated and sorted. Bounded at ten entries, and a name longer than 64 characters is omitted — a parameter name is caller-supplied text, and this response never reflects unbounded caller input. The array may therefore be EMPTY while the refusal still stands: the refusal is decided by the request, not by the length of this list. |
message | string | |
requestId | string |
Verwendet von:
GET /webhook-endpoints/{id}/deliveries , GET /webhook-deliveries
ValidationError object
A refused request body. error is validation_error when the body was read and failed validation (each problem is listed in issues), or invalid_json when the body is not valid JSON at all (then issues is absent). An unparsable body is answered 400 invalid_json on every operation that takes a JSON body. The submitted body is never echoed.
| Feld | Typ | Beschreibung | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
error | string | |||||||||||||
issues | Array<object> | Felder
|
Verwendet von:
GET /webhook-endpoints/{id}/deliveries , GET /webhook-deliveries
WebhookDeliveryDetail object
A delivery plus its ordered per-attempt timeline (oldest→newest).
| Feld | Typ | Beschreibung |
|---|---|---|
id erforderlich | string (uuid) | |
tenantId | string (uuid) | |
entityId erforderlich | string (uuid) | |
mode erforderlich | string | Werte: "live", "test" |
endpointId erforderlich | string (uuid) | |
eventId erforderlich | string (uuid) | The stable event id — the receiver's dedup key. |
eventCode erforderlich | WebhookEventCode | Stored STABLE code, for filtering. |
eventLabel erforderlich | string | Wire label rendered from |
synthetic erforderlich | boolean | True for a test-delivery (never metered/counted as a lifecycle transition). |
status erforderlich | string | Werte: "pending", "delivering", "succeeded", "retrying", "failed" |
attemptCount erforderlich | integer | |
lastResponseStatus | integer | null | HTTP status of the last attempt (null on timeout/connection error). |
lastResponseMs | integer | null | |
nextRetryAt | string (date-time) | null | |
firstAttemptedAt | string (date-time) | null | |
completedAt | string (date-time) | null | |
replayOf erforderlich | string (uuid) | null | Non-null for a replay delivery; references the original. |
createdAt erforderlich | string (date-time) | |
updatedAt erforderlich | string (date-time) | |
attempts erforderlich | Array<WebhookDeliveryAttempt> |
Verwendet von:
GET /webhook-deliveries/{id}
WebhookDelivery object
One delivery record: latest-state + timing METADATA only. No request or response bodies are ever stored or returned (GDPR-by-design).
| Feld | Typ | Beschreibung |
|---|---|---|
id erforderlich | string (uuid) | |
tenantId | string (uuid) | |
entityId erforderlich | string (uuid) | |
mode erforderlich | string | Werte: "live", "test" |
endpointId erforderlich | string (uuid) | |
eventId erforderlich | string (uuid) | The stable event id — the receiver's dedup key. |
eventCode erforderlich | WebhookEventCode | Stored STABLE code, for filtering. |
eventLabel erforderlich | string | Wire label rendered from |
synthetic erforderlich | boolean | True for a test-delivery (never metered/counted as a lifecycle transition). |
status erforderlich | string | Werte: "pending", "delivering", "succeeded", "retrying", "failed" |
attemptCount erforderlich | integer | |
lastResponseStatus | integer | null | HTTP status of the last attempt (null on timeout/connection error). |
lastResponseMs | integer | null | |
nextRetryAt | string (date-time) | null | |
firstAttemptedAt | string (date-time) | null | |
completedAt | string (date-time) | null | |
replayOf erforderlich | string (uuid) | null | Non-null for a replay delivery; references the original. |
createdAt erforderlich | string (date-time) | |
updatedAt erforderlich | string (date-time) |
Verwendet von:
GET /webhook-endpoints/{id}/deliveries , GET /webhook-deliveries
WebhookDeliveryAttempt object
One immutable attempt in a delivery's history. Metadata only — coarse error category, never a body/transcript.
| Feld | Typ | Beschreibung |
|---|---|---|
id erforderlich | string (uuid) | |
attemptNo erforderlich | integer | |
responseStatus | integer | null | |
responseMs | integer | null | |
outcome erforderlich | string | Werte: "succeeded", "failed_retryable", "failed_terminal" |
errorCategory | string | null | Werte: "timeout", "connection", "http_5xx", "http_4xx" |
attemptedAt erforderlich | string (date-time) |
Verwendet von:
GET /webhook-deliveries/{id}
Nach oben · Alle Ressourcengruppen · OpenAPI-Spezifikation (YAML)