Event catalog
SIVO emits the following events available for webhook:
- call.created — new call (inbound or outbound).
- call.answered — agent accepts.
- call.transferred — blind/attended/3-way transfer.
- call.ended — hangup with full CDR.
- call.recorded — recording available with pre-signed URL.
- transcript.segment — live transcription segment.
- transcript.completed — final consolidated transcript.
- queue.entered — call enters ACD queue.
- queue.abandoned — caller hangs up before being answered.
- agent.status_changed — Available / On Call / On Break / Logged Out.
- agent.paused — pause with reason.
- ivr.completed — IVR flow finished with captured variables.
- ai_agent.completed — AI conversation finished with exit_reason.
HMAC SHA-256 signature
Each request carries the body HMAC in X-Sivo-Signature: sha256=<hex>
signed with your webhook_secret. How to verify in Node.js:
const crypto = require('crypto');
const signature = req.headers['x-sivo-signature'];
const expected = 'sha256=' + crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(req.rawBody)
.digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
return res.status(401).send('invalid signature');
} Retries with exponential backoff
If your endpoint returns non-2xx, SIVO retries up to 6 times with exponential backoff: 5s, 30s, 2min, 10min, 1h, 6h. After the sixth failure, the event moves to the dead-letter queue visible in the dashboard. You can retry manually or download as JSON.
Idempotency
Every webhook carries a unique X-Sivo-Event-Id. If your pipeline
receives it twice (timeout on your side, for example), discard it. SIVO never
changes the ID across retries.
Configuration
- Multiple endpoints per tenant — one for CRM, one for BI, one for Slack.
- Event filters — subscribe only to what matters.
- Built-in tester — fire a synthetic event from the dashboard to validate your endpoint.
- Per-endpoint logs with the last 100 deliveries + status + latency.
Limits
- Body max 256 KB.
- 10s timeout — if your endpoint is slower, count as failure. Better queue internally and respond 200 immediately.
- HTTPS only (no plain HTTP).