Skip to content

List delivery attempts

GET
/v1/webhook-subscriptions/{id}/deliveries
curl --request GET \
--url https://api.aerandil.com/v1/webhook-subscriptions/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/deliveries \
--header 'Authorization: Bearer <token>'

Per-attempt audit of every delivery the worker made for one subscription, newest first. Each row records the seq range covered, attempt number, HTTP status (when the receiver answered), and a 512-byte response excerpt (the wire-level evidence operators need to debug a misbehaving receiver).

Use this surface to root-cause a dead_letter subscription before resetting it — the run of failed attempts surfaces the receiver’s last response shape.

id
required
string format: uuid

Subscription id.

limit
integer
>= 1 <= 500

Page size. Default 50, server-clamps to 500.

Delivery audit for one subscription.

Media typeapplication/json
object
data
required
Array<object>

One row in webhook_deliveries — append-only audit per attempt. The wire-level evidence operators need to debug a misbehaving receiver.

object
attempt
required

1-based attempt counter.

integer
>= 1
attempted_at
required
string format: date-time
completed_at

When the attempt finished — success, failure, or timeout. Unset only if a worker crashed mid-flight.

string format: date-time
error

Transport-level error message when the receiver did not answer (connection refused, TLS handshake failure, timeout, etc.).

string
from_seq
required

Inclusive lower bound of the seq range covered by this attempt.

integer
id
required
string format: uuid
response_excerpt

First 512 bytes of the receiver’s response body.

string
<= 512 characters
status
required

Per-attempt delivery outcome. Distinct from WebhookSubscriptionStatus: a single delivery row can be failed while the parent subscription stays active (within retry budget).

Allowed values: success failed dead_letter
status_code

HTTP status the receiver returned. Unset on transport errors (receiver never responded).

integer
subscription_id
required
string format: uuid
to_seq
required

Inclusive upper bound. A success advances the subscription cursor to to_seq; a failure leaves it where it was.

integer
Example
{
"data": [
{
"status": "success"
}
]
}

No subscription with that id for this tenant.

Media typeapplication/json

Structured error wrapper. Every non-2xx response from any Aerandil endpoint serialises to this shape; the HTTP status carries the failure class (4xx/5xx), the body adds a stable code for programmatic dispatch plus a human-readable message.

object
error
required
object
code
required

Stable, programmatic error code (e.g. unauthorized, forbidden, not_found, invalid_body, invalid_url, precondition_failed, no_secondary_key). Clients dispatch on code, not on the message (which may be localised or contextualised in future versions).

string
instance_id

Request-id correlation handle echoed on the request-id response header — support teams correlate without scraping logs.

string
message
required

Human-readable explanation of the failure.

string
parameters

Per-error structured detail. The shape varies by code (e.g. forbidden_action carries {"action": "..."}; precondition_failed carries {"current_version": N}).

Examplegenerated
{
"error": {
"code": "example",
"instance_id": "example",
"message": "example",
"parameters": "example"
}
}

invalid_limit — limit must be positive.

Media typeapplication/json

Structured error wrapper. Every non-2xx response from any Aerandil endpoint serialises to this shape; the HTTP status carries the failure class (4xx/5xx), the body adds a stable code for programmatic dispatch plus a human-readable message.

object
error
required
object
code
required

Stable, programmatic error code (e.g. unauthorized, forbidden, not_found, invalid_body, invalid_url, precondition_failed, no_secondary_key). Clients dispatch on code, not on the message (which may be localised or contextualised in future versions).

string
instance_id

Request-id correlation handle echoed on the request-id response header — support teams correlate without scraping logs.

string
message
required

Human-readable explanation of the failure.

string
parameters

Per-error structured detail. The shape varies by code (e.g. forbidden_action carries {"action": "..."}; precondition_failed carries {"current_version": N}).

Examplegenerated
{
"error": {
"code": "example",
"instance_id": "example",
"message": "example",
"parameters": "example"
}
}