Events
Every webhook uses the same envelope with a typed data payload.
The envelope
Every body has the same top-level shape:
{
"id": "evt_abc123...", // unique per event, stable across retries
"type": "call.ended", // one of the event types below
"created_at": "2026-04-17T19:12:03.482Z",
"api_version": "v1",
"data": { ... } // payload — shape depends on type
}The envelope is versioned independently of the REST API. If we ever need to change its structure in a breaking way, api_version bumps and a deprecation window gets announced. See versioning.
Forward compatibility
- Ignore unknown top-level fields. We may add new envelope keys within v1. Don't throw on them.
- Ignore unknown fields inside
data. Same rule — parse what you care about, skip the rest. - Handle unknown event types. We may add new types. Match by prefix (
call.*) or fall back to an "unknown type" branch rather than crashing.
call.ended
Fires after every customer call completes, regardless of outcome.
{
"id": "evt_...",
"type": "call.ended",
"created_at": "2026-04-17T19:12:03.482Z",
"api_version": "v1",
"data": {
"call_id": "uuid",
"location_id": "uuid | null",
"started_at": "2026-04-17T19:06:12.000Z",
"ended_at": "2026-04-17T19:11:58.000Z",
"duration_seconds": 346,
"direction": "inbound",
"from_number": "redacted or null",
"disposition": "completed" | "hangup" | "transferred" | "escalated" | "missed",
"summary": "Caller rescheduled their 3pm appointment to Friday...",
"outcome_tags": ["reschedule", "appointment"],
"contact_id": "uuid | null",
"call_url": "https://allisonvoice.com/dashboard/calls/<id>"
}
}Transcripts are available via GET /v1/calls/{id} — we keep the webhook payload compact to fit well-behaved receivers.
call.callback_requested
Caller asked for a human callback. Also sent in real time via email to configured notification recipients — the webhook lets you route callbacks through your own system as well.
{
"id": "evt_...",
"type": "call.callback_requested",
"created_at": "2026-04-17T19:08:44.118Z",
"api_version": "v1",
"data": {
"call_id": "uuid",
"location_id": "uuid | null",
"contact_id": "uuid | null",
"callback_number": "+1555XXXXXXX | null",
"requested_window": "asap" | "morning" | "afternoon" | "evening" | "custom",
"custom_window": "string | null",
"reason": "Caller wants to talk about financing options",
"requested_team_member_id": "uuid | null"
}
}call.message_taken
Caller left a message for a specific team member.
{
"id": "evt_...",
"type": "call.message_taken",
"created_at": "...",
"api_version": "v1",
"data": {
"call_id": "uuid",
"location_id": "uuid | null",
"contact_id": "uuid | null",
"for_team_member_id": "uuid | null",
"for_team_member_name": "Jane Smith",
"message": "Please call back about the Thursday delivery",
"caller_name": "John Doe | null",
"callback_number": "+1555XXXXXXX | null"
}
}call.escalation_triggered
An escalation rule matched during or after the call and the caller was routed to a human (transferred, SMS'd, or notified via your configured channel).
{
"id": "evt_...",
"type": "call.escalation_triggered",
"created_at": "...",
"api_version": "v1",
"data": {
"call_id": "uuid",
"location_id": "uuid | null",
"rule_id": "uuid",
"rule_name": "After-hours emergency",
"destination_type": "team_member" | "phone" | "email" | "sms",
"destination_id": "uuid | null",
"triggered_by": "keyword" | "llm_classification" | "caller_request",
"context": "Caller reported a water leak..."
}
}call.appointment_booked
A booking was created during the call (Allison confirmed it on-the-line).
{
"id": "evt_...",
"type": "call.appointment_booked",
"created_at": "...",
"api_version": "v1",
"data": {
"booking_id": "uuid",
"call_id": "uuid",
"calendar_id": "uuid",
"service_id": "uuid | null",
"service_name": "Consultation | null",
"location_id": "uuid | null",
"team_member_id": "uuid | null",
"start_at": "2026-04-22T15:00:00Z",
"end_at": "2026-04-22T15:30:00Z",
"timezone": "America/New_York",
"contact_id": "uuid | null",
"source": "allison_voice"
}
}contact.created
A new caller contact was auto-created from a call. Useful for syncing into your CRM as soon as someone reaches Allison for the first time.
{
"id": "evt_...",
"type": "contact.created",
"created_at": "...",
"api_version": "v1",
"data": {
"contact_id": "uuid",
"phone": "+1555XXXXXXX | null",
"name": "John Doe | null",
"email": "john@example.com | null",
"first_call_id": "uuid",
"first_call_at": "2026-04-17T19:06:12.000Z",
"source": "inbound_call"
}
}