Skip to main content

Monitoring & Debugging

Zyphr provides full observability into your webhook deliveries — delivery logs with request/response capture, endpoint health tracking, and test events for integration development.

Delivery Logs

List Deliveries

Retrieve delivery history for a webhook endpoint:

curl "https://api.zyphr.dev/v1/webhooks/YOUR_WEBHOOK_ID/deliveries?limit=20&offset=0" \
-H "Authorization: Bearer YOUR_API_KEY"

Filter by status:

curl "https://api.zyphr.dev/v1/webhooks/YOUR_WEBHOOK_ID/deliveries?status=failed" \
-H "Authorization: Bearer YOUR_API_KEY"

Valid status filters: pending, success, failed, exhausted.

Delivery Detail

Get full details for a specific delivery, including the payload and response body:

curl "https://api.zyphr.dev/v1/webhooks/YOUR_WEBHOOK_ID/deliveries/DELIVERY_ID" \
-H "Authorization: Bearer YOUR_API_KEY"

The detail response includes:

FieldDescription
idDelivery record ID
msg_idStable message ID (for deduplication)
event_idOriginating event ID
event_typeEvent type (e.g., email.delivered)
payloadFull webhook payload that was sent
statusCurrent delivery status
attemptsNumber of delivery attempts made
max_attemptsMaximum attempts allowed
next_attempt_atWhen the next retry is scheduled (if applicable)
last_response_statusHTTP status code from your endpoint
last_response_bodyResponse body from your endpoint (truncated to 1,000 chars)
last_errorError message if the delivery failed
first_attempted_atTimestamp of the first delivery attempt
last_attempted_atTimestamp of the most recent attempt
completed_atTimestamp when delivery succeeded or was exhausted

Endpoint Health

Each webhook tracks health metrics that help you identify problematic endpoints:

FieldDescription
statusCurrent webhook status: active, paused, or disabled
consecutive_failuresNumber of consecutive failed deliveries
last_failure_atTimestamp of the most recent failure
disabled_atTimestamp when the webhook was auto-disabled
disabled_reasonReason for auto-disable (e.g., "10 consecutive failures")

Webhook Statuses

StatusDescription
activeEndpoint is receiving deliveries normally
pausedEndpoint is temporarily paused — deliveries are held
disabledEndpoint was auto-disabled due to consecutive failures

Pausing a webhook is useful during maintenance. While paused, new events still create delivery records but deliveries are not attempted until the webhook is set back to active.

Test Events

Send a test event to verify your endpoint is configured correctly:

curl -X POST https://api.zyphr.dev/v1/webhooks/YOUR_WEBHOOK_ID/test \
-H "Authorization: Bearer YOUR_API_KEY"

The default test event uses the webhook.test event type. Customize the event type and payload:

curl -X POST https://api.zyphr.dev/v1/webhooks/YOUR_WEBHOOK_ID/test \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"event_type": "email.delivered",
"payload": {
"message_id": "test-msg-123",
"recipient_email": "test@example.com"
}
}'

Test events create a real delivery record with max_attempts: 1 (no retries) so you can inspect the full delivery lifecycle.

Common Issues

SymptomLikely CauseSolution
last_error: "Request timed out after 30000ms"Endpoint is too slowRespond within 30 seconds — process events asynchronously
last_response_status: 401 or 403Authentication failureEnsure your endpoint doesn't require auth for webhook POST requests
last_response_status: 404Wrong URLVerify the webhook URL is correct
last_response_status: 500Server errorCheck your endpoint's error logs
last_error contains DNS errorDNS resolution failedVerify the hostname is correct and DNS is configured
last_error contains SSL/TLS errorCertificate issueEnsure your SSL certificate is valid and not expired
Webhook status is disabled10 consecutive failuresFix the underlying issue, then re-enable with PUT /v1/webhooks/:id
Signature verification failsWrong secret or algorithmConfirm you're using the correct secret and signature format