List webhook deliveries

Page through an endpoint’s delivery history — failures pipe straight into resend.

One row per logical delivery — the latest attempt of each event sent to this endpoint — newest first, cursor-paginated. Each item carries the derived delivery state plus the webhook_id/event_id pair, exactly the shape Resend deliveries accepts: filter with status=failed, then pipe the items straight into resend.

GET /v3/webhooks/{id}/deliveries

Query parameters

ParameterTypeRequiredDescription
statusstring (CSV)OptionalComma-separated delivery states to include: delivered, failed, pending, retrying. Omit for all states.
sinceISO-8601OptionalWindow start. Default: 24 hours ago; reaches back at most 90 days (earlier values are clamped).
untilISO-8601OptionalWindow end. Default: now.
cursorstringOptionalOpaque pagination cursor from the previous response’s next_cursor.
limitintegerOptionalResults per page, 1–100. Default 25.

Delivery states

  • delivered — your endpoint answered 2xx.
  • retrying — the latest attempt failed but the automatic retry schedule is still running.
  • failed — final: retries are exhausted or your endpoint refused with a permanent 4xx. These are the resendable ones.
  • pending — a manual resend is in flight.

Response

Returns { items, has_more, next_cursor, total_count }. Each item is { webhook_id, event_id, event, attempts, last_status, last_attempt_at, state }event is the source event type, attempts counts organic retries plus manual resends, and last_status is the HTTP status of the latest attempt (null when it never completed: network error, timeout or in-flight). Pass next_cursor back as cursor for the next page; total_count is the full match count in the window. Endpoint-test attempts have no source event and are excluded.

Responses

StatusDescription
200OK. Cursor-paginated delivery list, newest first.
400Validation error — an unknown status value, a malformed timestamp, or limit out of range.
401Missing or invalid API key.
404No webhook with this id on your account.

Code examples

cURL
# Failed deliveries of the last 7 days, resend-ready
curl -G https://api.wemail.io/v3/webhooks/9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c/deliveries \
  -H "Authorization: Bearer afn_live_…" \
  --data-urlencode "status=failed" \
  --data-urlencode "since=2026-08-23T00:00:00Z" \
  --data-urlencode "limit=50"

# Next page: pass next_cursor back as cursor
curl -G https://api.wemail.io/v3/webhooks/9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c/deliveries \
  -H "Authorization: Bearer afn_live_…" \
  --data-urlencode "status=failed" \
  --data-urlencode "cursor=2026-08-29T08:11:02.000Z|evt_01J8ZQ3K9WVA7M2P"
Node.js
// List failures, then pipe the items straight into resend —
// the item shape IS the resend input.
const page = await wemail.webhooks.listDeliveries(
  "9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c",
  { status: "failed", since: "2026-08-23T00:00:00Z", limit: 50 },
);
if (page.items.length > 0) {
  await wemail.webhooks.resendDeliveries({
    deliveries: page.items.map(({ webhook_id, event_id }) => ({ webhook_id, event_id })),
  });
}
Python
page = wemail.webhooks.list_deliveries(
    "9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c",
    status="failed", since="2026-08-23T00:00:00Z", limit=50,
)
if page["items"]:
    wemail.webhooks.resend_deliveries(
        deliveries=[{"webhook_id": i["webhook_id"], "event_id": i["event_id"]} for i in page["items"]],
    )
PHP
$page = $wemail->webhooks->listDeliveries('9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c', [
    'status' => 'failed',
    'since' => '2026-08-23T00:00:00Z',
    'limit' => 50,
]);
Ruby
page = wemail.webhooks.list_deliveries(
  "9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c",
  status: "failed", since: "2026-08-23T00:00:00Z", limit: 50
)
Go
page, _ := client.Webhooks.ListDeliveries(ctx, "9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c",
    &wemail.ListWebhookDeliveriesParams{Status: "failed", Since: "2026-08-23T00:00:00Z", Limit: 50})
for _, d := range page.Items {
    fmt.Println(d.EventID, d.State, d.Attempts)
}
Java
JSONObject page = wemail.webhooks().listDeliveries(
  "9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c",
  ListWebhookDeliveriesParams.builder().status("failed").limit(50).build());
.NET
var page = await wemail.Webhooks.ListDeliveriesAsync(
  "9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c",
  new ListWebhookDeliveriesParams { Status = "failed", Limit = 50 });
ResponseExample response
{
  "items": [
    {
      "webhook_id": "9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c",
      "event_id": "evt_01J8ZQ3K9WVA7M2P",
      "event": "bounced",
      "attempts": 7,
      "last_status": 500,
      "last_attempt_at": "2026-08-29T08:11:02.000Z",
      "state": "failed"
    },
    {
      "webhook_id": "9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c",
      "event_id": "evt_01J8ZQ4T2XNC8R5D",
      "event": "delivered",
      "attempts": 3,
      "last_status": 503,
      "last_attempt_at": "2026-08-29T08:09:47.000Z",
      "state": "retrying"
    }
  ],
  "has_more": true,
  "next_cursor": "2026-08-29T08:09:47.000Z|evt_01J8ZQ4T2XNC8R5D",
  "total_count": 132
}