Call finished and fully processed
Sent once per call, to the endpoint on your webhook subscription (POST /v2/webhooks) or, if you have none, to the webhook_url configured on the agent.
Sent once per call, to the endpoint on your webhook subscription (POST /v2/webhooks) or, if you have none, to the webhook_url configured on the agent.
It waits for the transcript, the recording, the cost and the analyses — or ten minutes after the call ends, whichever comes first, with processing_incomplete and missing_fields naming anything that never arrived. A call that did not connect is sent about a minute after it ends. A scheduled call cancelled before it dialled produces none.
Deliveries are signed, retried on failure, and listed at GET /v2/webhooks/deliveries. Reply 2xx to acknowledge; anything else is retried. event_id is stable per EVENT — byte-identical across all four delivery attempts — so key your handler's dedup on it; a retry can arrive after your first attempt already succeeded, and it carries the same event_id. (X-Graine-Delivery-Id is the per-delivery id, for support, never for dedup.)
Rate limit: none — this is an event Graine delivers to you, not a request you make. Delivery pacing is the retry schedule (four attempts inside ~two minutes); your endpoint's only obligation is a 2xx within 30 seconds.
all_processing_completedAuthorization
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.
"all_processing_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.
statusRequiredstring
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_costnumber | null
Total cost of the call. Null until it is billed; 0.0 for a call billed at zero or whose charge was suppressed (a voicemail).
call_cost_currencystring | null
Currency of call_cost and cost_breakdown. USD unless configured otherwise.
cost_breakdownobject | null
Cost per component — telephony, llm, network, platform, synthesizer, transcriber and total, always all seven when present. Null when no breakdown was stored.
call_durationnumber | null
Call duration in seconds, as the carrier reported it.
agent_message_countinteger | null
The agent's turns in the transcript; null when there is no transcript.
user_message_countinteger | null
The customer's turns in the transcript; null when there is no transcript.
overall_latency_secondsnumber | null
Mean time to the agent's first token across the call's turns, in seconds.
first_utterance_secondsnumber | null
When the agent spoke its welcome message, in seconds from the start of the conversation.
transcriptarray | null
The conversation, one {role, content} entry per turn, in order. Null when there is none; [] only when the body was truncated past its first turn.
transcript_statusstring | null
available | unavailable | truncated.
recording_urlstring | null
Where to fetch the audio, when recording was on.
recording_durationnumber | null
Always null: recording length is not reported. Use call_duration.
retry_countinteger | null
Which retry this call is. 0 means the first attempt, or that the retry number is not known; attempts and retry_chain are exact.
attemptsarray | null
Every dial attempt on this contact, oldest first, each {call_id, status, attempted_at, retry_count, from_number}. Null for a call placed directly, which has no contact.
parent_call_idstring | null
The call this one is a retry or follow-up of.
retry_chainarray | null
Every execution_id in this contact's retry chain, oldest first. [] when there is none.
platform_analysisobject | null
What the platform extracted, always with these eleven keys: summary, call_disconnect_reason, key_points, action_items, callback_requested, callback_time, sentiment, sentiment_score, sentiment_analysis, tags, timezone.
platform_analysis_statusstring | null
completed (summary and sentiment) | partial (one of the two) | unavailable (neither).
client_analysisobject | null
The Custom Analysis variables you configured on the agent, extracted from the transcript. Always an object.
client_analysis_statusstring | null
completed | not_configured | unavailable (configured, no transcript) | pending (configured, but the extraction had not landed when the event was sent).
tool_call_logsarray | null
The API tools the agent called during the call, in order. Null — never [] — when none were reported.
collected_fieldsobject | null
A flow agent's collected fields: each field its paths collected, by name, with the latest value. Null — never {} — for any other agent, or when nothing was collected.
answered_by_voice_mailboolean | null
True when a machine picked up; null when that was never recorded.
hangup_bystring | null
Who ended the call: Caller, Callee, Agent, Provider, Transfer or system. Display text — branch on sub_status.
ab_version_idstring | null
The A/B experiment this call was routed by, if any.
ab_is_variantboolean | null
True when this call used the challenger agent.
processing_incompleteboolean | null
True when the event was sent before every part landed — the wait for transcript, recording, cost and analysis ends ten minutes after the call does.
missing_fieldsarray | null
What had not landed when processing_incomplete is true — any of transcript, cost, recording, followup_analysis, client_analysis. [] otherwise.

