Call progress
The events that follow a call while it happens: call_started (queued for dialling — before the phone rings, and not an answer signal), call_ringing, call_completed (the call end…
The events that follow a call while it happens: call_started (queued for dialling — before the phone rings, and not an answer signal), call_ringing, call_completed (the call ended; sent after a 60-second wait for a voicemail verdict), recording_completed, platform_analysis_completed and client_analysis_completed — and, for a call the agent rang in your app, how it ended when nobody talked: call_declined (the user declined it), call_missed (it rang out unanswered) and call_expired (it could not ring in time, so it was not rung). No event marks the moment a call is answered. Each carries the envelope plus a small delta, and only for the event types your subscription names — a dashboard Custom Webhook receives every one of them.
Rate limit: none — this is an event Graine delivers to you, not a request you make. A busy agent fleet can emit these in bursts; answer 2xx within 30 seconds and dedupe on event_id.
call_progressAuthorization
AuthorizationRequiredBearer <token>
Your Graine API key. Create one in the dashboard under Developers, or via POST /v2/api-keys. Send it as Authorization: Bearer <key>.
In: header
Request Body
application/jsonRequiredevent_typeRequiredstring
Which event this is. Branch on this.
"call_completed" | "call_declined" | "call_expired" | "call_missed" | "call_ringing" | "call_started" | "client_analysis_completed" | "platform_analysis_completed" | "recording_completed"event_idRequiredstring | null
Stable per (call, event type): the same on every delivery attempt and if the event is ever sent twice. Your deduplication key.
versionstring | null
Payload version. "1.0" on every event today.
timestampstring | null
When this payload was built, ISO-8601 UTC.
call_idRequiredstring | null
The execution_id you received when the call was placed.
call_sidstring | null
The carrier's own leg id. For support tickets only; null when no carrier accepted the call.
agent_idstring | null
The agent you dialled — the original id, never the A/B variant that served the call.
agent_namestring | null
That agent's name, best-effort; null when it could not be looked up.
organization_idstring | null
Your organization.
workspace_idstring | null
Always the same value as organization_id.
statusstring
The call's public status: queued, initiated, ringing and in_progress while it is under way, then completed, busy, no_answer, failed or canceled. Underscores, not the hyphens of GET /v2/calls. Never null.
"busy" | "canceled" | "completed" | "failed" | "in_progress" | "initiated" | "no_answer" | "queued" | "ringing"sub_statusAny properties in string, string, string
Why the call reached that status. Null while it is under way; UPPERCASE when status is completed and lowercase otherwise, so the casing alone says whether the call connected; sip_ for a carrier response with no name of its own.
call_typestring | null
inbound or outbound.
calling_sourcestring | null
"custom" whenever a carrier carried the call; null when none was recorded. Which carrier is not part of this contract.
custom_args_valuesobject | null
The variables you sent with the call, metadata merged over them, minus platform keys and any key that reads like a sentence. Never null.
to_numberstring | null
The number dialled, E.164.
from_numberstring | null
The caller ID used, E.164.
bulk_list_idstring | null
The batch this call belonged to; null for a call placed directly.
called_onstring | null
When this attempt was dialled, for a call placed by a batch. For any other call it is created_at — for a scheduled call, when it was booked. ISO-8601 UTC.
created_atstring | null
When the call record was created, ISO-8601 UTC.
call_durationnumber | null
call_completed: call duration in seconds, as the carrier reported it.
retry_countinteger | null
call_completed: which retry this call is (0 = the first attempt, or not known).
parent_call_idstring | null
call_completed: the call this one is a retry or follow-up of.
retry_chainarray | null
call_completed: every execution_id in this contact's retry chain, oldest first.
answered_by_voice_mailboolean | null
call_completed: true when a machine picked up.
hangup_bystring | null
call_completed: who ended the call (display text — branch on sub_status).
platform_analysis_statusstring | null
call_completed: always "unavailable" — nothing has been analysed yet. platform_analysis_completed: completed | partial | unavailable.
client_analysis_statusstring | null
call_completed: always "unavailable". client_analysis_completed: always "completed".
recording_urlstring | null
recording_completed: where to fetch the audio.
recording_durationnumber | null
recording_completed: always null.
platform_analysisobject | null
platform_analysis_completed: the eleven-key analysis object.
client_analysisobject | null
client_analysis_completed: your Custom Analysis variables.

