Skip to content

Read a call

GET
/v1/calls/{call_id}
curl --request GET \
--url https://api.vocapable.com/v1/calls/example \
--header 'Authorization: Bearer <token>'

The call detail, with its analysis object once post-call scoring has run.

analysis is null until the worker scores the call (docs/04-api.md Step 8a). It is also served null - with a warning logged - when the stored verdict was written by a results schema this deploy cannot read (a rollback across a schema bump): the call detail is the primary resource and must not fail for a sidecar document, and the verdict itself stays in the eval_runs ledger, readable again once the deploy catches up.

call_id
required
Call Id
string

Successful Response

Media typeapplication/json
Call
object
id
required
Id
string
direction
required
CallDirection
string
Allowed values: outbound inbound browser
state
required
CallState
string
Allowed values: initiated ringing in_progress completed no_answer busy failed
campaign_id
Any of:
string
contact_id
Any of:
string
contact_first_name
Any of:
string
contact_last_name
Any of:
string
contact_company
Any of:
string
counterparty_e164
Any of:
string
dialed_e164
Any of:
string
contact_attempt_id
Any of:
string
agent_version_id
required
Agent Version Id
string
agent_id
Any of:
string
agent_name
Any of:
string
use_case
Any of:
string
summary
Any of:
string
captured_fields
Captured Fields
object
key
additional properties
any
recorded_responses
Recorded Responses
Array<object>
RecordedCallResponse

Preview of a saved action, distinct from generated post-call analysis.

object
id
required
Id
string
kind
required
Kind
string
Allowed values: shift_response qualification identity_capture identity_correction
subject_ref
required
Subject Ref
string
response
required
Response
string
revision
required
Revision
integer
source_turn_number
Any of:
integer
note
Any of:
string
note_truncated
Note Truncated
boolean
value
Any of:
string
value_truncated
Value Truncated
boolean
fit_review
Any of:
QualificationFitPreview

A bounded team-decision preview for a current qualification receipt.

object
status
required
Any of:
string
Allowed values: good_fit not_a_fit needs_follow_up
reason
Any of:
string
<= 240 characters
reason_truncated
Reason Truncated
boolean
recorded_response_count
Recorded Response Count
integer
0
started_at
required
Started At
string format: date-time
ended_at
Any of:
string format: date-time
duration_ms
Any of:
integer
end_reason
Any of:
CallEndReason
string
Allowed values: agent_completed contact_hangup opt_out error max_duration
disposition
Any of:
Disposition

Terminal outcome of a contact attempt (docs/06-campaign-engine.md).

string
Allowed values: completed_goal completed_no_goal answered_incomplete voicemail_machine no_answer busy failed opt_out wrong_person_opt_out dnc_hit scrub_blocked blocked_by_policy abandoned_no_slot inbound_unavailable browser_unavailable
sub_code
Any of:
string
recording_id
Any of:
string
created_at
required
Created At
string format: date-time
gpu_node_id
Any of:
string
llm_provider_used
Any of:
string
cost
Cost
object
key
additional properties
any
disposition_id
Any of:
string
disposition_notes
Any of:
string
disposition_set_by
Any of:
string
Allowed values: agent_llm human_review
structured_outcome
Structured Outcome
object
key
additional properties
any
conversation_actions
Conversation Actions
Array<object>
ConversationAction

One immutable receipt; latest caller evidence per kind/subject is current.

Revisions record database arrival order and break ties within the same caller turn. Evidence-free legacy receipts rank below receipts with validated caller evidence.

object
id
required
Id
string
call_id
required
Call Id
string
contact_id
required
Any of:
string
kind
required
Kind
string
Allowed values: shift_response qualification identity_capture identity_correction
subject_ref
required
Subject Ref
string
revision
required
Revision
integer
>= 1
response
required
Response
string
payload
required
Payload
object
key
additional properties
any
source_turns
Source Turns
Array<object>
ConversationEvidence
object
turn_number
required
Turn Number
integer
>= 1
text
required
Text
string
>= 1 characters <= 6000 characters
action_confirmation
Any of:
ActionConfirmationProof

Runtime-created attestation, never a model-authored tool argument.

This attests the trusted runtime’s ledger, not independently verified audio. A fresh native tool call is still required before dispatch.

object
kind
required
Kind
string
Allowed values: shift_response qualification
subject_ref
required
Subject Ref
string
>= 1 characters <= 64 characters
response
required
Response
string
Allowed values: accepted declined tentative interested not_interested needs_follow_up unknown
policy_version
Policy Version
string
default: exact_action_v1
Allowed value: exact_action_v1
confirming_turn
required
ConversationEvidence
object
turn_number
required
Turn Number
integer
>= 1
text
required
Text
string
>= 1 characters <= 6000 characters
method
required
Method
string
Allowed values: explicit_statement heard_readback
readback
Any of:
HeardReadbackEvidence

Known playback completion followed by a trusted caller speech onset.

Queue/send times do not establish playback start or completion. Receive time is not caller onset. Unknown or cleared playback cannot produce this proof.

object
question_id
required
Question Id
string
>= 1 characters <= 128 characters
question_text
required
Question Text
string
>= 1 characters <= 6000 characters
playback_completed_at
required
Playback Completed At
string format: date-time
caller_started_at
required
Caller Started At
string format: date-time
created_at
required
Created At
string format: date-time
qualification_reviews
Qualification Reviews
object
key
additional properties
QualificationReviewDetails

Pinned answers and the current review state for a call’s source receipt.

object
fit_review
required
QualificationReviewState

A review applies only to its source receipt, never to later corrections.

