Inspecting Webhook Logs
Logs describe Hub's delivery attempt and the receiver's acknowledgement, not the outcome of later worker processing.
curl 'https://app.chatt2.me/v1/organization/webhook/WEBHOOK_UUID/webhook-log?offset=0&limit=20&status=Error' \
-H 'x-api-key: YOUR_APPLICATION_API_KEY'
offset is a zero-based page index (offset × limit records skipped); limit defaults to 20 and accepts 1–50. Optional status is Success or Error. Continue through pagination.totalPages; an empty page has data: [].
{
"data": [
{
"id": "b2c3d4e5-f6a7-4901-bcde-f23456789012",
"webhookId": "a1b2c3d4-e5f6-4890-abcd-ef1234567890",
"statusCode": null,
"responseBody": "timeout of 30000ms exceeded",
"requestBody": "{\"eventType\":\"message_status\",\"timestamp\":\"2026-10-06T12:00:00.000Z\",\"status\":\"delivered\"}",
"responseTimeMs": 30000,
"status": "Error",
"sendAt": "2026-10-06T12:00:00.000Z",
"createdDate": "2026-10-06T12:00:30.000Z",
"isDeleted": false,
"messageId": null,
"parentWebhookLogId": null,
"resolved": false,
"canRetry": true,
"canRetryBulk": true,
"webhook": {"id": "a1b2c3d4-e5f6-4890-abcd-ef1234567890", "endpoint": "https://your-server.example/webhooks/chatt2me"}
}
],
"pagination": {"offset": 0, "limit": 20, "total": 1, "totalPages": 1}
}
| Field | Meaning |
|---|---|
id, webhookId | Log and webhook UUIDs |
statusCode | Receiver HTTP status, or null if no HTTP response; never assume 0 |
responseBody | Stored response/error text, string or null |
requestBody | Stored outbound JSON string or null, not a parsed object; may be truncated |
responseTimeMs | Latency in milliseconds or null when unavailable |
status | Success or Error (legacy values may be null) |
sendAt | Attempt time or null; createdDate is log creation time |
messageId | Related Hub message ID or null |
parentWebhookLogId | Previous attempt ID for a retry, otherwise null |
resolved | This failed attempt has a successful descendant retry |
canRetry | Currently eligible for a single retry; concurrent attempts can still reject it |
canRetryBulk | Eligible for bulk event retry; false for validation |
webhook | Optional nested ID and endpoint; no eventType |
A successful event log can have statusCode: 202, responseBody: "Accepted", and canRetry: false. A failed validation log has requestBody: null, messageId: null, canRetryBulk: false; its response can be a 2xx response lacking the token. Stored log text is bounded, so a truncated event body may not be replayable. Parse requestBody separately only when it is a complete JSON string.
Diagnosing failures
| Result | Check |
|---|---|
statusCode: null | DNS, TLS, connection, firewall or timeout; timeout can occur after connection |
401 | Receiver custom header, authorization or HMAC secret |
404 | Receiver route/path |
429, 5xx | Receiver capacity, storage and availability |
Validation 2xx with Error | Response must contain X-Validation-Token |
Event delivery timeout is 30 seconds; validation timeout is 10 seconds. A 2xx event acknowledgement is success even if subsequent business processing fails. Persist/enqueue durably before acknowledgement and monitor your worker separately.
Counters and retry history
Read the webhook with GET /v1/organization/webhook/WEBHOOK_UUID to inspect active, verification and performance. numberOfErrors is not the total number of failed logs: an initial failure can coexist with zero. Use filtered logs, resolved, retry chains and avgResponseTimeMs for diagnosis, rather than deriving a failure count from that counter.