GET /calls/{call_id}/transcript-merged
https://api.voygr.tech/calls/{call_id}/transcript-merged
Overview
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.
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
Successful Response
application/json
Schema: MergedTranscript
merged
{
"version": 1,
"duration_ms": 17240,
"turns": [
{
"speaker": "hostess",
"start_ms": 300,
"end_ms": 6100,
"text": "Thank you for calling. If you know your party's extension, you may dial it at any time."
},
{
"speaker": "bot",
"start_ms": 6800,
"end_ms": 9200,
"text": "Hi, this is an AI assistant calling to ask about your opening hours."
}
]
}202
Merged transcript not yet available. Retry after transcript_ready, or poll this GET. A 202 is not a guarantee it will become available: if it persists after the call ends, request one rebuild with POST /calls/{call_id}/transcript-merged/rebuild.
application/json
mergerpending
{
"status": "merger_pending"
}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; the summary + outcome on GET /calls/{call_id} remain available).
application/json
notfound
{
"detail": "Transcript not available"
}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
