Skip to content
Transcriber Tests

POSThttps://core-api.heysadie.ai/transcriber-banks/{id}/full-call-runs

id candidateTranscriberId callIds calibrationTurns success data run organizationId bankId selection callCount estimate calls callerTurns audioSeconds estimatedCostUsd status analysisSampled error createdBy createdAt startedAt finishedAt metadata timestamp version path code message details field runId callId reason

Start a full-call run

Start a full-call run, to prove a candidate on whole calls before switching production to it. - Every caller line with audio bounds of the 1 to 10 asked calls becomes a turn; the assistant's lines are never replayed. Each turn's production attempt is the call's stored live text, and the candidate replays the line from the caller's channel, or the mixed track on a mono recording. - A line with a flag is scored against the flag's expected text. Any other line compares the candidate with production, and an LLM judge labels the lines where they differ. - `calibrationTurns` random turns also replay production, to measure how far replayed audio drifts from the live text (`totals.audioPathAgreement`). - Send an `Idempotency-Key` header, fixed per attempt to start a run. Keys are per organization and checked before anything else: a repeated key answers 201 with the run it first created, whatever the bank or body, and starts nothing. - One run per organization may be queued or running at a time. Next: poll GET /full-call-runs/:id, honoring `Retry-After`, until `run.status` is completed, cancelled or error. `progress` drives a progress bar. Errors: Checked in this order: 404 RESOURCE_NOT_FOUND when any asked call is not in the organization; 422 CALL_NOT_RUNNABLE naming the first asked call that cannot run and why (`details.callId`, `details.reason`); 404 RESOURCE_NOT_FOUND when the bank is not in the organization; 422 CANDIDATE_REQUIRED when no `candidateTranscriberId` was sent and the bank has no leader over the last 30 days; 422 NOT_A_BANK_CANDIDATE when `candidateTranscriberId` is not a live candidate of the bank. Then 409 RUN_ACTIVE when another run of the organization is queued or running (`details.runId`).

Try it in the API Explorer

Example request

Terminal
curl -X POST "https://core-api.heysadie.ai/transcriber-banks/TRANSCRIBER_BANK_ID/full-call-runs" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "candidateTranscriberId": "0199a1b2-aaaa-7bbb-8ccc-0000000000a1",
    "callIds": [
      "0199a1b2-7c3d-7e4f-8a5b-6c7d8e9f0a1b",
      "0199a1b3-0d1e-7f20-9a3b-4c5d6e7f8091"
    ],
    "calibrationTurns": 20
  }'

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.

Authorizationstringrequired

API 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)optional

Required when authenticating with an organization key: it selects the tenant the request acts on. Omit with tenant keys.

Request

Path parameters

idstringrequired

A live bank of the organization

Body application/json · required

candidateTranscriberIdstringoptional

One of the bank's candidates. Defaults to the bank's leader over the last 30 days; with no leader over that window, send it or get 422 CANDIDATE_REQUIRED

callIdsstring[]required

1 to 10 distinct calls of the organization, replayed in this order. Start from the call a line was flagged on and add others from GET /full-call-runs/eligible-calls. Each needs a recording, a caller line with audio bounds and a known live transcriber, else 422 CALL_NOT_RUNNABLE. A call outside the organization is a 404

calibrationTurnsstring (integer) | integeroptional

Random turns on which production is also replayed, to measure replay against the live text (`totals.audioPathAgreement`). 0 to 200, default 20

Responses

201Created, or replayed for a repeated Idempotency-Key: the run
successbooleanrequired

true on every 2xx

dataobjectoptional

The result

Show 1 child properties
runobjectrequired

A full-call run: one candidate replayed on every caller line of up to 10 calls and compared with production

Show 15 child properties
idstringrequired

Run id

organizationIdstringrequired

The organization that owns the run

bankIdstringrequired

The bank the run belongs to

candidateTranscriberIdstringrequired

The candidate replayed

selectionobjectrequired

The calls asked for

Show 1 child properties
callIdsstring[]required

The calls the run replays, in the order they were asked for

calibrationTurnsstring (integer) | integerrequired

Random turns asked for on which production is also replayed

callCountstring (integer) | integerrequired

Calls the run snapshotted

estimateobjectrequired

What the run replays and costs, as estimated at creation

Show 4 child properties
callsstring (integer) | integerrequired

Selected calls with a caller turn

callerTurnsstring (integer) | integerrequired

Caller lines with audio bounds; each becomes a turn

audioSecondsnumberrequired

Audio the worker replays: every turn through the candidate, plus the calibration sample through production

estimatedCostUsdnumberrequired

STT cost in USD, 6 decimals

statusenumrequired

queued: 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

Allowed values:"queued""running""analyzing""completed""cancelled""error"
analysisSampledbooleanrequired

The differing turns outnumbered what the analysis takes (2000), so it labeled a sample

errorstring | nullrequired

Why the run failed. Null unless status is error

createdBystring | nullrequired

Who 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 | nullrequired

When it was created, UTC

startedAtstring (date-time) | string (date) | number | nullrequired

When its first job was dispatched to a worker, UTC

finishedAtstring (date-time) | string (date) | number | nullrequired

When it completed, failed or was cancelled, UTC

metadataobjectoptional

Request metadata

Show 3 child properties
timestampstringrequired

When the server answered, ISO 8601 UTC

versionstringrequired

API version

pathstringoptional

The 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
successbooleanrequired

false on every error

errorobjectoptional

