Webhooks
Webhooks let you receive real-time notifications when events occur in your Zeplo workspace. Configure webhooks from the dashboard under Settings → Webhooks.
Events
| Event | Description |
|---|---|
request.create |
A new request was enqueued |
request.complete |
A request completed successfully |
request.fail |
A request failed all retry attempts |
Webhook payload
Zeplo sends a POST request to your endpoint with a JSON body:
{
"event": {
"id": "evt_abc123",
"event": "request.complete"
},
"webhook": "wh_def456",
"data": {
"type": "request",
"object": {
"id": "req_xyz789",
"queue": "q_abc123",
"status": "completed",
"method": "POST",
"url": "https://your-api.com/webhook",
"response_status_code": 200,
"response_time": 145,
"attempts": 1,
"created": "2026-02-25T12:00:00Z",
"completed_at": "2026-02-25T12:00:01Z"
}
}
}
Verifying signatures
Webhook deliveries include an X-Zeplo-Signature header that you should verify to ensure the payload came from Zeplo.
Step 1: Extract the signatures
The X-Zeplo-Signature header contains one or more comma-separated signatures (multiple signatures allow for zero-downtime secret rotation):
X-Zeplo-Signature: v1=f03de6f61df6e454f3620c4d6aca17ad072d3f8b...,v1=130dcacb53a94d983a37cf2acba98e805a1c3718...
Step 2: Compute the expected signature
Using the raw request body, compute an HMAC-SHA256 using your webhook secret (found in the dashboard).
Step 3: Compare
If at least one of the provided signatures matches your computed signature, the webhook is authentic.
Example (Node.js)
const crypto = require('crypto')
function verifySignature(secret, body, signatures, version = 'v1') {
const signature = crypto
.createHmac('sha256', secret)
.update(body)
.digest('hex')
const expected = `${version}=${signature}`
return signatures.split(',').includes(expected)
}
Note: Always use constant-time string comparison in production to protect against timing attacks.
Email notifications
In addition to webhooks, you can configure email notifications for failed requests under Settings → Notifications in the dashboard.