curl --request GET \
--url https://app.thinnest.ai/api/v1/calls/{id} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.thinnest.ai/api/v1/calls/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.thinnest.ai/api/v1/calls/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"id": "out_9f2c1a44-6b0e-4c1d-8a7f-2e5b3c9d1f60",
"callRef": "out_9f2c1a44-6b0e-4c1d-8a7f-2e5b3c9d1f60",
"reference": "LSQ-42",
"metadata": {
"deal_id": "D-19",
"owner": "Ravi"
},
"attempt": 1,
"status": "completed",
"direction": "outbound",
"phone": "919876543210",
"from": "918045678901",
"agent": {
"id": "ag_5c4a5f93-2b1e-4d7a-9f60-8e2d1c3b4a71",
"name": "Skyline Sales"
},
"scheduledFor": null,
"startedAt": "2026-10-06T04:30:02.118Z",
"answeredAt": "2026-10-06T04:30:09.540Z",
"endedAt": "2026-10-06T04:33:11.902Z",
"seconds": 182,
"hangup": "answered",
"variables": {
"lead_name": "Asha",
"project": "Sky Towers"
},
"summary": "Asha is keen on a 2 BHK at Sky Towers with a budget around 80 lakh. She asked to visit the site on Saturday.",
"fields": {
"budget": 8000000,
"interest": "Hot",
"site_visit": true
},
"transcript": [
{
"speaker": "agent",
"text": "Hello Asha, I'm calling from Skyline Homes about your enquiry for Sky Towers.",
"at": "2026-10-06T04:30:10.204Z"
},
{
"speaker": "customer",
"text": "Haan, boliye. I wanted a 2 BHK.",
"at": "2026-10-06T04:30:16.880Z"
}
],
"recording": {
"url": "https://app.thinnest.ai/api/v1/recordings/3b7e1c90-5a2d-4e8f-9c61-0d4b7a2e8f13?expires=1762403402&sig=8c1f0e7a92b4d3c6e5f1a0b9c8d7e6f5a4b3c2d1",
"expiresAt": "2026-11-05T04:30:02.118Z",
"ready": true
},
"analysedAt": "2026-10-06T04:33:20.311Z",
"retryScheduledFor": null,
"error": null
}{
"error": "Send a valid API key as `Authorization: Bearer <key>`."
}{
"error": "No call with that id."
}{
"error": "Over 240 requests a minute. Slow down and retry."
}Get Call
One call and everything it learned: status, timings, how it ended, the summary, the collected fields, the transcript and a signed recording link. It is exactly the object call.analysed delivers, so a missed delivery can be read back here; analysedAt null means the summary and fields are not final yet. Any id List Calls hands out works — out_… and sch_… for calls you placed, the call reference for any other.
curl --request GET \
--url https://app.thinnest.ai/api/v1/calls/{id} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.thinnest.ai/api/v1/calls/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.thinnest.ai/api/v1/calls/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"id": "out_9f2c1a44-6b0e-4c1d-8a7f-2e5b3c9d1f60",
"callRef": "out_9f2c1a44-6b0e-4c1d-8a7f-2e5b3c9d1f60",
"reference": "LSQ-42",
"metadata": {
"deal_id": "D-19",
"owner": "Ravi"
},
"attempt": 1,
"status": "completed",
"direction": "outbound",
"phone": "919876543210",
"from": "918045678901",
"agent": {
"id": "ag_5c4a5f93-2b1e-4d7a-9f60-8e2d1c3b4a71",
"name": "Skyline Sales"
},
"scheduledFor": null,
"startedAt": "2026-10-06T04:30:02.118Z",
"answeredAt": "2026-10-06T04:30:09.540Z",
"endedAt": "2026-10-06T04:33:11.902Z",
"seconds": 182,
"hangup": "answered",
"variables": {
"lead_name": "Asha",
"project": "Sky Towers"
},
"summary": "Asha is keen on a 2 BHK at Sky Towers with a budget around 80 lakh. She asked to visit the site on Saturday.",
"fields": {
"budget": 8000000,
"interest": "Hot",
"site_visit": true
},
"transcript": [
{
"speaker": "agent",
"text": "Hello Asha, I'm calling from Skyline Homes about your enquiry for Sky Towers.",
"at": "2026-10-06T04:30:10.204Z"
},
{
"speaker": "customer",
"text": "Haan, boliye. I wanted a 2 BHK.",
"at": "2026-10-06T04:30:16.880Z"
}
],
"recording": {
"url": "https://app.thinnest.ai/api/v1/recordings/3b7e1c90-5a2d-4e8f-9c61-0d4b7a2e8f13?expires=1762403402&sig=8c1f0e7a92b4d3c6e5f1a0b9c8d7e6f5a4b3c2d1",
"expiresAt": "2026-11-05T04:30:02.118Z",
"ready": true
},
"analysedAt": "2026-10-06T04:33:20.311Z",
"retryScheduledFor": null,
"error": null
}{
"error": "Send a valid API key as `Authorization: Bearer <key>`."
}{
"error": "No call with that id."
}{
"error": "Over 240 requests a minute. Slow down and retry."
}Authorizations
Your API key (ta_live_…) from Settings → API keys, sent as Authorization: Bearer <key>. Keep it on a server: it can message every customer you have. A key is full, build or read-only; a request its level does not allow is refused with 403.
Headers
Developers only: the customer workspace this request acts in — its org_… id from POST /customers. Leave it out to act in your own workspace.
"org_3fKq9TzQ1mN8vB2xR7cLpA"
Path Parameters
The call's id as Place Call or List Calls gave it: out_… or sch_… for a call you placed, the call reference for any other.
"out_9f2c1a44-6b0e-4c1d-8a7f-2e5b3c9d1f60"
Response
The call.
One call and what it learned — the same object call.analysed delivers.
The id to open it by: out_… / sch_… for a call you placed, the call reference otherwise.
The reference of the attempt that actually rang. Null on a call that has not rung.
Your reference from Place Call.
Your metadata from Place Call, untouched.
Show child attributes
Show child attributes
1 for the first try, 2 for the first retry.
x >= 1Where the call is. scheduled and cancelled only appear on calls you placed for later.
scheduled, ringing, connected, completed, missed, failed, cancelled Who rang whom.
inbound, outbound The customer's number.
Your number the call rang from. Null until it rings, unless the request chose one.
The agent on the call.
Show child attributes
Show child attributes
When a booked call will ring. Null once it has.
When it started ringing.
When it was picked up.
When it ended.
How long it lasted.
x >= 0Why it ended. Null while live; not_placed for a booked call that never rang.
answered, no_answer, busy, rejected, unreachable, cancelled, voicemail, before_agent, failed, not_placed, null The {{name}} values the call used.
Show child attributes
Show child attributes
Two or three sentences about the call, when summarised.
The collected details, keyed by field name. Empty when nothing was said.
When the summary and fields were written. Null means they may still arrive.
Why a booked call could not be placed, in words. Null otherwise.
This call's spoken turns, oldest first.
Show child attributes
Show child attributes
A signed link to the audio that needs no key — Get Recording By Signed Link. Null when the call was not recorded.
Show child attributes
Show child attributes
When the next try will ring, if this one did not reach them and another is queued.