taliiq
App
Taliiq

Calls

Outbound calls, status, transcripts, and ending active sessions

Download OpenAPI JSON

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

GET/api/v1/calls/calls.list · scope: calls:read

Page-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.

POST/api/v1/calls/calls.create · scope: calls:write

Places 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

POST/api/v1/calls/register/calls.register · scope: contacts:write, calls:write

Upserts 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

GET/api/v1/calls/{call_id}calls.get · scope: calls:read
curl -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

DELETE/api/v1/calls/{call_id}calls.end · scope: calls:write

Ends 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

GET/api/v1/calls/{call_id}/transcript/calls.transcript · scope: calls:read

Returns 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/