POST request to your webhook URL each time an event you subscribed to happens. Register the URL with Manage webhooks or in API Access → Notifications.
Event index
Samples for
outbound.lead.created, outbound.lead.updated, call.outbound.status, call.outbound.analysis and followup.scheduled are in the CRM lead bank integration guide.
Request format
Every event uses the same request shape. Onlydata changes between events.
1
Verify the signature
Compute HMAC-SHA256 over the raw body bytes with your webhook secret and compare it with
X-Ondial-Signature. Don’t re-serialize the JSON first.2
Respond quickly
Return any
2xx within 10 seconds. Do slow work (CRM updates) after responding.3
Ignore duplicates
Store
X-Ondial-Idempotency-Key and skip keys you’ve already processed.400, 401, 403, 404, 405, 410 and 422. A webhook that keeps failing is disabled automatically. Re-enable it in API Access → Notifications.
Outbound events (
call.outbound.*, whatsapp.outbound.status, email.outbound.status, contact.cancelled and outbound credits.usage) are only sent for campaigns whose Source Type is API / Custom CRM.Outbound events
call.outbound.billed
Sent when credits are deducted for an outbound call. A matchingcredits.usage event with the same data is sent at the same time, so subscribe to only one of them if you don’t want both.
whatsapp.outbound.status
Sent when a WhatsApp message to the lead changes status.email.outbound.status
Sent when a follow-up email to the lead is sent or fails.contact.cancelled
Sent when you cancel a contact with Cancel contact or delete it with Delete contact. Contacts stopped from the dashboard don’t send this event.Inbound events
Inbound events are sent for every inbound agent on your account. They don’t depend on campaign Source Type.call.inbound.started
Sent when an inbound agent answers a call.call.inbound.completed
Sent once when an inbound call ends. Billing is usually stillpending at this point; wait for call.inbound.billed for the final cost.
call.inbound.billed
Sent when credits are deducted for an inbound call. A matchingcredits.usage event with the same data is sent at the same time.
call.inbound.analysis
Sent when post-call analysis of an inbound call is ready. This event is a notification only: it carries the call ID, not the analysis itself. Fetch the summary, classification and next action with Get call.whatsapp.inbound.received
Sent each time the lead replies on WhatsApp to a campaign conversation. The message text isn’t included.inbound.lead.created
Sent after an inbound call when Ondial successfully creates or updates the caller as a lead in your connected CRM (Zoho, HubSpot, Salesforce or Odoo). Not sent if CRM push is off or fails.data contains every field from call.inbound.completed, plus provider and recordId.
call.inbound.completed for the full field list.
Billing events
credits.usage
Sent for every wallet debit, for both inbound and outbound calls. Use it if you want one event for all billing instead of subscribing tocall.outbound.billed and call.inbound.billed separately.
data is exactly the same as the matching billed event:
direction: "outbound"→ same fields ascall.outbound.billeddirection: "inbound"→ same fields ascall.inbound.billed
To reconcile billing, upsert on
billingKey when it’s present, otherwise on callId + direction. Outbound usageId is usually null.
