Every event envelope has this top-level shape:
Below, each event’s data block is documented.
Call lifecycle
call.started
Fires when the dialer originates a call (pre-answer).
call.answered
Fires on CHANNEL_ANSWER — the callee picked up.
call.ended
Fires on CHANNEL_HANGUP. The most common event customers subscribe to.
recording_url is null on call.ended; wait for call.recording_ready
once the GCS upload completes (typically +2–5s after hangup).
call.recording_ready
Fires when the recording is uploaded and a signed URL is available.
The signed URL expires 7 days after issue. If you archive
recordings, pull them down promptly.
call.transcript_ready
Fires when Gemini transcription completes (typically +30–60s after
recording upload).
Lead lifecycle
lead.completed
Fires when a lead reaches a terminal state (completed, failed,
dnd, or no_answer after exhausted retries).
Campaign lifecycle
campaign.started
campaign.paused
Fires on BOTH manual and auto-pause. Distinguish via data.source:
campaign.resumed
Symmetric to paused. source is "manual" in all current paths
(auto-resume from safety-sweep doesn’t exist — humans re-enable).
campaign.completed
Agent lifecycle
agent.logged_in
agent.logged_out
v2 events (coming)
These will land in v1.1 / v2: