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

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"
  }
}