Skip to main content
Ondial sends a 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. Only data 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.
Retries: a failed delivery is tried up to 3 times. Ondial stops retrying on 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.
Treat any field not marked as always present as optional. Fields can be null or missing when the value isn’t known, and new fields may be added at any time.

Outbound events

call.outbound.billed

Sent when credits are deducted for an outbound call. A matching credits.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.
If your webhook is subscribed to *, this event arrives with eventType: "whatsapp.status" (its legacy name). If you subscribed to whatsapp.outbound.status by name, it arrives under that name. Handle both.

email.outbound.status

Sent when a follow-up email to the lead is sent or fails.
If your webhook is subscribed to *, this event arrives with eventType: "email.status" (its legacy name). If you subscribed to email.outbound.status by name, it arrives under that name. Handle both.

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 still pending 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 matching credits.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.
The sample above is shortened. See 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 to call.outbound.billed and call.inbound.billed separately. data is exactly the same as the matching billed event:
To reconcile billing, upsert on billingKey when it’s present, otherwise on callId + direction. Outbound usageId is usually null.