Get a transcript
curl --request GET \
--url https://api.contourvoice.com/v1/calls/{call_id}/transcript \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.contourvoice.com/v1/calls/{call_id}/transcript"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.contourvoice.com/v1/calls/{call_id}/transcript', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.contourvoice.com/v1/calls/{call_id}/transcript",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.contourvoice.com/v1/calls/{call_id}/transcript"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.contourvoice.com/v1/calls/{call_id}/transcript")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.contourvoice.com/v1/calls/{call_id}/transcript")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"call_id": "9d2f7a3c-8e4b-4f1d-a6c7-2b3c4d5e6f70",
"text": "Customer: Hello?\nAgent: Hi, this is Ava calling from Contour with a critical radiology result. Am I speaking with Dr. Johnson?",
"turns": [
{
"ended_at": "2026-09-10T14:03:20Z",
"interrupted": false,
"role": "user",
"started_at": "2026-09-10T14:03:19Z",
"text": "Hello?"
},
{
"ended_at": "2026-09-10T14:03:27Z",
"interrupted": false,
"role": "agent",
"started_at": "2026-09-10T14:03:20Z",
"text": "Hi, this is Ava calling from Contour with a critical radiology result. Am I speaking with Dr. Johnson?"
}
]
}{
"detail": "Invalid or expired API key"
}{
"detail": "No transcript is available for this call."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"ctx": {},
"input": "<unknown>"
}
]
}Calls
Get a transcript
What was said on the call, turn by turn.
Only the agent’s and the caller’s speech is included; tool calls and other
internal events are not. turns is the conversation in order and text
is the same conversation as plain text. Per-turn started_at / ended_at
are present when timing was captured and absent otherwise.
Returns 404 until the transcript exists, which is when the call ends
(the call.ended webhook). The transcript is never included on the call
object or in webhook bodies.
GET
/
v1
/
calls
/
{call_id}
/
transcript
Get a transcript
curl --request GET \
--url https://api.contourvoice.com/v1/calls/{call_id}/transcript \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.contourvoice.com/v1/calls/{call_id}/transcript"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.contourvoice.com/v1/calls/{call_id}/transcript', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.contourvoice.com/v1/calls/{call_id}/transcript",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.contourvoice.com/v1/calls/{call_id}/transcript"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.contourvoice.com/v1/calls/{call_id}/transcript")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.contourvoice.com/v1/calls/{call_id}/transcript")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"call_id": "9d2f7a3c-8e4b-4f1d-a6c7-2b3c4d5e6f70",
"text": "Customer: Hello?\nAgent: Hi, this is Ava calling from Contour with a critical radiology result. Am I speaking with Dr. Johnson?",
"turns": [
{
"ended_at": "2026-09-10T14:03:20Z",
"interrupted": false,
"role": "user",
"started_at": "2026-09-10T14:03:19Z",
"text": "Hello?"
},
{
"ended_at": "2026-09-10T14:03:27Z",
"interrupted": false,
"role": "agent",
"started_at": "2026-09-10T14:03:20Z",
"text": "Hi, this is Ava calling from Contour with a critical radiology result. Am I speaking with Dr. Johnson?"
}
]
}{
"detail": "Invalid or expired API key"
}{
"detail": "No transcript is available for this call."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"ctx": {},
"input": "<unknown>"
}
]
}Authorizations
Your organization's API key (sk_cont_...), sent as Authorization: Bearer sk_cont_.... Keep it server-side.
Path Parameters
Response
Successful Response