Skip to main content
Every event Teel POSTs to your subscriptions creates a webhook_deliveries row that records the attempt count, the response code, the response body excerpt, and (on failure) the error message. Use these endpoints to debug what reached your endpoint and to manually re-fire a delivery.

List deliveries

Authorization
string
required
Bearer token from Auth0
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 created_at.
until
string
RFC3339 timestamp. Exclusive upper bound on created_at.
limit
integer
Page size. Default 50, max 200.
offset
integer
Pagination offset. Default 0.
GET /api/webhooks/deliveries
[
  {
    "id": "54697e99-c2f5-4630-9f88-c1a3b1428d65",
    "subscription_id": "1c84203c-b4e3-40de-83a9-51bc0d9c991f",
    "user_id": "4d9e5f15-33bd-4b52-970d-88ad31dfe3ce",
    "event_type": "payout.status.updated",
    "payload": {
      "type": "payout.status.updated",
      "created_at": "2026-05-27T09:30:46Z",
      "data": {
        "payout_id": "txn_abc",
        "status": "processing",
        "step": "settling"
      }
    },
    "status": "succeeded",
    "attempt_count": 1,
    "next_attempt_at": "2026-05-27T09:30:46Z",
    "last_response_code": 200,
    "last_response_body": null,
    "last_error": null,
    "created_at": "2026-05-27T09:30:46Z",
    "delivered_at": "2026-05-27T09:30:48Z"
  }
]

Delivery statuses

StatusMeaning
pendingIn the queue. Either not yet attempted, or scheduled for retry (next_attempt_at in the future).
succeededYour endpoint responded 2xx within the 10s timeout. delivered_at 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).

Get delivery

Authorization
string
required
Bearer token from Auth0
id
string
required
Delivery UUID
GET /api/webhooks/deliveries/{id}
Returns the same shape as List for a single row. Useful as a follow-up after Replay to poll for the new delivery’s outcome.

Replay delivery

Authorization
string
required
Bearer token from Auth0
id
string
required
Source delivery UUID
POST /api/webhooks/deliveries/{id}/replay
Enqueues a fresh delivery row pointing at the same subscription with the same payload as the source. The worker picks it up on its next tick (within ~2s). The new delivery has its own Teel-Delivery-Id. Use this for
  • Debugging your verifier: drop a row, fix the bug, replay, watch it land.
  • Recovering from a long outage on your side: walk the permanently_failed deliveries and replay them once your endpoint is healthy.

Rate limit

To prevent self-inflicted DoS, replays are capped per account: 5 per minute, burst 5. Over the limit returns 429 Too Many Requests with a Retry-After header (seconds).
{
  "id": "deabb47c-b3c4-4777-867c-cc32c434957c",
  "subscription_id": "1c84203c-b4e3-40de-83a9-51bc0d9c991f",
  "event_type": "payout.status.updated",
  "status": "pending",
  "attempt_count": 0,
  "next_attempt_at": "2026-05-27T09:34:50Z",
  "created_at": "2026-05-27T09:34:50Z"
}