Graine AI

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.

POST
/all_processing_completed

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: "all_processing_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.

status
Required
string

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_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.

Response Body