Calls
Outbound calls, status, transcripts, and ending active sessions
Live API testing
Paste a tq_live_… key from Settings → API Keys. Requests are sent through this docs server to /api/v1/… (no browser CORS). The key is kept in sessionStorage only.
Base URL: https://api.taliiq.com — set $TALIIQ_API_KEY to a key from Settings → API Keys in the dashboard.
List calls
/api/v1/calls/calls.list · scope: calls:readPage-based list of call logs for your organization.
curl -X GET 'https://api.taliiq.com/api/v1/calls/?page=1&agent_id=&status=&type=' \
-H 'Authorization: Bearer $TALIIQ_API_KEY'import requests
url = "https://api.taliiq.com/api/v1/calls/?page=1&agent_id=&status=&type="
headers = {
"Authorization": "Bearer $TALIIQ_API_KEY"
}
response = requests.get(url, headers=headers)
print(response.status_code)
print(response.json())const response = await fetch("https://api.taliiq.com/api/v1/calls/?page=1&agent_id=&status=&type=", {
method: "GET",
headers: {
"Authorization": "Bearer $TALIIQ_API_KEY"
},
});
console.log(await response.json());Try it live
/api/proxy/v1/calls/?page=1&agent_id=&status=&type=Start outbound call
Provide either agent_id or squad_id (not both). With squad_id, the squad must be a conversation squad; the entry member starts the call. See Squads.
/api/v1/calls/calls.create · scope: calls:writePlaces an outbound SIP call via a configured trunk. Supports Idempotency-Key header for safe retries. Pass agent_id or squad_id.
curl -X POST 'https://api.taliiq.com/api/v1/calls/' \
-H 'Authorization: Bearer $TALIIQ_API_KEY' \
-H 'Idempotency-Key: unique-key-per-attempt' \
-H 'Content-Type: application/json' \
-d '{"trunk_id":"00000000-0000-0000-0000-000000000001","destination_e164":"+201234567890","squad_id":"00000000-0000-0000-0000-000000000010","contact_id":"00000000-0000-0000-0000-000000000003","metadata":{"campaign":"renewals"}}'import requests
url = "https://api.taliiq.com/api/v1/calls/"
headers = {
"Authorization": "Bearer $TALIIQ_API_KEY",
"Idempotency-Key": "unique-key-per-attempt",
"Content-Type": "application/json"
}
payload = {
"trunk_id": "00000000-0000-0000-0000-000000000001",
"destination_e164": "+201234567890",
"squad_id": "00000000-0000-0000-0000-000000000010",
"contact_id": "00000000-0000-0000-0000-000000000003",
"metadata": {
"campaign": "renewals"
}
}
response = requests.post(url, headers=headers, json=payload)
print(response.status_code)
print(response.json())const response = await fetch("https://api.taliiq.com/api/v1/calls/", {
method: "POST",
headers: {
"Authorization": "Bearer $TALIIQ_API_KEY",
"Idempotency-Key": "unique-key-per-attempt",
"Content-Type": "application/json"
},
body: JSON.stringify({"trunk_id":"00000000-0000-0000-0000-000000000001","destination_e164":"+201234567890","squad_id":"00000000-0000-0000-0000-000000000010","contact_id":"00000000-0000-0000-0000-000000000003","metadata":{"campaign":"renewals"}}),
});
console.log(await response.json());Try it live
/api/proxy/v1/calls/Register contact and call
/api/v1/calls/register/calls.register · scope: contacts:write, calls:writeUpserts a Contact and places an outbound call to them in one request — for partners that call this endpoint the moment a new customer registers on their side. Requires both the contacts:write and calls:write scopes on your API key.
curl -X POST 'https://api.taliiq.com/api/v1/calls/register/' \
-H 'Authorization: Bearer $TALIIQ_API_KEY' \
-H 'Idempotency-Key: unique-key-per-registration' \
-H 'Content-Type: application/json' \
-d '{"phone_e164":"+201234567890","first_name":"Amina","last_name":"Hassan","external_id":"crm-4821","namespace":"crm","trunk_id":"00000000-0000-0000-0000-000000000001","metadata":{"campaign":"signup-followup"}}'import requests
url = "https://api.taliiq.com/api/v1/calls/register/"
headers = {
"Authorization": "Bearer $TALIIQ_API_KEY",
"Idempotency-Key": "unique-key-per-registration",
"Content-Type": "application/json"
}
payload = {
"phone_e164": "+201234567890",
"first_name": "Amina",
"last_name": "Hassan",
"external_id": "crm-4821",
"namespace": "crm",
"trunk_id": "00000000-0000-0000-0000-000000000001",
"metadata": {
"campaign": "signup-followup"
}
}
response = requests.post(url, headers=headers, json=payload)
print(response.status_code)
print(response.json())const response = await fetch("https://api.taliiq.com/api/v1/calls/register/", {
method: "POST",
headers: {
"Authorization": "Bearer $TALIIQ_API_KEY",
"Idempotency-Key": "unique-key-per-registration",
"Content-Type": "application/json"
},
body: JSON.stringify({"phone_e164":"+201234567890","first_name":"Amina","last_name":"Hassan","external_id":"crm-4821","namespace":"crm","trunk_id":"00000000-0000-0000-0000-000000000001","metadata":{"campaign":"signup-followup"}}),
});
console.log(await response.json());Try it live
/api/proxy/v1/calls/register/Unlike POST /api/v1/calls/, the Idempotency-Key header is required on this endpoint — a request without one is rejected with a validation_error. This is deliberate: the whole point of this endpoint is "a real person just signed up, call them once," so a retried request after a network timeout must never place a second call. Reuse the same key when retrying the exact same registration.
The response contains both the upserted contact and the resulting call:
{
"status": "success",
"data": {
"contact": { "id": "...", "phone_e164": "+201234567890", "...": "..." },
"call": { "id": "...", "session_id": "...", "status": "in_progress", "...": "..." },
"created": true
}
}created is true when a new Contact was created, false when an existing Contact (matched by contact_id or namespace+external_id) was updated instead. A Contact marked do_not_contact, or with no phone_e164 to dial, returns an error and no call is placed.
Get call
/api/v1/calls/{call_id}calls.get · scope: calls:readcurl -X GET 'https://api.taliiq.com/api/v1/calls/{call_id}/' \
-H 'Authorization: Bearer $TALIIQ_API_KEY'import requests
url = "https://api.taliiq.com/api/v1/calls/{call_id}/"
headers = {
"Authorization": "Bearer $TALIIQ_API_KEY"
}
response = requests.get(url, headers=headers)
print(response.status_code)
print(response.json())const response = await fetch("https://api.taliiq.com/api/v1/calls/{call_id}/", {
method: "GET",
headers: {
"Authorization": "Bearer $TALIIQ_API_KEY"
},
});
console.log(await response.json());Try it live
/api/proxy/v1/calls/{id}/Call responses include stable id and session_id values, Contact linkage, metadata, and retained recording URL when organization retention policy permits it.
End call
/api/v1/calls/{call_id}calls.end · scope: calls:writeEnds an in-progress call and updates the call log status to ended.
curl -X DELETE 'https://api.taliiq.com/api/v1/calls/{call_id}/' \
-H 'Authorization: Bearer $TALIIQ_API_KEY'import requests
url = "https://api.taliiq.com/api/v1/calls/{call_id}/"
headers = {
"Authorization": "Bearer $TALIIQ_API_KEY"
}
response = requests.delete(url, headers=headers)
print(response.status_code)
print(response.json())const response = await fetch("https://api.taliiq.com/api/v1/calls/{call_id}/", {
method: "DELETE",
headers: {
"Authorization": "Bearer $TALIIQ_API_KEY"
},
});
console.log(await response.json());Try it live
/api/proxy/v1/calls/{id}/Get transcript
/api/v1/calls/{call_id}/transcript/calls.transcript · scope: calls:readReturns transcript lines and structured conversation events.
curl -X GET 'https://api.taliiq.com/api/v1/calls/{call_id}/transcript/' \
-H 'Authorization: Bearer $TALIIQ_API_KEY'import requests
url = "https://api.taliiq.com/api/v1/calls/{call_id}/transcript/"
headers = {
"Authorization": "Bearer $TALIIQ_API_KEY"
}
response = requests.get(url, headers=headers)
print(response.status_code)
print(response.json())const response = await fetch("https://api.taliiq.com/api/v1/calls/{call_id}/transcript/", {
method: "GET",
headers: {
"Authorization": "Bearer $TALIIQ_API_KEY"
},
});
console.log(await response.json());Try it live
/api/proxy/v1/calls/{id}/transcript/
