Entregas de webhook
Uma entrega é uma linha na tabela webhook_deliveries — um evento, um endpoint, um log de tentativa. Espelha o que o worker está fazendo em seu nome; a única escrita é retentar uma entrega que falhou.
Listar entregas
Filtre via query params:
| Param | Efeito |
|---|---|
status | pending | success | failed | retrying |
event | filtra por nome do evento (ex.: message.received) |
channel_id | filtra para um único canal |
Retorna até 100 linhas por página, as mais recentes primeiro.
curl -s "$WHATISUP_API/v1/webhook-deliveries?status=failed" \
-H "Authorization: Bearer $WHATISUP_API_KEY"| Field | Type | Required | Notes |
|---|---|---|---|
| id | string · uuid | required | |
| endpoint_id | string · uuid | required | |
| customer_id | string · uuid | required | |
| channel_id | string · uuid | required · nullable | |
| event | `message.received` \| `message.sent` \| `message.reaction` \| `message.status` \| `message.edited` \| `message.deleted` \| `channel.connected` \| `channel.disconnected` \| `channel.status` \| `channel.limits` \| `channel.health` \| `qr.updated` \| `group.created` \| `group.updated` \| `group.participant_added` \| `group.participant_removed` \| `group.admin_promoted` \| `group.admin_demoted` \| `chat.updated` \| `chat.archived` \| `chat.pinned` \| `presence.updated` \| `order.placed` \| `order.cancelled` \| `cart.updated` \| `story.viewed` \| `call.offered` \| `call.terminated` \| `contact.resolved` | required | |
| event_id | string | required | |
| payload | unknown | required | |
| status | `pending` \| `success` \| `failed` \| `retrying` | required | |
| attempt_count | number | required | |
| last_error | string | required · nullable | |
| last_response_status | number | required · nullable | |
| next_attempt_at | string · ISO 8601 | required · nullable | |
| delivered_at | string · ISO 8601 | required · nullable | |
| created_at | string · ISO 8601 | required | |
| updated_at | string · ISO 8601 | required |
Obter uma entrega
Retorna a entrega única, incluindo seu payload se a retenção ainda não tiver entrado em ação.
{
"id": "dlv_01J...",
"endpoint_id": "wh_01J...",
"event": "message.received",
"event_id": "9bc38acc-2edc-482e-93d4-0482b432ffa6",
"status": "success",
"attempt_count": 1,
"last_response_status": 200,
"last_error": null,
"payload": {
"event": "message.received",
"event_id": "9bc38acc-2edc-482e-93d4-0482b432ffa6",
"channel_id": "8d653c66-e4ff-43ee-97da-3de5ad5680d4",
"from": "5511999999999",
"body": { "type": "text", "text": "hello back" }
},
"created_at": "2026-05-01T12:34:56.000Z",
"delivered_at": "2026-05-01T12:34:57.012Z"
}O campo payload fica null para entregas com mais de 7 dias (success) ou 30 dias
(failed). Os metadados ficam para sempre — você sempre consegue ver que uma entrega
aconteceu, só nem sempre dá pra replay do corpo dela. Se precisar de retenção de payload
mais longa, faça o log do seu lado.
Retentar uma entrega que falhou
Depois de corrigir seu receptor, mande de novo uma entrega failed. Ela volta pra pending com um orçamento novo de tentativas — o cronograma automático completo, umas 8 horas — e vai pra URL atual do endpoint, assinada com o segredo atual. O corpo é o evento original com o mesmo event_id, então se o seu receptor deduplica por event_id e já guardou esse evento, ele vai tratar como duplicado (o que está certo).
Retorna 202 com a entrega. Retorna 409 webhook_delivery_not_retryable quando a entrega não está failed, já foi retentada, ou o payload já expirou pela política de retenção acima. Uma chave restrita a um canal só retenta entregas do próprio canal.
curl -sX POST "$WHATISUP_API/v1/webhook-deliveries/:id/retry" \
-H "Authorization: Bearer $WHATISUP_API_KEY"O que não existe
- Retentativa em lote. Retente as entregas uma a uma; liste antes com
?status=failed. - Endpoint de streaming. Use
/v1/eventspara estado ao vivo; este recurso é para inspeção.