taliiq
App
Taliiq

Squads

Multi-agent squads, members, graph, and process invoke

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.

Squads group specialized agents into a workflow graph. Each member keeps its own tools and prompt. Conversation squads run live voice handoffs; process squads run unattended API workflows.

Dashboard guides: Squads. Handoff edges are created in the dashboard canvas — this API exposes CRUD for squads/members and a read-only graph snapshot.

All responses use the v1 envelope.

Capability gates

Squad kindEvery member must have
conversationvoice
processapi

Create and member-add requests return 422 if the agent does not satisfy the gate.

Scopes

  • squads:read — list, get, graph
  • squads:write — create, update, delete, members, reorder (also requires squads:read on create where noted)
  • invoke:write — process invoke

List squads

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

List squads for your organization. Optional kind filter: conversation or process.

curl -X GET 'https://api.taliiq.com/api/v1/squads/?kind=conversation' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY'
import requests

url = "https://api.taliiq.com/api/v1/squads/?kind=conversation"
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/squads/?kind=conversation", {
  method: "GET",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY"
},
});

console.log(await response.json());

Try it live

/api/proxy/v1/squads/?kind=conversation

Create squad

Required:

  • kind — conversation or process
  • first_member_agent_id — UUID of the entry agent (must pass the capability gate)

Optional: name.

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

Creates a squad with the given agent as the first (entry) member.

curl -X POST 'https://api.taliiq.com/api/v1/squads/' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"name":"Support","kind":"conversation","first_member_agent_id":"00000000-0000-0000-0000-000000000001"}'
import requests

url = "https://api.taliiq.com/api/v1/squads/"
headers = {
  "Authorization": "Bearer $TALIIQ_API_KEY",
  "Content-Type": "application/json"
}
payload = {
  "name": "Support",
  "kind": "conversation",
  "first_member_agent_id": "00000000-0000-0000-0000-000000000001"
}

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/squads/", {
  method: "POST",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY",
    "Content-Type": "application/json"
},
  body: JSON.stringify({"name":"Support","kind":"conversation","first_member_agent_id":"00000000-0000-0000-0000-000000000001"}),
});

console.log(await response.json());

Try it live

/api/proxy/v1/squads/

Get squad

GET/api/v1/squads/{squad_id}squads.get · scope: squads:read

Replace {squad_id} with the UUID from list or create.

curl -X GET 'https://api.taliiq.com/api/v1/squads/{squad_id}/' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY'
import requests

url = "https://api.taliiq.com/api/v1/squads/{squad_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/squads/{squad_id}/", {
  method: "GET",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY"
},
});

console.log(await response.json());

Try it live

/api/proxy/v1/squads/{id}/

Response data includes id, name, description, kind, is_active, members, member_count, entry_agent_id, pipeline_source_id, storage_source_id, webhook_source_id, webhook_routing_active, pipeline_source_active, consistency, timestamps. Each member also carries a summary of the models and storage plan it runs today.

consistency lists advice where members disagree on a shared setting (concern, severity, message, picker, member_ids). It never blocks a save or a run.

Update squad

Patch name, description, kind, is_active, pipeline_source_id, storage_source_id and/or webhook_source_id. Changing kind re-validates all members against the new capability gate.

pipeline_source_id is a squad member id (or null). Every other member then uses that member's models: the voice pipeline on a conversation squad, the LLM only on a process squad. storage_source_id makes a conversation squad follow that member's storage settings, and webhook_source_id picks the member whose Server URL receives the session's events once webhook routing is on (webhook_routing_active); both are rejected on process squads. Both are cleared automatically when that member is removed. See Squad settings.

PATCH/api/v1/squads/{squad_id}squads.update · scope: squads:write
curl -X PATCH 'https://api.taliiq.com/api/v1/squads/{squad_id}/' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"name":"Support v2","is_active":true}'
import requests

url = "https://api.taliiq.com/api/v1/squads/{squad_id}/"
headers = {
  "Authorization": "Bearer $TALIIQ_API_KEY",
  "Content-Type": "application/json"
}
payload = {
  "name": "Support v2",
  "is_active": true
}

response = requests.patch(url, headers=headers, json=payload)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.taliiq.com/api/v1/squads/{squad_id}/", {
  method: "PATCH",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY",
    "Content-Type": "application/json"
},
  body: JSON.stringify({"name":"Support v2","is_active":true}),
});

console.log(await response.json());

Try it live

/api/proxy/v1/squads/{id}/

Delete squad

DELETE/api/v1/squads/{squad_id}squads.delete · scope: squads:write

Deletes the squad and its members/edges.

curl -X DELETE 'https://api.taliiq.com/api/v1/squads/{squad_id}/' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY'
import requests

url = "https://api.taliiq.com/api/v1/squads/{squad_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/squads/{squad_id}/", {
  method: "DELETE",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY"
},
});

console.log(await response.json());

Try it live

/api/proxy/v1/squads/{id}/

