> ## Documentation Index
> Fetch the complete documentation index at: https://docs.teel.finance/llms.txt
> Use this file to discover all available pages before exploring further.

# List deliveries

> List webhook delivery attempts with filters

Debug what reached your endpoint — attempt count, response code, response body excerpt, error.

<Info>**Scope** `webhooks:read`</Info>

## Headers

<ParamField header="Authorization" type="string" required>
  API key.
</ParamField>

## Query parameters

<ParamField query="subscription_id" type="string">
  Filter to one subscription (UUID).
</ParamField>

<ParamField query="status" type="string">
  Filter by status. One of `pending`, `succeeded`, `failed`, `permanently_failed`.
</ParamField>

<ParamField query="since" type="string">
  RFC3339 timestamp. Inclusive lower bound on `createdAt`.
</ParamField>

<ParamField query="until" type="string">
  RFC3339 timestamp. Exclusive upper bound on `createdAt`.
</ParamField>

<ParamField query="limit" type="integer">
  Page size. Default `50`, max `200`.
</ParamField>

<ParamField query="offset" type="integer">
  Pagination offset. Default `0`.
</ParamField>

## Response

<ResponseField name="id" type="string">
  Delivery UUID.
</ResponseField>

<ResponseField name="subscriptionId" type="string">
  UUID of the subscription this delivery belongs to.
</ResponseField>

<ResponseField name="eventType" type="string">
  Event type, e.g. `payout.status.updated`.
</ResponseField>

<ResponseField name="payload" type="object">
  The full JSON envelope POSTed to your endpoint.
</ResponseField>

<ResponseField name="status" type="string">
  `pending`, `succeeded`, `failed`, or `permanently_failed`. See below.
</ResponseField>

<ResponseField name="attemptCount" type="integer">
  Number of times Teel has POSTed this delivery.
</ResponseField>

<ResponseField name="nextAttemptAt" type="string">
  ISO 8601 timestamp of the next scheduled retry. `null` when in a terminal state.
</ResponseField>

<ResponseField name="lastResponseCode" type="integer">
  HTTP status of the most recent attempt. `null` if no transport-level response (timeout, connect refused).
</ResponseField>

<ResponseField name="lastResponseBody" type="string">
  Excerpt of the most recent response body. May be truncated.
</ResponseField>

<ResponseField name="lastError" type="string">
  Transport error message from the most recent failed attempt. `null` on success.
</ResponseField>

<ResponseField name="createdAt" type="string">
  ISO 8601 timestamp.
</ResponseField>

<ResponseField name="deliveredAt" type="string">
  ISO 8601 timestamp of the first successful delivery. `null` until success.
</ResponseField>

### Delivery statuses

| Status               | Meaning                                                                                                                                                |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `pending`            | In the queue. Either not yet attempted, or scheduled for retry (`nextAttemptAt` in the future).                                                        |
| `succeeded`          | Your endpoint responded 2xx within the 10s timeout. `deliveredAt` is populated.                                                                        |
| `failed`             | An attempt was non-2xx, timed out, or hit a transport error. Will retry on the schedule (\~30s, 2m, 8m, 32m) until budget exhausted.                   |
| `permanently_failed` | All 5 attempts failed. The delivery will not retry automatically — use [Replay](/api-reference/webhooks/deliveries/replay) to enqueue a fresh attempt. |

Rows older than 30 days are eligible for automatic pruning (terminal statuses only — `pending` and in-retry rows are never deleted).

<ResponseExample>
  ```json 200 theme={null}
  [
    {
      "id": "54697e99-c2f5-4630-9f88-c1a3b1428d65",
      "subscriptionId": "1c84203c-b4e3-40de-83a9-51bc0d9c991f",
      "eventType": "payout.status.updated",
      "payload": {
        "type": "payout.status.updated",
        "createdAt": "2026-05-27T09:30:46Z",
        "data": {
          "payoutId": "txn_abc",
          "status": "processing",
          "step": "settling"
        }
      },
      "status": "succeeded",
      "attemptCount": 1,
      "nextAttemptAt": "2026-05-27T09:30:46Z",
      "lastResponseCode": 200,
      "lastResponseBody": null,
      "lastError": null,
      "createdAt": "2026-05-27T09:30:46Z",
      "deliveredAt": "2026-05-27T09:30:48Z"
    }
  ]
  ```
</ResponseExample>
