GEThttps://core-api.heysadie.ai/full-call-runs/{id}
id success data run organizationId bankId candidateTranscriberId selection callIds calibrationTurns callCount estimate calls callerTurns audioSeconds estimatedCostUsd status analysisSampled error createdBy createdAt startedAt finishedAt totals identical differing audioPathAgreement labeled candidateRight productionRight sameMeaning bothWrong reviewed fixed introduced introducedEstimate progress done total patterns title example production candidate turns turnIds note verdict cost estimatedUsd actualUsd metadata timestamp version path code message details fieldGet a full-call run
A run with its totals, its progress, the judge's regression patterns and verdict, and its cost. Totals, progress and cost are computed on read; patterns and verdict are stored by the analysis, empty until the first one finishes, and during a relabel the previous ones stay until replaced. - Poll while `run.status` is queued, running or analyzing; the response then carries `Retry-After: 5` (seconds). Stop at completed, cancelled or error. - `progress.done` out of `progress.total` is the candidate's progress through the caller turns. The analysis (labels, patterns, verdict) follows while the status is analyzing. - Compare `totals.fixed` (lines the candidate fixed) with `totals.introduced` (lines it broke). `patterns` groups what it breaks, `verdict` is the judge's advice, and `totals.audioPathAgreement` says how far replay itself drifts from live. - Drill in with GET /full-call-runs/:id/calls, /turns and /review-queue. Errors: 404 RESOURCE_NOT_FOUND when the run is not in the organization.
Try it in the API ExplorerExample request
curl "https://core-api.heysadie.ai/full-call-runs/FULL_CALL_RUN_ID" \
-H "Authorization: ApiKey YOUR_API_KEY"Authentication
Authenticate with an API key in the Authorization header using the ApiKey scheme. See Authentication for how keys work and where to get them.
AuthorizationstringrequiredAPI key in the ApiKey scheme: ApiKey YOUR_API_KEY. Tenant keys authorize their own tenant; organization keys can act on any tenant in the organization.
X-Tenant-Idstring (uuid)optionalRequired when authenticating with an organization key: it selects the tenant the request acts on. Omit with tenant keys.
Request
Path parameters
idstringrequiredA full-call run of the organization
Responses
successbooleanrequiredtrue on every 2xx
dataobjectoptionalThe result
Show 6 child properties
runobjectrequiredA full-call run: one candidate replayed on every caller line of up to 10 calls and compared with production
Show 15 child properties
idstringrequiredRun id
organizationIdstringrequiredThe organization that owns the run
bankIdstringrequiredThe bank the run belongs to
candidateTranscriberIdstringrequiredThe candidate replayed
selectionobjectrequiredThe calls asked for
Show 1 child properties
callIdsstring[]requiredThe calls the run replays, in the order they were asked for
calibrationTurnsstring (integer) | integerrequiredRandom turns asked for on which production is also replayed
callCountstring (integer) | integerrequiredCalls the run snapshotted
estimateobjectrequiredWhat the run replays and costs, as estimated at creation
Show 4 child properties
callsstring (integer) | integerrequiredSelected calls with a caller turn
callerTurnsstring (integer) | integerrequiredCaller lines with audio bounds; each becomes a turn
audioSecondsnumberrequiredAudio the worker replays: every turn through the candidate, plus the calibration sample through production
estimatedCostUsdnumberrequiredSTT cost in USD, 6 decimals
statusenumrequiredqueued: waiting for a worker. running: the candidate is replaying the turns. analyzing: the LLM judge is labeling the differing turns and writing patterns and a verdict. completed: done. cancelled: stopped by POST /full-call-runs/:id/cancel. error: failed, see `error`. queued, running and analyzing can still change; poll until completed, cancelled or error
"queued""running""analyzing""completed""cancelled""error"analysisSampledbooleanrequiredThe differing turns outnumbered what the analysis takes (2000), so it labeled a sample
errorstring | nullrequiredWhy the run failed. Null unless status is error
createdBystring | nullrequiredWho made it, as the creating request named them in an `X-On-Behalf-Of` header. Null when it sent none
createdAtstring (date-time) | string (date) | number | nullrequiredWhen it was created, UTC
startedAtstring (date-time) | string (date) | number | nullrequiredWhen its first job was dispatched to a worker, UTC
finishedAtstring (date-time) | string (date) | number | nullrequiredWhen it completed, failed or was cancelled, UTC
totalsobjectrequiredCounts over the run's turns, computed on read
Show 10 child properties
callsstring (integer) | integerrequiredCalls with a turn in the run
callerTurnsstring (integer) | integerrequiredTurns in the run, one per caller line
identicalstring (integer) | integerrequiredTurns whose candidate text equals production, normalized
differingstring (integer) | integerrequiredTurns whose candidate text differs from production
audioPathAgreementnumber | nullrequiredShare, 0 to 1, of calibration replays that equal the stored production text, normalized, 4 decimals. Low agreement means replayed audio itself transcribes differently, so treat differences with care. Null before any replay succeeded
labeledobjectrequiredDiffering turns by the judge's label
Show 4 child properties
candidateRightstring (integer) | integerrequiredTurns marked candidate_right
productionRightstring (integer) | integerrequiredTurns marked production_right
sameMeaningstring (integer) | integerrequiredTurns marked same_meaning
bothWrongstring (integer) | integerrequiredTurns marked both_wrong
reviewedobjectrequiredDiffering turns by a person's review
Show 4 child properties
candidateRightstring (integer) | integerrequiredTurns marked candidate_right
productionRightstring (integer) | integerrequiredTurns marked production_right
sameMeaningstring (integer) | integerrequiredTurns marked same_meaning
bothWrongstring (integer) | integerrequiredTurns marked both_wrong
fixedstring (integer) | integerrequiredDiffering turns the candidate got right and production got wrong: by the expected text where the line has a flag, else by the review, else the label
introducedstring (integer) | integerrequiredThe mirror of fixed: production right, the candidate wrong. These are the regressions a switch would bring
introducedEstimatestring (integer) | integer | nullrequiredintroduced scaled from the judged differing turns to all of them. Null while none is judged
progressobjectrequiredHow far the candidate is through the run's caller turns, for a progress bar: done / total
Show 2 child properties
donestring (integer) | integerrequiredCaller turns the candidate has finished, with a transcript or an error
totalstring (integer) | integerrequiredtotals.callerTurns
patternsobject[]requiredWhere the candidate got worse (production_right turns), clustered by the judge, at most 6. Stored by the analysis: empty until the first analysis finishes, and during a relabel the previous patterns stay until replaced
Show 5 item properties
titlestringrequiredA few words naming the mistake
exampleobjectrequiredOne turn of the pattern
Show 2 child properties
productionstringrequiredProduction's text
candidatestringrequiredThe candidate's text
turnsstring (integer) | integerrequiredturnIds.length
turnIdsstring[]requiredThe turns that show the mistake
notestringrequiredOne sentence on what the candidate gets wrong
verdictstring | nullrequiredThe judge's 2 to 4 sentence advice on switching: what the candidate fixes, what it breaks. Stored by the analysis: null until the first analysis finishes, and during a relabel the previous verdict stays until replaced
costobjectrequiredWhat the run costs
Show 2 child properties
estimatedUsdnumberrequiredThe estimate at creation, USD
actualUsdnumber | nullrequiredSum over the run's priced jobs, USD, 6 decimals: transcription and judge tokens, priced from the catalogue; an unpriced model counts as 0. Null while no job is priced
metadataobjectoptionalRequest metadata
Show 3 child properties
timestampstringrequiredWhen the server answered, ISO 8601 UTC
versionstringrequiredAPI version
pathstringoptionalThe URL that was requested
400VALIDATION_ERROR: a path id, query parameter or body field broke a rule; `details` lists each `field` and its `message`. A body with a missing field or a JSON type the schema does not allow answers 400 with code INTERNAL_SERVER_ERROR and no `details` instead, so branch on the status
successbooleanrequiredfalse on every error
errorobjectoptionalWhat went wrong: a stable `code` to branch on and a human-readable `message`
Show 3 child properties
codeenumrequiredA parameter or body field broke a rule
"VALIDATION_ERROR"messagestringrequiredHuman-readable explanation. Do not parse it; branch on `code`
detailsobject[]optionalOne entry per field that failed
Show 2 item properties
fieldstringrequiredThe offending field
messagestringrequiredThe rule it broke
metadataobjectoptionalRequest metadata
Show 3 child properties
timestampstringrequiredWhen the server answered, ISO 8601 UTC
versionstringrequiredAPI version
pathstringoptionalThe URL that was requested
401UNAUTHORIZED: no valid credentials, or a dashboard token that names no organization. Send `Authorization: ApiKey <organization API key>`
successbooleanrequiredfalse on every error
errorobjectoptionalWhat went wrong: a stable `code` to branch on and a human-readable `message`
Show 2 child properties
codeenumrequiredNo valid credentials
"UNAUTHORIZED"messagestringrequiredHuman-readable explanation. Do not parse it; branch on `code`
metadataobjectoptionalRequest metadata
Show 3 child properties
timestampstringrequiredWhen the server answered, ISO 8601 UTC
versionstringrequiredAPI version
pathstringoptionalThe URL that was requested
403ORG_SCOPE_REQUIRED: transcriber testing is an organization feature. Use an organization API key without `X-Tenant-Id`, or a dashboard token scoped to the organization. A tenant API key, an organization key sent with `X-Tenant-Id` for one of its tenants, or a token carrying a tenant gets this 403. FORBIDDEN: an organization key sent `X-Tenant-Id` for a tenant outside its organization
successbooleanrequiredfalse on every error
errorobjectoptionalWhat went wrong: a stable `code` to branch on and a human-readable `message`
Show 2 child properties
codeenumrequiredORG_SCOPE_REQUIRED: the credentials carry a tenant scope. FORBIDDEN: an organization key sent `X-Tenant-Id` for a tenant outside its organization
"ORG_SCOPE_REQUIRED""FORBIDDEN"messagestringrequiredHuman-readable explanation. Do not parse it; branch on `code`
metadataobjectoptionalRequest metadata
Show 3 child properties
timestampstringrequiredWhen the server answered, ISO 8601 UTC
versionstringrequiredAPI version
pathstringoptionalThe URL that was requested
404RESOURCE_NOT_FOUND: an id in the path, query or body names nothing in the caller's organization. `message` names what, e.g. "Transcriber bank not found"
successbooleanrequiredfalse on every error
errorobjectoptionalWhat went wrong: a stable `code` to branch on and a human-readable `message`
Show 2 child properties
codeenumrequiredAn id names nothing the caller can see
"RESOURCE_NOT_FOUND"messagestringrequiredHuman-readable explanation. Do not parse it; branch on `code`
metadataobjectoptionalRequest metadata
Show 3 child properties
timestampstringrequiredWhen the server answered, ISO 8601 UTC
versionstringrequiredAPI version
pathstringoptionalThe URL that was requested
500An unexpected server error
successbooleanrequiredfalse on every error
errorobjectoptionalWhat went wrong: a stable `code` to branch on and a human-readable `message`
Show 2 child properties
codeenumrequiredAn unexpected server failure
"INTERNAL_SERVER_ERROR"messagestringrequiredHuman-readable explanation. Do not parse it; branch on `code`
metadataobjectoptionalRequest metadata
Show 3 child properties
timestampstringrequiredWhen the server answered, ISO 8601 UTC
versionstringrequiredAPI version
pathstringoptionalThe URL that was requested