object
status
required
Status
string
Allowed values: unreviewed reviewed superseded unavailable
current_action_id
Any of:
string
latest_review
Any of:
QualificationReview
object
id
required
Id
string
action_id
required
Action Id
string
revision
required
Revision
integer
>= 1
decision
required
Decision
string
Allowed values: good_fit not_a_fit needs_follow_up
reason
required
Reason
string
reviewer_ref
required
Reviewer Ref
string
created_at
required
Created At
string format: date-time
qualification_coverage
Any of:
QualificationCoverage

Complete configured question inventory for one current receipt, not a page total.

object
status
required
Status
string
Allowed values: available invalid_record invalid_configuration workflow_mismatch
questions
Questions
Array<object>
<= 50 items
QualificationQuestionCoverage
object
question_id
required
Question Id
string
prompt
Any of:
string
answer_status
required
Answer Status
string
Allowed values: answered unknown refused not_recorded
answer
Any of:
string
analysis
Any of:
CallAnalysis

The customer-facing post-call analysis on the call detail (docs/04-api.md Step 8a).

object
summary
Any of:
string
success_evaluation
required
SuccessEvaluation

The verdict block. rubric_version pins the AgentVersion whose rubric scored the call, so re-publishing an agent never restates past analyses (docs/04-api.md Step 8a).

object
verdict
required
Verdict
string
Allowed values: success failure
rubric_version
required
Rubric Version
string
dimensions
required
AnalysisDimensions

The per-dimension P1 verdicts (docs/08-ai-quality.md §Production auto-scoring).

The floor dimensions - disclosure_given and optout_honored - appear on every call and are never waivable; no field here is optional because the worker scores all of them or writes nothing.

object
goal_completion
required
AnalysisDimensionResult

One scored dimension inside analysis.success_evaluation (docs/04-api.md Step 8a).

not_applicable means the call gave the dimension nothing to judge (no opt-out was signalled, no pack is pinned); unscored means it could not be evaluated - reachable only for a judge dimension, never for the compliance floor. claims_checked is populated on pack_grounded alone.

object
result
required
Result
string
Allowed values: pass fail not_applicable unscored
basis
Any of:
string
score
Any of:
number
claims_checked
Any of:
integer
disclosure_given
required
AnalysisDimensionResult

One scored dimension inside analysis.success_evaluation (docs/04-api.md Step 8a).

not_applicable means the call gave the dimension nothing to judge (no opt-out was signalled, no pack is pinned); unscored means it could not be evaluated - reachable only for a judge dimension, never for the compliance floor. claims_checked is populated on pack_grounded alone.

object
result
required
Result
string
Allowed values: pass fail not_applicable unscored
basis
Any of:
string
score
Any of:
number
claims_checked
Any of:
integer
optout_honored
required
AnalysisDimensionResult

One scored dimension inside analysis.success_evaluation (docs/04-api.md Step 8a).

not_applicable means the call gave the dimension nothing to judge (no opt-out was signalled, no pack is pinned); unscored means it could not be evaluated - reachable only for a judge dimension, never for the compliance floor. claims_checked is populated on pack_grounded alone.

object
result
required
Result
string
Allowed values: pass fail not_applicable unscored
basis
Any of:
string
score
Any of:
number
claims_checked
Any of:
integer
pack_grounded
required
AnalysisDimensionResult

One scored dimension inside analysis.success_evaluation (docs/04-api.md Step 8a).

not_applicable means the call gave the dimension nothing to judge (no opt-out was signalled, no pack is pinned); unscored means it could not be evaluated - reachable only for a judge dimension, never for the compliance floor. claims_checked is populated on pack_grounded alone.

object
result
required
Result
string
Allowed values: pass fail not_applicable unscored
basis
Any of:
string
score
Any of:
number
claims_checked
Any of:
integer
latency
required
AnalysisLatency

Per-call latency against the voice SLO, from the persisted turn ledger.

object
turns_measured
Turns Measured
integer
0
voice_to_voice_p50_ms
Any of:
number
voice_to_voice_p95_ms
Any of:
number
llm_ttft_p50_ms
Any of:
number
llm_ttft_p95_ms
Any of:
number
score
Any of:
number
structured_data
Structured Data
object
key
additional properties
any
updated_at
required
Updated At
string format: date-time
Example
{
"direction": "outbound",
"state": "initiated",
"recorded_responses": [
{
"kind": "shift_response",
"note_truncated": false,
"value_truncated": false,
"fit_review": {
"status": "good_fit",
"reason_truncated": false
}
}
],
"recorded_response_count": 0,
"end_reason": "agent_completed",
"disposition": "completed_goal",
"disposition_set_by": "agent_llm",
"conversation_actions": [
{
"kind": "shift_response",
"action_confirmation": {
"kind": "shift_response",
"response": "accepted",
"policy_version": "exact_action_v1",
"method": "explicit_statement"
}
}
],
"qualification_reviews": {
"additionalProperty": {
"fit_review": {
"status": "unreviewed",
"latest_review": {
"decision": "good_fit"
}
},
"qualification_coverage": {
"status": "available",
"questions": [
{
"answer_status": "answered"
}
]
}
}
},
"analysis": {
"success_evaluation": {
"verdict": "success",
"dimensions": {
"goal_completion": {
"result": "pass"
},
"disclosure_given": {
"result": "pass"
},
"optout_honored": {
"result": "pass"
},
"pack_grounded": {
"result": "pass"
},
"latency": {
"turns_measured": 0
}
}
}
}
}

Validation Error

Media typeapplication/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationError
object
loc
required
Location
Array
msg
required
Message
string
type
required
Error Type
string
input
Input
ctx
Context
object
Examplegenerated
{
"detail": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example",
"input": "example",
"ctx": {}
}
]
}