curl --request DELETE \
--url https://app.thinnest.ai/api/v1/calls/{id} \
--header 'Authorization: Bearer <token>'const options = {method: 'DELETE', 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.delete(url, headers=headers)
print(response.text){
"id": "sch_2d7b0e91-4f3a-4c88-9b1e-7a6c5d4e3f21",
"callRef": null,
"reference": "LSQ-42",
"metadata": {
"deal_id": "D-19",
"owner": "Ravi"
},
"attempt": 1,
"status": "cancelled",
"direction": "outbound",
"phone": "919876543210",
"from": null,
"agent": {
"id": "ag_5c4a5f93-2b1e-4d7a-9f60-8e2d1c3b4a71",
"name": "Skyline Sales"
},
"scheduledFor": "2026-10-07T04:30:00.000Z",
"startedAt": null,
"answeredAt": null,
"endedAt": null,
"seconds": 0,
"hangup": "not_placed",
"variables": {
"lead_name": "Asha"
},
"summary": null,
"fields": {},
"transcript": [],
"recording": null,
"analysedAt": null,
"retryScheduledFor": null,
"error": null
}{
"id": "out_9f2c1a44-6b0e-4c1d-8a7f-2e5b3c9d1f60",
"callRef": "out_9f2c1a44-6b0e-4c1d-8a7f-2e5b3c9d1f60",
"reference": "LSQ-42",
"metadata": null,
"attempt": 1,
"status": "ringing",
"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": null,
"endedAt": null,
"seconds": 0,
"hangup": null,
"variables": {},
"summary": null,
"fields": {},
"transcript": [],
"recording": null,
"analysedAt": null,
"retryScheduledFor": null,
"error": null
}{
"error": "Send a valid API key as `Authorization: Bearer <key>`."
}{
"error": "This API key is read-only: it can read everything but change nothing."
}{
"error": "No call with that id."
}{
"error": "That call has already ended, or is being placed this second.",
"call": {
"id": "out_9f2c1a44-6b0e-4c1d-8a7f-2e5b3c9d1f60",
"callRef": "out_9f2c1a44-6b0e-4c1d-8a7f-2e5b3c9d1f60",
"reference": "LSQ-42",
"metadata": null,
"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": {},
"summary": "Asha asked for a site visit on Saturday.",
"fields": {
"interest": "Hot"
},
"transcript": [],
"recording": null,
"analysedAt": "2026-10-06T04:33:20.311Z",
"retryScheduledFor": null,
"error": null
}
}{
"error": "Over 240 requests a minute. Slow down and retry."
}Cancel Call
Calls off a call you placed through the API (out_… or sch_…). A call still waiting to ring — booked, queued for its hours, or a retry — is cancelled and answers 200 with its report, status: "cancelled". A call ringing or connected is ended on the line and answers 202 with the report as it stands; its ending arrives a moment later with call.analysed, and no retry follows. A call that has already ended answers 409. Needs a full key.
curl --request DELETE \
--url https://app.thinnest.ai/api/v1/calls/{id} \
--header 'Authorization: Bearer <token>'const options = {method: 'DELETE', 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.delete(url, headers=headers)
print(response.text){
"id": "sch_2d7b0e91-4f3a-4c88-9b1e-7a6c5d4e3f21",
"callRef": null,
"reference": "LSQ-42",
"metadata": {
"deal_id": "D-19",
"owner": "Ravi"
},
"attempt": 1,
"status": "cancelled",
"direction": "outbound",
"phone": "919876543210",
"from": null,
"agent": {
"id": "ag_5c4a5f93-2b1e-4d7a-9f60-8e2d1c3b4a71",
"name": "Skyline Sales"
},
"scheduledFor": "2026-10-07T04:30:00.000Z",
"startedAt": null,
"answeredAt": null,
"endedAt": null,
"seconds": 0,
"hangup": "not_placed",
"variables": {
"lead_name": "Asha"
},
"summary": null,
"fields": {},
"transcript": [],
"recording": null,
"analysedAt": null,
"retryScheduledFor": null,
"error": null
}{
"id": "out_9f2c1a44-6b0e-4c1d-8a7f-2e5b3c9d1f60",
"callRef": "out_9f2c1a44-6b0e-4c1d-8a7f-2e5b3c9d1f60",
"reference": "LSQ-42",
"metadata": null,
"attempt": 1,
"status": "ringing",
"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": null,
"endedAt": null,
"seconds": 0,
"hangup": null,
"variables": {},
"summary": null,
"fields": {},
"transcript": [],
"recording": null,
"analysedAt": null,
"retryScheduledFor": null,
"error": null
}{
"error": "Send a valid API key as `Authorization: Bearer <key>`."
}{
"error": "This API key is read-only: it can read everything but change nothing."
}{
"error": "No call with that id."
}{
"error": "That call has already ended, or is being placed this second.",
"call": {
"id": "out_9f2c1a44-6b0e-4c1d-8a7f-2e5b3c9d1f60",
"callRef": "out_9f2c1a44-6b0e-4c1d-8a7f-2e5b3c9d1f60",
"reference": "LSQ-42",
"metadata": null,
"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": {},
"summary": "Asha asked for a site visit on Saturday.",
"fields": {
"interest": "Hot"
},
"transcript": [],
"recording": null,
"analysedAt": "2026-10-06T04:33:20.311Z",
"retryScheduledFor": null,
"error": null
}
}{
"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
Cancelled before it rang.
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.