Skip to main content
GET
/
api
/
webhooks
/
deliveries
List deliveries
curl --request GET \
  --url https://api.example.com/api/webhooks/deliveries \
  --header 'Authorization: <authorization>'
[
  {
    "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"
  }
]
Debug what reached your endpoint — attempt count, response code, response body excerpt, error.
Scope webhooks:read

Headers

Authorization
string
required
API key.

Query parameters

subscription_id
string
Filter to one subscription (UUID).
status
string
Filter by status. One of pending, succeeded, failed, permanently_failed.
since
string
RFC3339 timestamp. Inclusive lower bound on createdAt.
until
string
RFC3339 timestamp. Exclusive upper bound on createdAt.
limit
integer
Page size. Default 50, max 200.
offset
integer
Pagination offset. Default 0.

Response

id
string
Delivery UUID.
subscriptionId
string
UUID of the subscription this delivery belongs to.
eventType
string
Event type, e.g. payout.status.updated.
payload
object
The full JSON envelope POSTed to your endpoint.
status
string
pending, succeeded, failed, or permanently_failed. See below.
attemptCount
integer
Number of times Teel has POSTed this delivery.
nextAttemptAt
string
ISO 8601 timestamp of the next scheduled retry. null when in a terminal state.
lastResponseCode
integer
HTTP status of the most recent attempt. null if no transport-level response (timeout, connect refused).
lastResponseBody
string
Excerpt of the most recent response body. May be truncated.
lastError
string
Transport error message from the most recent failed attempt. null on success.
createdAt
string
ISO 8601 timestamp.
deliveredAt
string
ISO 8601 timestamp of the first successful delivery. null until success.

Delivery statuses

StatusMeaning
pendingIn the queue. Either not yet attempted, or scheduled for retry (nextAttemptAt in the future).
succeededYour endpoint responded 2xx within the 10s timeout. deliveredAt is populated.
failedAn attempt was non-2xx, timed out, or hit a transport error. Will retry on the schedule (~30s, 2m, 8m, 32m) until budget exhausted.
permanently_failedAll 5 attempts failed. The delivery will not retry automatically — use 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).
[
  {
    "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"
  }
]