Retry Finalization
Retry finalization for a call, re-running AI jobs.
Request
- Base URLhttps://dev.whispa.net (the document declares no server; this is the origin it was published from)
- Auth
- OAuth 2PasswordToken URL: auth/bearer/login
- or API key in cookie access_token
Path parameters
Response
Successful Response
Team snapshot for this call
Email of the agent who took the call
Display name of the agent who took the call
Call mode enumeration.
Call source enumeration.
Phone extension that handled the call
Inbound destination number reported by the provider, when available
External telephony system call ID
Provider-native call reference (e.g. TCN call_sid/call_type, AWS Connect contact_id) when the provider hosts the call recording. Only some providers support minting a link via /calls/{call_id}/provider-recording-url (TCN today; the endpoint returns 404 for others). For awsconnect this is the stored reference plus instance_alias resolved from the current Connect integration config, which together address the Connect console's contact page — so the alias is whatever is configured now, not whatever was configured when the call happened
Park windows during the call (TCN payment-line transfers): [{suspended_at, resumed_at}] ISO timestamps; resumed_at is null when the call never resumed (grace expired)
Typed call lifecycle events in order: {type, at, detail?, source}. Types: ringing, connected, hold_start, hold_end, consult_start, consult_end, call_suspended, call_resumed, call_ended. Rendered as transcript markers and fed to the summary/coaching/QA prompts
Phone number of the caller/customer
Name of the caller/customer if available
Time spent ringing before call was answered (seconds)
Direction of the call.
- INCOMING: Customer called agent
- OUTGOING: Agent called customer
- INTERNAL: Extension-to-extension call
Number of audio chunks received (0 = no audio captured)
S3 path to the call recording, when one is archived
Whether this call has been saved for later review
Transcript entries (populated from call_transcript_chunks table)
Terminal tool-call events from the autonomous voice agent (persisted tool_call session events), in call order. Payload shape matches the SSE tool_call channel; interleaved into the transcript view behind a toggle.
Structured call summary (new format)
Overall QA scorecard score (mirror of analyzer_artifacts['qa_scorecard']['overall_score']).
End-client the call collected for, classified against the scenario's configured client list ('Other' for an explicitly named unconfigured creditor; 'Unclear' for insufficient or ambiguous context; null when no classification result was produced). Full result with disposition, confidence, and evidence in analyzer_artifacts['client_classification'].
Stable client identity for the display-name snapshot
Provider-qualified voice the autonomous agent spoke with, stamped at dispatch from the resolved fallback chain — not re-derived from the scenario, which may have been re-voiced since. Null on human calls. Resolve the display name against the voice catalog (GET /ai-calls/voices).
Provider-qualified TTS model the autonomous agent used, stamped at dispatch rather than re-derived from mutable scenario config.
Call lifecycle state.
- ONGOING: Call is currently in progress
- COMPLETED: Call finished (regardless of whether it was answered)
- ERROR: Technical error/exception during call processing
- UNANSWERED: DEPRECATED - Use status=COMPLETED + telephony_result=NO_ANSWER instead. Kept for backwards compatibility with existing database records.
Telephony-level call connection result.
Represents what happened at the telephony level before any conversation. This is typically provided by the PBX/telephony system, not AI-classified.
Who answered the call (AI-classified from transcript).
This is the first stage of call classification - determining whether a human or voicemail answered the call.
AI-classified judgement of what kind of conversation occurred.
Only applicable when answered_by=HUMAN. Runtime actions such as scheduling a callback or transferring the caller are recorded independently in WorkflowDisposition and must never overwrite this judgement.
Deterministic action the autonomous workflow took before finalizing.
NONE is explicit for finalized autonomous calls with no special handoff/follow-up action. NULL means the dimension does not apply (human copilot, uploaded, or legacy calls), rather than overloading NULL with two meanings.
Normalized reason an autonomous call ended.
The raw runtime string remains in analyzer_artifacts for diagnostics. This enum is the stable operational projection: semantic reasons exposed to the voice model plus bounded technical termination categories. Novel runtime endings degrade to OTHER instead of failing finalization.
Whether the call's terminal classification has been published (outcome_ready_at is set). The exact precondition for correcting answered_by / conversation_outcome — a call can be 'completed' while post-call facts are still finalizing, so clients must gate the correction UI on this rather than on status.
AI-detected scenario from transcript content
Identity-verification outcome for a call, denormalized from the IDV analyzer.
Only set when IDV was required and a verdict was produced. A NULL column can mean IDV was not applicable, is still pending, or no verdict was available; API consumers use idv_required plus call status to distinguish those states. Derived from the terminal identity_verification_state["status"]:
- VERIFIED: status complete — identity confirmed per the scenario's policy.
- PARTIAL: at least one identity factor was confirmed, but the scenario's completion rule was never satisfied.
- INCOMPLETE: required, and not a single factor was confirmed.
PARTIAL exists because "not verified" covers two operationally different calls: one where the customer engaged with verification and it ran out of road, and one where it never started. Only the second is a candidate for "the agent didn't try". Note this is tracking state, not an adherence grade — the leadership IDV rate deliberately reads the reviewed QA scorecard instead (see shared.idv), because a human reviewer can correct it and the analyzer cannot.
There is deliberately no skipped outcome. The live state machine still has a skipped terminal so the analyzer stops firing on a call that is not going to verify, but as a result it said nothing true that incomplete doesn't: verification was required and did not happen. It also read as a third, ambiguous colour on any report — neither pass nor fail — while the thing a reviewer actually needs to know (was skipping appropriate here?) is a transcript judgement the tracker never made.
Which mechanism produced the call's persisted IDV state.
- LIVE: the in-call IDV analyzer's terminal state (the normal path).
- POST_CALL: the post-call IDV judge — runs when the live analyzer never produced a state (e.g. no scenario reached the session) or the scenario was reclassified after the call, judging the full transcript against the resolved scenario's IDV rules.
- INHERITED: the origin leg of a transfer verified the customer, and this recipient leg inherits that verdict — verification travels with the conversation, not the leg (see calls.idv_resolution). The verification exchange is on the origin leg's transcript, not this one's.
Whether the call's resolved scenario requires identity verification. NULL when the scenario record is unavailable.
True when the IDV tracker positively captured the recording disclosure; otherwise NULL.
FK to configured scenario
Whether this call was transferred to/from another call
If transferred, the call session this was transferred FROM
If transferred, the call session this was transferred TO
Percentage of call duration with dashboard open (0-100)
Changes
No recorded changes to this operation across all 1 revision of this API.