Convirza webhooks push call data to your HTTPS endpoint on connect, on completion, or only when your rules match.
When webhooks fire.
Pre-call: call connects
With DNI logs, shows the referring campaign.
Optional: rule gates post-call
IF lead quality > 70 AND UTM Source is google THEN Trigger the webhookPost-call: call ends
Caller name and address (when the lookup matches), indicator scores (Conversation Analytics™ scoring), DNI logs, IVR keypresses. Data append is billed per match.
GET by call ID
Transcript, summary, scorecard, source (UTM, gclid), pre-signed, expiring recording URL.
Subscriptions fire on changes: adds, updates and deletes on calls, users, groups, campaigns, numbers and more. Who changed what, old and new values.
Pull it with one GET.
# The webhook gives you a call ID. One request returns the rest.
curl "https://platform-api.convirza.com/v3/conversations/calls/{id}?include=transcription,summary,scorecard,dni_data" \
-H "Authorization: Bearer $CONVIRZA_TOKEN"import express from 'express';
import crypto from 'node:crypto';
const app = express();
// The static parameter or custom header you configured on the webhook or
// subscription. Convirza does not sign payloads - this check is yours.
const EXPECTED_KEY = process.env.CONVIRZA_WEBHOOK_KEY;
app.post(
'/webhooks/convirza',
express.json(),
(req, res) => {
const received = req.header('X-My-Webhook-Key') ?? '';
const valid =
received.length === EXPECTED_KEY.length &&
crypto.timingSafeEqual(Buffer.from(received), Buffer.from(EXPECTED_KEY));
if (!valid) {
return res.status(401).send('invalid key');
}
// Respond fast, then enqueue the work. Dedupe on the call ID.
res.status(200).send('ok');
enqueue(req.body);
},
);
app.listen(3000);import hmac
import os
from flask import Flask, request, abort
app = Flask(__name__)
# The static parameter or custom header you configured on the webhook or
# subscription. Convirza does not sign payloads - this check is yours.
EXPECTED_KEY = os.environ['CONVIRZA_WEBHOOK_KEY']
@app.post('/webhooks/convirza')
def convirza_webhook():
received = request.headers.get('X-My-Webhook-Key', '')
if not hmac.compare_digest(received, EXPECTED_KEY):
abort(401, 'invalid key')
# Respond fast, then enqueue the work. Dedupe on the call ID.
enqueue(request.get_json())
return ('ok', 200)Call webhooks vs subscriptions.
Create in Settings > Customization > Webhook, POST /v3/webhooks or POST /v3/subscriptions, or ask your AI assistant at connect.convirza.com/mcp.
Admin role required. Subgroups inherit top- and second-level webhooks.
| Detail | Call webhooks | Subscriptions |
|---|---|---|
| Format | JSON, XML, XML_CQM or form data | JSON (default) or XML |
| Method | GET, POST, PUT or PATCH | POST |
| Auth | Static parameters | Up to 20 custom headers |
| Respond | 200 within 10s | Create sends a test payload: 200 within 5s or create fails (400) |
| Retries | Per account settings | 3, with exponential backoff |
- Make handlers idempotent on call ID.
- Backfill with Get Calls List: 200 per page, 31-day windows.
- Pause or resume with PATCH. Deleting keeps config and history.