POST /calls/{call_id}/transcript-merged/rebuild
https://api.voygr.tech/calls/{call_id}/transcript-merged/rebuild
Overview
Rebuild and return a past call's merged transcript from its recording. Use for missing or stale transcripts, including a persistent 202 from GET. Idempotent: replaces the stored transcript. Do not poll with rebuild; poll the GET or wait for transcript_ready.
Authentication
- API key in header
X-API-Key: Your customer API key (pk_live_...), sent on every request. Self-serve at https://api.voygr.tech/checkout.
Parameters
| Name | Location | Required | Type | Description and constraints |
|---|---|---|---|---|
call_id | path | required | string |
Responses
200
The rebuilt transcript - same body as the GET.
application/json
Schema: MergedTranscript
401
Missing or invalid X-API-Key.
application/json
X-API-Key header absent
{
"detail": {
"error": "API key required"
}
}X-API-Key doesn't resolve to an active key
{
"detail": {
"error": "invalid API key"
}
}404
Call not found or isn't yours - also returned for calls where the callee declined recording (no verbatim transcript may be served).
application/json
notfound
{
"detail": "Transcript not available"
}425
The recording isn't available yet - the call may still be finalizing. Nothing failed; retry shortly. On an old call, though, a persistent 425 means the recording no longer exists (retention purge) and the transcript cannot be rebuilt.
application/json
recordingpending
{
"status": "recording_pending"
}503
The rebuild hit a dependency failure. Safe to retry.
application/json
mergefailed
{
"status": "merge_failed"
}504
The request timed out, but the transcript may still become available. Recover it with GET /calls/{call_id}/transcript-merged before requesting another rebuild.
application/json
backendtimeout
{
"error": "backend timeout",
"error_code": "BACKEND_TIMEOUT"
}Schemas
MergedTranscript
Type: object
The post-call merged transcript contains both sides of the call on one timeline. It can include speech absent from the current transcript_full, such as phone menus and hold announcements. Read it after the call ends.
| Field | Type | Required | Description and constraints |
|---|---|---|---|
version | integer | required | Example: 1 |
duration_ms | integer | required | |
turns | array of MergedTranscriptTurn | required |
MergedTranscriptTurn
Type: object
One turn of the post-call merged transcript.
| Field | Type | Required | Description and constraints | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
speaker | string | required | bot = the agent; hostess = the other party - staff, receptionist or IVR (the name is historical and covers every callee-side voice). one of bot, hostess | ||||||||||||||||
start_ms | integer | required | |||||||||||||||||
end_ms | integer | required | |||||||||||||||||
text | string | required | |||||||||||||||||
words | array of object | optional | Per-word timings, when the source provides them.Item fields
| ||||||||||||||||
overlap_with_next | boolean | optional | This turn overlapped the next one in time (cross-talk). When true, end_ms has been trimmed to the next turn's start_ms; the untrimmed value is in original_end_ms. | ||||||||||||||||
original_end_ms | integer | optional | The pre-trim end_ms, present only when overlap_with_next is true. | ||||||||||||||||
timing_estimated | boolean | optional | The text is real but the milliseconds are a reading order, not a measurement - don't plot such turns on a timeline. |
On this page