Add member

POST/api/v1/squads/{squad_id}/members/squads.members.create · scope: squads:write

Adds an agent to the squad. Agent must satisfy the squad kind capability gate.

curl -X POST 'https://api.taliiq.com/api/v1/squads/{squad_id}/members/' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"agent_id":"00000000-0000-0000-0000-000000000002","is_entry_point":false}'
import requests

url = "https://api.taliiq.com/api/v1/squads/{squad_id}/members/"
headers = {
  "Authorization": "Bearer $TALIIQ_API_KEY",
  "Content-Type": "application/json"
}
payload = {
  "agent_id": "00000000-0000-0000-0000-000000000002",
  "is_entry_point": false
}

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/squads/{squad_id}/members/", {
  method: "POST",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY",
    "Content-Type": "application/json"
},
  body: JSON.stringify({"agent_id":"00000000-0000-0000-0000-000000000002","is_entry_point":false}),
});

console.log(await response.json());

Try it live

/api/proxy/v1/squads/{id}/members/

Remove member

DELETE/api/v1/squads/{squad_id}/members/{member_id}squads.members.delete · scope: squads:write
curl -X DELETE 'https://api.taliiq.com/api/v1/squads/{squad_id}/members/{member_id}/' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY'
import requests

url = "https://api.taliiq.com/api/v1/squads/{squad_id}/members/{member_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/squads/{squad_id}/members/{member_id}/", {
  method: "DELETE",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY"
},
});

console.log(await response.json());

Try it live

/api/proxy/v1/squads/{id}/members/{id}/

Reorder members

POST/api/v1/squads/{squad_id}/members/reorder/squads.members.reorder · scope: squads:write

Pass the full ordered list of member UUIDs.

curl -X POST 'https://api.taliiq.com/api/v1/squads/{squad_id}/members/reorder/' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"member_ids":["00000000-0000-0000-0000-000000000001","00000000-0000-0000-0000-000000000002"]}'
import requests

url = "https://api.taliiq.com/api/v1/squads/{squad_id}/members/reorder/"
headers = {
  "Authorization": "Bearer $TALIIQ_API_KEY",
  "Content-Type": "application/json"
}
payload = {
  "member_ids": [
    "00000000-0000-0000-0000-000000000001",
    "00000000-0000-0000-0000-000000000002"
  ]
}

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/squads/{squad_id}/members/reorder/", {
  method: "POST",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY",
    "Content-Type": "application/json"
},
  body: JSON.stringify({"member_ids":["00000000-0000-0000-0000-000000000001","00000000-0000-0000-0000-000000000002"]}),
});

console.log(await response.json());

Try it live

/api/proxy/v1/squads/{id}/members/reorder/

Get graph

Returns nodes (members) and edges (handoff wiring) for the squad. Use this to inspect the workflow; create/update edges in the dashboard.

GET/api/v1/squads/{squad_id}/graph/squads.graph · scope: squads:read

Read-only graph: nodes include agent_id and is_entry_point; edges include source, target, key, description, extraction_schema, context_policy.

curl -X GET 'https://api.taliiq.com/api/v1/squads/{squad_id}/graph/' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY'
import requests

url = "https://api.taliiq.com/api/v1/squads/{squad_id}/graph/"
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/squads/{squad_id}/graph/", {
  method: "GET",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY"
},
});

console.log(await response.json());

Try it live

/api/proxy/v1/squads/{id}/graph/

Invoke process

Runs an unattended process against a process squad or a single agent with the api capability. Conversation squads cannot be invoked here — use Calls with squad_id for voice.

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

Starts a process run. For squads, only kind=process is allowed. Optional session_variables seed structured context.

curl -X POST 'https://api.taliiq.com/api/v1/invoke/' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"target":{"type":"squad","id":"00000000-0000-0000-0000-000000000010"},"input":{"order_id":"123"},"session_variables":{"region":"eg"}}'
import requests

url = "https://api.taliiq.com/api/v1/invoke/"
headers = {
  "Authorization": "Bearer $TALIIQ_API_KEY",
  "Content-Type": "application/json"
}
payload = {
  "target": {
    "type": "squad",
    "id": "00000000-0000-0000-0000-000000000010"
  },
  "input": {
    "order_id": "123"
  },
  "session_variables": {
    "region": "eg"
  }
}

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/invoke/", {
  method: "POST",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY",
    "Content-Type": "application/json"
},
  body: JSON.stringify({"target":{"type":"squad","id":"00000000-0000-0000-0000-000000000010"},"input":{"order_id":"123"},"session_variables":{"region":"eg"}}),
});

console.log(await response.json());

Try it live

/api/proxy/v1/invoke/

Success data includes run_id, status, output, and error.

Guide: Process squads.

Outbound calls with a squad

Pass squad_id or agent_id (not both) when creating a call. Conversation squads only — the entry member starts the session.

See Calls for the full outbound payload (trunk_id, destination, metadata).