What went wrong: a stable `code` to branch on and a human-readable `message`

Show 3 child properties
codeenumrequired

A parameter or body field broke a rule

Allowed values:"VALIDATION_ERROR"
messagestringrequired

Human-readable explanation. Do not parse it; branch on `code`

detailsobject[]optional

One entry per field that failed

Show 2 item properties
fieldstringrequired

The offending field

messagestringrequired

The rule it broke

metadataobjectoptional

Request metadata

Show 3 child properties
timestampstringrequired

When the server answered, ISO 8601 UTC

versionstringrequired

API version

pathstringoptional

The URL that was requested

401UNAUTHORIZED: no valid credentials, or a dashboard token that names no organization. Send `Authorization: ApiKey <organization API key>`
successbooleanrequired

false on every error

errorobjectoptional

What went wrong: a stable `code` to branch on and a human-readable `message`

Show 2 child properties
codeenumrequired

No valid credentials

Allowed values:"UNAUTHORIZED"
messagestringrequired

Human-readable explanation. Do not parse it; branch on `code`

metadataobjectoptional

Request metadata

Show 3 child properties
timestampstringrequired

When the server answered, ISO 8601 UTC

versionstringrequired

API version

pathstringoptional

The 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
successbooleanrequired

false on every error

errorobjectoptional

What went wrong: a stable `code` to branch on and a human-readable `message`

Show 2 child properties
codeenumrequired

ORG_SCOPE_REQUIRED: the credentials carry a tenant scope. FORBIDDEN: an organization key sent `X-Tenant-Id` for a tenant outside its organization

Allowed values:"ORG_SCOPE_REQUIRED""FORBIDDEN"
messagestringrequired

Human-readable explanation. Do not parse it; branch on `code`

metadataobjectoptional

Request metadata

Show 3 child properties
timestampstringrequired

When the server answered, ISO 8601 UTC

versionstringrequired

API version

pathstringoptional

The 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"
successbooleanrequired

false on every error

errorobjectoptional

What went wrong: a stable `code` to branch on and a human-readable `message`

Show 2 child properties
codeenumrequired

An id names nothing the caller can see

Allowed values:"RESOURCE_NOT_FOUND"
messagestringrequired

Human-readable explanation. Do not parse it; branch on `code`

metadataobjectoptional

Request metadata

Show 3 child properties
timestampstringrequired

When the server answered, ISO 8601 UTC

versionstringrequired

API version

pathstringoptional

The URL that was requested

409RUN_ACTIVE: a run's state refuses the request; `details.runId` names the run
successbooleanrequired

false on every error

errorobjectoptional

What went wrong: a stable `code` to branch on and a human-readable `message`

Show 3 child properties
codeenumrequired

A run's state refuses the request

Allowed values:"RUN_ACTIVE"
messagestringrequired

Human-readable explanation. Do not parse it; branch on `code`

detailsobjectrequired

The run in the way

Show 1 child properties
runIdstringrequired

The run in the way

metadataobjectoptional

Request metadata

Show 3 child properties
timestampstringrequired

When the server answered, ISO 8601 UTC

versionstringrequired

API version

pathstringoptional

The URL that was requested

422CALL_NOT_RUNNABLE: an asked call cannot be replayed; `details` names the first such call and the reason. CANDIDATE_REQUIRED: no `candidateTranscriberId` was sent and the bank has no leader over the last 30 days. NOT_A_BANK_CANDIDATE: `candidateTranscriberId` is not a live candidate of the bank
successbooleanrequired

false on every error

errorobjectoptional

One of three refusals, told apart by `code`

Show 8 properties across 3 possible shapes
codeenumrequired

No candidate to replay

Allowed values:"CANDIDATE_REQUIRED"
messagestringrequired

Human-readable explanation. Do not parse it; branch on `code`

codeenumrequired

The candidate is not the bank's

Allowed values:"NOT_A_BANK_CANDIDATE"
messagestringrequired

Human-readable explanation. Do not parse it; branch on `code`

detailsobjectrequired

The transcriber refused

Show 1 child properties
candidateTranscriberIdstringrequired

Not a candidate of the bank, or deleted from the catalogue since it was added

codeenumrequired

An asked call cannot be replayed

Allowed values:"CALL_NOT_RUNNABLE"
messagestringrequired

Human-readable explanation. Do not parse it; branch on `code`

detailsobjectrequired

The call and why

Show 2 child properties
callIdstringrequired

The first asked call that cannot run

reasonenumrequired

no_recording: the call has no recording. no_caller_audio: no caller line has audio bounds. transcriber_unknown: the call's live transcriber is unknown, so there is no production text to compare with

Allowed values:"no_recording""no_caller_audio""transcriber_unknown"
metadataobjectoptional

Request metadata

Show 3 child properties
timestampstringrequired

When the server answered, ISO 8601 UTC

versionstringrequired

API version

pathstringoptional

The URL that was requested

500An unexpected server error
successbooleanrequired

false on every error

errorobjectoptional

What went wrong: a stable `code` to branch on and a human-readable `message`

Show 2 child properties
codeenumrequired

An unexpected server failure

Allowed values:"INTERNAL_SERVER_ERROR"
messagestringrequired

Human-readable explanation. Do not parse it; branch on `code`

metadataobjectoptional

Request metadata

Show 3 child properties
timestampstringrequired

When the server answered, ISO 8601 UTC

versionstringrequired

API version

pathstringoptional

The URL that was requested