Event Types
These are the events a webhook subscription can receive. Omit events (or pass an empty array) when creating a subscription to receive all of them; otherwise pass a whitelist. Unknown event names are accepted (future-compatible); they just won't deliver until the emitter ships.
| Event | Fires when |
|---|---|
call.started | An inbound or outbound call began |
call.completed | A call ended, with outcome/transcript/booking |
call.missed | A call ended without AI answer |
sms.received | Inbound SMS to a tenant-owned number |
sms.sent | Outbound SMS successfully dispatched (campaigns, /v1/sms/send, internal flows) |
receptionist.ready | VAPI assistant finished provisioning |
receptionist.error | Provisioning failed |
lead.created | New lead inserted via API / CSV / MCP |
lead.updated | Writable fields on a lead changed |
campaign.completed | SMS campaign finished processing its list |
webhook.test | Synthetic event from POST /api/v1/webhooks/:id/test |
usage.threshold | Plan usage crossed an alert threshold (80% or 100% of included minutes) |
call.started
Fired when a call begins (inbound or outbound).
{
"event": "call.started",
"receptionist_id": "uuid",
"data": {
"call_id": "uuid",
"direction": "inbound",
"from": "+12125551234",
"to": "+16145551234",
"started_at": "2026-03-11T14:30:00Z"
},
"timestamp": "2026-03-11T14:30:00.123Z"
}
call.completed
Fired when a call ends. Includes outcome, customer data, and booking info (if applicable).
{
"event": "call.completed",
"receptionist_id": "uuid",
"data": {
"call_id": "uuid",
"direction": "inbound",
"from": "+12125551234",
"to": "+16145551234",
"duration_seconds": 180,
"outcome": "booked",
"customer_name": "John Smith",
"customer_phone": "+12125551234",
"transcript_summary": "Customer scheduled AC repair...",
"booking": {
"confirmation": "BK-20260315-ABC",
"date": "2026-03-15",
"time": "10:00",
"service_type": "AC Repair",
"address": "123 Main St, Columbus, OH"
},
"started_at": "2026-03-11T14:30:00Z",
"ended_at": "2026-03-11T14:33:00Z"
},
"timestamp": "2026-03-11T14:33:01.456Z"
}
call.missed
Fired when a call is missed or abandoned.
{
"event": "call.missed",
"receptionist_id": "uuid",
"data": {
"call_id": "uuid",
"from": "+12125551234",
"to": "+16145551234",
"missed_at": "2026-03-11T14:30:00Z",
"recovery_scheduled": false
},
"timestamp": "2026-03-11T14:30:05.789Z"
}
sms.received
Fired when the receptionist receives an inbound SMS.
{
"event": "sms.received",
"receptionist_id": "uuid",
"data": {
"sms_id": "msg_abc123",
"from": "+12125551234",
"to": "+16145551234",
"message": "Yes, 10 AM works for me!",
"received_at": "2026-03-11T15:05:00Z",
"is_opt_out": false
},
"timestamp": "2026-03-11T15:05:00.321Z"
}
sms.sent
Fired when an outbound SMS is successfully dispatched. This covers campaign sends, POST /api/v1/sms/send, and internal flows.
receptionist.ready
Fired when a new receptionist finishes provisioning and is ready to take calls.
{
"event": "receptionist.ready",
"receptionist_id": "uuid",
"data": {
"phone_number": "+16145559876",
"assistant_id": "asst_...",
"plan": "growth",
"provisioned_at": "2026-03-11T12:00:30Z"
},
"timestamp": "2026-03-11T12:00:30.654Z"
}
receptionist.error
Fired if provisioning or a critical operation fails.
lead.created
Fired when a new lead is inserted via API, CSV import, or MCP.
lead.updated
Fired when writable fields on a lead change.
campaign.completed
Fired when an SMS campaign finishes processing its list.
webhook.test
Synthetic event fired by POST /api/v1/webhooks/:id/test. It is delivered through the real HMAC signing path (single attempt, no retry), so you can use it to verify your endpoint and signature check end to end. The test payload carries an event id (prefixed evt_) and type: "webhook.test".
usage.threshold
Fired when account usage hits 80% or 100% of included minutes.
{
"event": "usage.threshold",
"data": {
"threshold": 80,
"minutes_used": 400,
"minutes_included": 1000,
"billing_period_end": "2026-04-01T00:00:00Z"
},
"timestamp": "2026-03-25T09:15:00Z"
}