Close a v2 conversation
Authorizations
Path Parameters
Body
Canonical reasons a voice/runtime session ended.
Stored on ConversationSession.internal_termination_reason via the
:class:SessionTerminationReasonType TypeDecorator — Python
surfaces the enum, the DB column itself is plain VARCHAR(64) with no
Postgres ENUM type and no CHECK constraint, so extending the enum is
a Python-only change (no migration needed).
AGENT_INITIATED covers every LLM-driven end (the agent decided the
conversation is over). UNKNOWN is the defensive fallback any
string that fails to coerce lands on — both at write time (via
coerce_termination_reason in src/runtime/contracts.py) and at
read time (via :meth:SessionTerminationReasonType.process_result_value
when a legacy / drifted value is loaded from the row).
voicemail_detected, silence_timeout, max_call_duration, participant_left, pipeline_exit, user_requested, agent_initiated, resolved, unresolved, abandoned, escalated, handoff_resolved, transferred, error, unknown, callee_busy, callee_no_answer, callee_unavailable, callee_declined, callee_not_found, sip_failed, unknown_reason, client_initiated, duplicate_identity, server_shutdown, participant_removed, room_deleted, state_mismatch, join_failure, migration, signal_close, room_closed, user_unavailable, user_rejected, sip_trunk_failure, connection_timeout, media_failure, agent_error, dispatch_failed, token_mint_failed, sip_dial_failed, participant_join_timeout, setup_error, stale_routing, superseded, duplicate_dispatch 64Response
Successful Response
queued, ringing, active, paused, waiting_for_human, transferred, awaiting_approval, closed, expired, error, superseded low, normal, high, urgent inbound, outbound live, test, simulation Rollup of eval runs that targeted a session.
succeeded = runs where status='completed' AND every score has passed=true.
failed = total - succeeded - pending (failed-status runs + completed-but-not-all-passed).
pending = runs still queued or running.
The critical_* counterparts restrict the same aggregation to runs whose
binding was marked is_critical=True (snapshotted onto the run). They drive
the session headline pill — non-critical evals still run and display but
don't move the verdict. eval_status collapses the critical counts to a
single headline label (none when no criticals are configured).