Graine AI

Call Lifecycle

What happens from POST /v2/calls to the finished record — every stage, which status you see, and exactly when each field becomes readable.

This page traces one outbound call from the API request to the fully-populated record. Inbound calls join at the ringing stage; everything after that is identical.

The flow

POST /v2/calls

   ├─ scheduled_at set ──► scheduled ──(due time, calling window open)──┐
   │                          ▲                                        │
   │                          └──── rescheduled ◄── window closed ─────┤
   │                                                                   ▼
   └─ immediate ─────────► queued ──► initiated ──► ringing ──► in-progress
                                          │            │             │
                                          ▼            ▼             ▼ (hangup)
                                       failed    no-answer/busy   TERMINAL STATUS
                                                                (completed, …)

                                              post-call processing (still running)
                                              transcript · cost · recording · analysis


                                                  all_processing_completed webhook

Stage by stage

  1. Accepted. POST /v2/calls validates and answers 201 with status: "queued" — or, with scheduled_at, 202 with status: "scheduled". Nothing has dialled yet.
  2. Scheduled calls wait, and re-check the window. At fire time the agent's Calling Window is evaluated again; a call whose window has closed moves to rescheduled and is booked for a time inside the next open window rather than rejected — spread across the window, not stacked on the minute it opens, so a night's worth of deferred calls does not all ring at once.
  3. Dialling. The call is handed to the telephony network: initiated, then ringing. A call nobody answers ends here as no-answer or busy.
  4. Conversation. On answer the status is in-progress and the voice pipeline runs — transcription, the agent's reasoning, speech synthesis — one loop per conversational turn.
  5. Hangup ⇒ terminal status, immediately. When the call ends — whoever ended it, and why, is the subject of Hangups & Termination — the status moves straight to its terminal value and is_terminal becomes true. There is no intermediate "post-processing" status.
  6. Enrichment continues after the status is terminal. Transcript assembly, cost, the recording and analysis land in the seconds that follow.
  7. The webhook fires when everything has landed. The all_processing_completed event waits on all of it and carries the full 47-field record — with processing_incomplete and missing_fields naming anything that never arrived.

Terminal means the call is over — not that every field has landed

This is the one place this platform differs from the pattern many integrations expect. is_terminal: true the moment the line drops; cost, recording_url and transcript may still be null on that same read. If you poll, stop on is_terminal and the field you need being non-null. If you can, don't poll — the consolidated webhook exists precisely so you never have to guess when enrichment finished.

When each field becomes readable

FieldAvailable
status, is_terminalImmediately at every stage.
duration_secondsAt hangup, from the carrier — the carrier figure is authoritative.
transcriptSeconds after hangup, once assembly completes. GET /v2/calls/{execution_id}/transcript answers status: "unavailable" while it is pending — never a 404.
costWhen billing runs, shortly after hangup. null means not yet billed; 0.0 means billed at zero (a voicemail, for example).
recording_urlWhen the recording is stored. A call that was never answered produces none.
summary, analysisWhen post-call analysis completes.
per-turn timingsWith the same report that carries the transcript. See Execution Logs.

A canceled call that never dialled is the one case where these fields never arrive: nothing was placed, nobody was rung, and no minutes are billed.

Statuses

The full fifteen-value enum, the terminal / in-flight / failure sets, and the spelling rules live on Errors & Statuses. The webhook's own nine-value vocabulary is on Webhook Payloads.

On this page