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
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string (CSV) | Optional | Comma-separated delivery states to include: delivered, failed, pending, retrying. Omit for all states. |
since | ISO-8601 | Optional | Window start. Default: 24 hours ago; reaches back at most 90 days (earlier values are clamped). |
until | ISO-8601 | Optional | Window end. Default: now. |
cursor | string | Optional | Opaque pagination cursor from the previous response’s next_cursor. |
limit | integer | Optional | Results 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 permanent4xx. 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
| Status | Description |
|---|---|
200 | OK. Cursor-paginated delivery list, newest first. |
400 | Validation error — an unknown status value, a malformed timestamp, or limit out of range. |
401 | Missing or invalid API key. |
404 | No webhook with this id on your account. |
Code examples
# 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"// 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 })),
});
}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"]],
)$page = $wemail->webhooks->listDeliveries('9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c', [
'status' => 'failed',
'since' => '2026-08-23T00:00:00Z',
'limit' => 50,
]);page = wemail.webhooks.list_deliveries(
"9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c",
status: "failed", since: "2026-08-23T00:00:00Z", limit: 50
)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)
}JSONObject page = wemail.webhooks().listDeliveries(
"9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c",
ListWebhookDeliveriesParams.builder().status("failed").limit(50).build());var page = await wemail.Webhooks.ListDeliveriesAsync(
"9b2f6c1e-4a8d-4f3b-9c7e-2d1a5b8e0f4c",
new ListWebhookDeliveriesParams { Status = "failed", Limit = 50 });{
"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
}