Voice

Complete

Final outcome, summary and answers; adds ``call_completed`` to the timeline. Idempotent. The first completion also stores the transcript and queues the post-call AI analysis (summary + extracted fields, shown on ``GET /calls/{call_id}``).

API key access

This route has its own authentication (or none); an API key is not used here.
POST/api/v1/calls/{call_id}/complete
AuthorizationBearer <token>

Per-call token issued when the call was created (job metadata api_token).

In: header

Path Parameters

call_idstring
Formatuuid

Header Parameters

X-Workspace-Id?string | null

Workspace of the call (must match the token).

lead_idstring
Formatuuid
outcomeCallOutcome

What the conversation achieved. Decided by the voice agent's code, not the LLM (same values as reachout_voice.api_client.CallOutcome).

Value in"booked" | "callback_scheduled" | "not_qualified" | "opted_out" | "human_requested" | "wrong_person" | "no_decision" | "caller_hung_up"
summary?string
Default""
Lengthlength <= 10000
answers?object

Empty Object

transcript?array<TranscriptTurn>

The conversation (at most 1000 turns), for the post-call analysis (RO-042). Stored on the first completion only.

Itemsitems <= 1000

Response Body

curl -X POST "http://localhost:8000/api/v1/calls/497f6eca-6276-4993-bfeb-53cbbbba6f08/complete" \  -H "X-Workspace-Id: string" \  -H "Content-Type: application/json" \  -d '{    "lead_id": "9bddab70-98e6-43a9-8f32-c9788b9de0c0",    "outcome": "booked"  }'
{
  "status": "queued",
  "outcome": {},
  "ignored_answer_fields": [
    "string"
  ]
}
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}