Graine AI

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.

POST
/call_progress

Authorization

Authorization
Required
Bearer <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/jsonRequired

event_type
Required
string

Which event this is. Branch on this.

Value in: "call_completed" | "call_declined" | "call_expired" | "call_missed" | "call_ringing" | "call_started" | "client_analysis_completed" | "platform_analysis_completed" | "recording_completed"

event_id
Required
string | 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_id
Required
string | 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.

Value in: "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.

Response Body