Squads
Multi-agent squads, members, graph, and process invoke
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 kind | Every member must have |
|---|---|
conversation | voice |
process | api |
Create and member-add requests return 422 if the agent does not satisfy the gate.
Scopes
squads:read— list, get, graphsquads:write— create, update, delete, members, reorder (also requiressquads:readon create where noted)invoke:write— process invoke
List squads
/api/v1/squads/squads.list · scope: squads:readList 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=conversationCreate squad
Required:
kind—conversationorprocessfirst_member_agent_id— UUID of the entry agent (must pass the capability gate)
Optional: name.
/api/v1/squads/squads.create · scope: squads:writeCreates 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
/api/v1/squads/{squad_id}squads.get · scope: squads:readReplace {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.
/api/v1/squads/{squad_id}squads.update · scope: squads:writecurl -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
/api/v1/squads/{squad_id}squads.delete · scope: squads:writeDeletes 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
/api/v1/squads/{squad_id}/members/squads.members.create · scope: squads:writeAdds 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
/api/v1/squads/{squad_id}/members/{member_id}squads.members.delete · scope: squads:writecurl -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
/api/v1/squads/{squad_id}/members/reorder/squads.members.reorder · scope: squads:writePass 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.
/api/v1/squads/{squad_id}/graph/squads.graph · scope: squads:readRead-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.
/api/v1/invoke/invoke.create · scope: invoke:writeStarts 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).

