Entregas de webhook
Uma entrega é uma linha na tabela webhook_deliveries — um evento, um endpoint, um log de tentativa. É o espelho somente-leitura do que o worker está fazendo em seu nome.
Listar entregas
GET/v1/webhook-deliveriesBearer · API key
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"Schema · Delivery row
| 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` \| `channel.connected` \| `channel.disconnected` \| `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
GET/v1/webhook-deliveries/:idBearer · API key
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": "evt_01J...",
"status": "success",
"attempt_count": 1,
"last_response_status": 200,
"last_error": null,
"payload": {
"event": "message.received",
"event_id": "evt_01J...",
"channel_id": "inst_01J...",
"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.
O que não existe
- Retentativa manual de uma entrega específica. Clientes que pedem isso geralmente querem um botão de "drenar minha fila de falhas" — fale com a gente; conseguimos construir sem virar um tiro no pé.
- Endpoint de streaming. Use
/v1/eventspara estado ao vivo; este recurso é para inspeção.