atteq API
  • Guides
  • Recipes
  • Cookbook
  • API Reference
Information
agents
    List AgentsgetCreate AgentpostDocument AttachmentsgetGet VersiongetEdit DraftpatchReplace Draft GraphputPublish VersionpostGet AgentgetDelete AgentdeleteCopy AgentpostGet DraftgetGet Agent MapgetPending ChangesgetList PlacementsgetRestore VersionpostList VersionsgetGet Mapget
voice_agent
    Open Browser CallpostEnd Browser CalldeleteGet Agent Test LinkgetGet Bridge CeilinggetSet Bridge Ceilingpatch
ai_profiles
    Get Ai Profile CapabilitiesgetList Live SettingsgetCreate Live SettingspostDelete Live SettingsdeleteUpdate Live SettingspatchList Llm SettingsgetCreate Llm SettingspostDelete Llm SettingsdeleteUpdate Llm SettingspatchList ProfilesgetCreate ProfilepostGet ProfilegetDelete ProfiledeleteUpdate ProfilepatchCopy ProfilepostSet Text SectionputSet Voice SectionputList Stt SettingsgetCreate Stt SettingspostDelete Stt SettingsdeleteUpdate Stt SettingspatchList Tts SettingsgetCreate Tts SettingspostDelete Tts SettingsdeleteUpdate Tts SettingspatchList Vad SettingsgetCreate Vad SettingspostDelete Vad SettingsdeleteUpdate Vad Settingspatch
analyst
    List Agent FindingsgetCall Back FindingpostDismiss FindingpostUndo Finding DismissaldeleteTeach FindingpostWatch FindingpostList Question ChartsgetList Tracked QuestionsgetCreate Tracked QuestionpostGet Question Search CostgetSearch For Tracked QuestionpostPropose Tracked QuestionpostDelete Tracked QuestiondeleteUpdate Tracked QuestionpatchGet Reading SwitchgetSet Reading SwitchputGet Agent Summaryget
analytics
    List ChartsgetCreate ChartpostPreview ChartpostGet ChartgetDelete ChartdeleteUpdate ChartpatchRun ChartpostList DatasetsgetList BoardsgetCreate BoardpostGet TraversalgetGet BoardgetDelete BoarddeleteUpdate Boardpatch
authentication
    List InvitationsgetInvite MemberpostRevoke InvitationdeleteResend InvitationpostList MembersgetRemove MemberdeleteGet Member Conversation AccessgetSet Member Conversation AccesspatchSet Member FlagspatchSet Member RolepatchGet OrganizationgetUpdate OrganizationpatchGet Role FlagsgetSet Role Flagspatch
automations
    List AutomationsgetCreate AutomationpostGet AutomationgetDelete AutomationdeleteUpdate AutomationpatchSet Automation EnabledputGet Automation MapgetRun AutomationpostList Automation RunsgetGet Automation Runget
billable-metrics
    List MetricsgetUsage SummarygetGet Metricget
outbound_calls
    Place CallpostList CampaignsgetCreate CampaignpostGet CampaigngetDelete CampaigndeleteUpdate CampaignpatchActivate CampaignpostLink CollectionpostAdd ContactspostAdd Contacts From CollectionpostRemove Contacts From CollectionpostSet Campaign HoursputPreview Campaign HourspostPause CampaignpostGet Campaign SummarygetExclude ContactpostInclude Contactpost
channels
    List ChannelsgetCreate ChannelpostList Thread SubjectsgetClose Channel ThreadpostList Thread DecisionsgetGet Thread Contact FilegetHand Thread To AgentpostList Thread MailgetGet Prepared ReplygetAsk Again For Prepared ReplypostDiscard Prepared ReplypostSend Prepared ReplypostReply On Channel ThreadpostGet ChannelgetDelete ChanneldeleteUpdate ChannelpatchSend On ChannelpostList Channel ThreadsgetList RostergetCreate Roster EntrypostGet Own Roster EntrygetGet Roster EntrygetDelete Roster EntrydeleteUpdate Roster EntrypatchAdd Roster AddresspostChange Roster AddressputRemove Roster Addressdelete
custom-data
    List CollectionsgetCreate CollectionpostList Collection NamesgetGet CollectiongetDelete CollectiondeleteUpdate CollectionpatchAdd FieldpostDelete FielddeleteUpdate FieldpatchImport RecordspostPlan ImportpostPropose ImportpostGet ImportgetList RecordsgetCreate RecordpostBulk Delete RecordspostBulk Set FieldpostCount RecordsgetList Records Of ContactgetDelete Records Of ContactdeleteGet RecordgetDelete RecorddeleteUpdate Recordpatch
connections
    List ConnectionsgetCreate ConnectionpostCreate Forwarded AddresspostCreate Mail ServerpostDiscover Mail ServerpostAuthorize Microsoft MailboxpostList ProvidersgetGet ConnectiongetDelete ConnectiondeleteUpdate ConnectionpatchGet Forwarded AddressgetCheck Forwarded AddresspostList Person GrantsgetSet Person GrantputRemove Person GrantdeleteGet Mail ServergetUpdate Mail ServerpatchList Mail Server FoldersgetEnter Mail Server PasswordputChange Mail Server ServersputTest Mail Server AgainpostGet Microsoft MailboxgetUpdate Microsoft MailboxpatchList Microsoft Mailbox FoldersgetConsent To Microsoft Mailbox WritespostWithdraw Microsoft Mailbox Writesdelete
custom-tools
    List Custom ToolsgetCreate Custom ToolpostGet Custom ToolgetDelete Custom TooldeleteGet Custom Tool DraftgetEdit Custom Tool DraftpatchPublish Custom ToolpostRestore Custom Tool VersionpostTry Custom ToolpostList Custom Tool Versionsget
rag
    List DocumentsgetUpload DocumentpostSearch DocumentspostGet DocumentgetDelete DocumentdeleteDownload DocumentgetReingest Documentpost
flows
    List FlowsgetCreate FlowpostGet FlowgetDelete FlowdeleteRename FlowpatchAdd Flow EdgepostDelete Flow EdgedeleteSet Entry SteppatchAdd SteppostDelete StepdeleteUpdate SteppatchTest FlowpostList Flow Testsget
dynamic_context
    Create GraphpostGet GraphgetDelete GraphdeleteAdd EdgepostDelete EdgedeleteAdd NodepostDelete NodedeleteUpdate NodepatchSet Rootput
inbox
    Get Inbox Open CountgetSet Inbox PreferencespatchGet Inbox RailgetCreate Inbox ViewpostDelete Inbox ViewdeleteUpdate Inbox Viewpatch
handoff
    Assign Threadpost
interactions
    List InteractionsgetCount InteractionsgetGet InteractiongetSet Conversation LabelspostGet TracegetGet TranscriptgetList LabelsgetCreate LabelpostDelete LabeldeleteUpdate Labelpatch
legal
    Agree To Processing AgreementpostAgree To TermspostLegal BoxesgetList Legal DocumentsgetRead Legal DocumentgetList Legal VersionsgetRead Legal VersiongetDownload Legal VersiongetOrganization Legal HistorygetOwn Legal HistorygetObject To SubprocessorspostWithdraw ObjectionpostLegal Pendingget
not-a-tool
    Agree To Processing AgreementpostAgree To TermspostObject To SubprocessorspostWithdraw Objectionpost
memory
    List MemoriesgetList Memory LinesgetCreate Memory LinepostDelete Memory LinedeleteUpdate Memory LinepatchList Memory PeoplegetGet Memory PersongetForget PersondeleteGet Memory SwitchgetSet Memory SwitchputWipe ContactdeleteGet Conversation MemorygetRecall MemoriespostGet MemorygetDelete MemorydeletePatch Memorypatch
notifications
    List InboxgetGet Unread CountgetMark ReadpostMark Unreaddelete
recipes
    List RecipesgetList Installed RecipesgetGet Installed RecipegetUninstall RecipedeleteSet Recipe EnabledputUpdate Recipe ParameterspatchUpdate RecipepostInstall Recipepost
data-retention
    Get RetentiongetSet Retentionpatch
text
    Open ConversationpostClose ConversationpostAnswer ConfirmationpostGet Sent FilegetSend MessagepostSet Modepatch
tools
    List ToolsgetCreate ToolpostList BuiltinsgetImport Mcp ServerpostImport OpenapipostPreview Openapi ImportpostSuggest Tool ExamplespostGet ToolgetDelete TooldeleteUpdate ToolpatchTest ToolpostList Tool Testsget
trunks
    List Transfer DirectorygetCreate Transfer Directory EntrypostGet Transfer Directory EntrygetDelete Transfer Directory EntrydeleteUpdate Transfer Directory EntrypatchList TrunksgetCreate TrunkpostGet TrunkgetDelete TrunkdeleteUpdate TrunkpatchList Forward Recordsget
Schemas
powered by Zudoku
attek API
attek API

agents


List Agents

GET
/api/v1/agents

List this organization's agents. Each carries its live version (current_version_id, None until first published), the language and AI profile of that version (the draft's before the first publish), whether its calls are recorded, and when anything about it last changed.

The platform's own agents -- the Architect and the Analyst -- are left out unless include_platform is true; then they are included, each with platform set. Use it to name the agent behind a conversation or a line of consumption, never to offer an agent to choose.

List Agents › query Parameters

include_platform
​boolean
Default: false

List Agents › Responses

Successful Response

​AgentOut[]
One row of the list of agents. `language` and `updated_at` are **not** columns of the agent — they are read off its versions, which is why they are built by `service` and not by a `model_validate` — and both are here so the list screen can show them without asking a second question per row.
AgentOut
​required
id
​string · uuid · required
language
​Language · enum · required

A language the platform can speak — which is to say, one it has default phrases written in. The agent states one of these and every phrase on it is written in that one; a language with no phrases behind it would be a label.

Enum values:
en
es
name
​string · required
owner_id
​string · uuid · required
platform
​boolean · required
record_audio
​boolean · required
​required
​required
updated_at
​string · date-time · required
​
GET/api/v1/agents
curl /api/v1/agents \ --header 'Authorization: Bearer <token>'
Example Responses
[ { "ai_profile_id": "00000000-0000-0000-0000-000000000000", "current_version_id": "00000000-0000-0000-0000-000000000000", "id": "00000000-0000-0000-0000-000000000000", "language": "en", "name": "name", "owner_id": "00000000-0000-0000-0000-000000000000", "platform": true, "record_audio": true, "source_agent_id": "00000000-0000-0000-0000-000000000000", "source_version_id": "00000000-0000-0000-0000-000000000000", "updated_at": "2024-08-25T15:00:00Z" } ]
json
application/json

Create Agent

POST
/api/v1/agents

Create an agent in the caller's organization. Use when a new agent has to exist at all; it is born usable — a draft on the organization's default AI profile, holding a graph with one node that is already its root.

It arrives as a draft speaking the organization's language and takes no traffic until a version is published; an organization with no AI profile to start it on is refused. Its calls are not recorded unless record_audio says so — the switch is the agent's own, is not versioned, and starts off. Creating an agent with record_audio on needs the recording feature, as moving the switch later does.

Create Agent › Request Body

AgentCreate
name
​string · minLength: 1 · required
record_audio
​boolean
Default: false

Create Agent › Responses

Successful Response

One row of the list of agents. `language` and `updated_at` are **not** columns of the agent — they are read off its versions, which is why they are built by `service` and not by a `model_validate` — and both are here so the list screen can show them without asking a second question per row.
AgentOut
​required
id
​string · uuid · required
language
​Language · enum · required

A language the platform can speak — which is to say, one it has default phrases written in. The agent states one of these and every phrase on it is written in that one; a language with no phrases behind it would be a label.

Enum values:
en
es
name
​string · required
owner_id
​string · uuid · required
platform
​boolean · required
record_audio
​boolean · required
​required
​required
updated_at
​string · date-time · required
​
POST/api/v1/agents
curl /api/v1/agents \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "name": "name", "record_audio": false }'
Example Request Body
{ "name": "name", "record_audio": false }
json
Example Responses
{ "ai_profile_id": "00000000-0000-0000-0000-000000000000", "current_version_id": "00000000-0000-0000-0000-000000000000", "id": "00000000-0000-0000-0000-000000000000", "language": "en", "name": "name", "owner_id": "00000000-0000-0000-0000-000000000000", "platform": true, "record_audio": true, "source_agent_id": "00000000-0000-0000-0000-000000000000", "source_version_id": "00000000-0000-0000-0000-000000000000", "updated_at": "2024-08-25T15:00:00Z" }
json
application/json

Document Attachments

GET
/api/v1/agents/document-attachments

List which agents ground on which documents — the library's own read. Use when checking what would be affected by changing or removing a document, or showing a document's usages. Changes nothing.

It is here and not under /documents because it answers about agents. rag holds the documents and this module holds the attachment, and neither may import the other; putting the route on the side that owns the array is what keeps that from needing a protocol, a binding and a second copy of the shape to travel through them.

No document_id asks for every attachment this organization has, which is one request for a whole table of documents rather than one per row. Naming ids narrows it — what the delete confirmation asks about one document.

Document Attachments › query Parameters

document_id
​

Document Attachments › Responses

Successful Response

​DocumentAttachmentOut[]
One agent grounding on one document — the reverse of `document_ids`. **Two booleans and not one**, because the two states a person has to be able to tell apart are both "attached". `in_draft` is what the editor holds and `in_live` is what a caller reaches, and `docs/features/rag.md` makes the difference visible rather than discoverable: a document assigned and not yet published shows as pending, and one taken off and not yet published is still being read on calls. A single `attached` flag would have to pick one of those truths and silently lose the other. `name` is the agent's, because this answers a question asked from the library, where an agent id is not something anybody can read. It is built rather than validated from a row: an attachment is not a table, it is one pair drawn out of a version's array.
DocumentAttachmentOut
agent_id
​string · uuid · required
document_id
​string · uuid · required
in_draft
​boolean · required
in_live
​boolean · required
name
​string · required
GET/api/v1/agents/document-attachments
curl /api/v1/agents/document-attachments \ --header 'Authorization: Bearer <token>'
Example Responses
[ { "agent_id": "00000000-0000-0000-0000-000000000000", "document_id": "00000000-0000-0000-0000-000000000000", "in_draft": true, "in_live": true, "name": "name" } ]
json
application/json

Get Version

GET
/api/v1/agents/versions/{version_id}

Fetch one version of an agent by its version id. Use when you need the exact content of a specific past or published version, not the current draft.

Get Version › path Parameters

version_id
​string · uuid · required

Get Version › Responses

Successful Response

AgentVersionOut
agent_id
​string · uuid · required
​required
answering_machine_enabled
​boolean · required
answering_machine_instruction
​string · required
​required
​required
​required
courtesy_window_seconds
​integer · required
created_at
​string · date-time · required
duration_ceiling_seconds
​integer · required
failure_threshold
​integer · required
first_line_delay_ms
​integer · required
graph_id
​string · uuid · required
greeting_interruptible
​boolean · required
id
​string · uuid · required
language
​Language · enum · required

A language the platform can speak — which is to say, one it has default phrases written in. The agent states one of these and every phrase on it is written in that one; a language with no phrases behind it would be a label.

Enum values:
en
es
search_fragment_limit
​integer · required
silence_timeout_seconds
​integer · required
status
​Status · enum · required

A version's place in the draft → published → archived lifecycle.

Enum values:
draft
published
archived
takes_documents
​boolean · required
takes_images
​boolean · required
takes_videos
​boolean · required
takes_voice_notes
​boolean · required
​object · required
​required
​VersionChange[]
document_ids
​string[]
global_tool_ids
​string[]
notices
​string[]
post_hook_tool_ids
​string[]
pre_hook_tool_ids
​string[]
GET/api/v1/agents/versions/{version_id}
curl /api/v1/agents/versions/:version_id \ --header 'Authorization: Bearer <token>'
Example Responses
{ "agent_id": "00000000-0000-0000-0000-000000000000", "ai_profile_id": "00000000-0000-0000-0000-000000000000", "answering_machine_enabled": true, "answering_machine_instruction": "answering_machine_instruction", "author_conversation_id": "00000000-0000-0000-0000-000000000000", "author_kind": "person", "author_person_id": "00000000-0000-0000-0000-000000000000", "changes": [ { "kind": "node_added", "label": "string", "subject": "string" } ], "courtesy_window_seconds": 0, "created_at": "2024-08-25T15:00:00Z", "document_ids": [ "00000000-0000-0000-0000-000000000000" ], "duration_ceiling_seconds": 0, "failure_threshold": 0, "first_line_delay_ms": 0, "global_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "graph_id": "00000000-0000-0000-0000-000000000000", "greeting_interruptible": true, "id": "00000000-0000-0000-0000-000000000000", "language": "en", "notices": [ "string" ], "post_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "pre_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "search_fragment_limit": 0, "silence_timeout_seconds": 0, "status": "draft", "takes_documents": true, "takes_images": true, "takes_videos": true, "takes_voice_notes": true, "utterances": { "key": "string" }, "version_number": 0 }
json
application/json

Edit Draft

PATCH
/api/v1/agents/versions/{version_id}

Change a draft's name, language, phrases, AI profile, documents, call behaviour switches and timings, or the tools the whole agent carries. Use when configuring a draft before it is published; use replace_draft_graph or the one-by-one graph operations for the node graph itself.

Only the fields sent change. The agent's own recording switch, record_audio, rides along here and is not part of any version: it takes effect on the next call rather than at the next publish; moving it to a different value needs the recording feature (a body that repeats its current value is no move). global_tool_ids are available in every node; pre_hook_tool_ids run once before the first word, to fetch what the agent should know (the caller's record, their last order) — the caller is looked up by putting a collection's get_ tool here with its identity field fixed to $ref:conversation.number (update_tool, fixed_parameters); post_hook_tool_ids run once after the conversation ends. A tool that belongs to one situation goes on that node with update_node instead, and work with several steps after a conversation is an automation on an interaction ended, since a hook takes one tool each. Graph edits go through the draft's graph_id.

Edits the draft only. The published version keeps taking traffic until publish_version. Refused with 403 for one of the platform's own agents (the Architect, the Analyst).

Edit Draft › path Parameters

version_id
​string · uuid · required

Edit Draft › Request Body

Partial edit of the draft's own fields (graph edits go through `dynamic_context` using the draft's `graph_id`). Only provided fields change. `utterances` is itself partial: the named phrases are rewritten and the rest are left alone. A key outside `Utterance` fails validation — that is the closed set being closed — and so does a blank phrase. A blank `name` is refused for the same reason. Omitting `name` leaves the draft's name as it was, and sending it as `null` does the same: `null` reads as "not given" here, so it is accepted and the name is left alone rather than emptied. The twelve values below are partial in the same sense and refuse in the same place: each number carries its range, so one outside it is refused at the boundary rather than stored, and omitting one keeps what the draft already has. `greeting_interruptible`, `answering_machine_enabled` and the three `takes_*` switches are `bool`s and take `False` as a value, which is why every one of these is read as "given or not" rather than as truthy. `record_audio` is `name`'s neighbour rather than theirs: both are columns of the **agent**, so neither is versioned and neither waits for a publish. It is here rather than on a route of its own because this is already the one call that edits an agent, and a second endpoint for one boolean would be a second place a client has to know about.
DraftUpdate
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​

Edit Draft › Responses

Successful Response

AgentVersionOut
agent_id
​string · uuid · required
​required
answering_machine_enabled
​boolean · required
answering_machine_instruction
​string · required
​required
​required
​required
courtesy_window_seconds
​integer · required
created_at
​string · date-time · required
duration_ceiling_seconds
​integer · required
failure_threshold
​integer · required
first_line_delay_ms
​integer · required
graph_id
​string · uuid · required
greeting_interruptible
​boolean · required
id
​string · uuid · required
language
​Language · enum · required

A language the platform can speak — which is to say, one it has default phrases written in. The agent states one of these and every phrase on it is written in that one; a language with no phrases behind it would be a label.

Enum values:
en
es
search_fragment_limit
​integer · required
silence_timeout_seconds
​integer · required
status
​Status · enum · required

A version's place in the draft → published → archived lifecycle.

Enum values:
draft
published
archived
takes_documents
​boolean · required
takes_images
​boolean · required
takes_videos
​boolean · required
takes_voice_notes
​boolean · required
​object · required
​required
​VersionChange[]
document_ids
​string[]
global_tool_ids
​string[]
notices
​string[]
post_hook_tool_ids
​string[]
pre_hook_tool_ids
​string[]
PATCH/api/v1/agents/versions/{version_id}
curl /api/v1/agents/versions/:version_id \ --request PATCH \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "ai_profile_id": "00000000-0000-0000-0000-000000000000", "answering_machine_enabled": true, "answering_machine_instruction": "string", "courtesy_window_seconds": 0, "document_ids": [ "00000000-0000-0000-0000-000000000000" ], "duration_ceiling_seconds": 60, "failure_threshold": 1, "first_line_delay_ms": 0, "global_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "greeting_interruptible": true, "language": "en", "name": "string", "post_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "pre_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "record_audio": true, "search_fragment_limit": 1, "silence_timeout_seconds": 10, "takes_documents": true, "takes_images": true, "takes_videos": true, "takes_voice_notes": true, "utterances": { "key": "string" } }'
Example Request Body
{ "ai_profile_id": "00000000-0000-0000-0000-000000000000", "answering_machine_enabled": true, "answering_machine_instruction": "string", "courtesy_window_seconds": 0, "document_ids": [ "00000000-0000-0000-0000-000000000000" ], "duration_ceiling_seconds": 60, "failure_threshold": 1, "first_line_delay_ms": 0, "global_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "greeting_interruptible": true, "language": "en", "name": "string", "post_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "pre_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "record_audio": true, "search_fragment_limit": 1, "silence_timeout_seconds": 10, "takes_documents": true, "takes_images": true, "takes_videos": true, "takes_voice_notes": true, "utterances": { "key": "string" } }
json
Example Responses
{ "agent_id": "00000000-0000-0000-0000-000000000000", "ai_profile_id": "00000000-0000-0000-0000-000000000000", "answering_machine_enabled": true, "answering_machine_instruction": "answering_machine_instruction", "author_conversation_id": "00000000-0000-0000-0000-000000000000", "author_kind": "person", "author_person_id": "00000000-0000-0000-0000-000000000000", "changes": [ { "kind": "node_added", "label": "string", "subject": "string" } ], "courtesy_window_seconds": 0, "created_at": "2024-08-25T15:00:00Z", "document_ids": [ "00000000-0000-0000-0000-000000000000" ], "duration_ceiling_seconds": 0, "failure_threshold": 0, "first_line_delay_ms": 0, "global_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "graph_id": "00000000-0000-0000-0000-000000000000", "greeting_interruptible": true, "id": "00000000-0000-0000-0000-000000000000", "language": "en", "notices": [ "string" ], "post_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "pre_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "search_fragment_limit": 0, "silence_timeout_seconds": 0, "status": "draft", "takes_documents": true, "takes_images": true, "takes_videos": true, "takes_voice_notes": true, "utterances": { "key": "string" }, "version_number": 0 }
json
application/json

Replace Draft Graph

PUT
/api/v1/agents/versions/{version_id}/graph

Write a draft's whole graph in one act — every node, every edge, the root and each node's tools — replacing whatever the draft's graph held before. Use this when the graph has been designed already and is being written down; use add_node, add_edge, update_node and set_root for one change to a graph that exists.

Nodes carry a key of your choosing (any short string, unique in the payload); edges and root name nodes by that key, so the whole graph is declared before any id exists. A node's name is what a person will see it called — give each node one when you write a graph; the model never reads it. The response returns the graph as stored and node_ids, each key mapped to the id its node was given — use those ids with the one-by-one operations afterwards. A node's tool_ids are instance ids exactly as update_node takes them.

Refused whole — nothing about the draft changes, and reasons names every problem at once — when two edges leaving one node share a label (compared trimmed and case-insensitively), when a tool name would be offered twice across the agent (the draft's global tools count), or when an edge or root names a key no node carries. A node with no edges, or no root at all, is unfinished and is accepted: a draft may be. Takes the draft's version id (get_draft); a published version is refused. Nothing takes traffic until publish_version. Refused with 403 for one of the platform's own agents.

Replace Draft Graph › path Parameters

version_id
​string · uuid · required

Replace Draft Graph › Request Body

Everything a graph is, declared at once. `root` is the key of the node a conversation starts at, or `None` for a graph that has no root yet — allowed, because a draft may be unfinished.
GraphReplace
​GraphEdgeSpec[]
​GraphNodeSpec[]
​

Replace Draft Graph › Responses

Successful Response

The graph as stored, and each payload key resolved to the node id it got.
GraphReplaced
​GraphOut · required

A whole graph: its nodes, its edges, and which node is the root.

​object · required
PUT/api/v1/agents/versions/{version_id}/graph
curl /api/v1/agents/versions/:version_id/graph \ --request PUT \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "edges": [ { "condition": "", "source": "source", "target": "target" } ], "nodes": [ { "instructions": "", "key": "key", "name": "string", "position": { "x": 0, "y": 0 }, "tool_ids": [ "00000000-0000-0000-0000-000000000000" ] } ], "root": "string" }'
Example Request Body
{ "edges": [ { "condition": "", "source": "source", "target": "target" } ], "nodes": [ { "instructions": "", "key": "key", "name": "string", "position": { "x": 0, "y": 0 }, "tool_ids": [ "00000000-0000-0000-0000-000000000000" ] } ], "root": "string" }
json
Example Responses
{ "graph": { "edges": [ { "condition": "condition", "id": "00000000-0000-0000-0000-000000000000", "source_node_id": "00000000-0000-0000-0000-000000000000", "target_node_id": "00000000-0000-0000-0000-000000000000" } ], "id": "00000000-0000-0000-0000-000000000000", "nodes": [ { "id": "00000000-0000-0000-0000-000000000000", "instructions": "instructions", "label": "label", "name": "string", "origin_id": "00000000-0000-0000-0000-000000000000", "position": { "x": 0, "y": 0 }, "tool_ids": [ "00000000-0000-0000-0000-000000000000" ] } ], "root_node_id": "00000000-0000-0000-0000-000000000000" }, "node_ids": { "key": "00000000-0000-0000-0000-000000000000" } }
json
application/json

Publish Version

POST
/api/v1/agents/versions/{version_id}/publish

Make this version the one that takes live traffic. Use when the draft is ready and should start answering real calls.

Refused if the version could not run: a graph with no root node, or one naming a root it does not contain; no AI profile named, or one this organization cannot use; two visible tools sharing a name; two edges leaving one node under the same label. The refusal names every reason, one per entry. Refused with 403 for one of the platform's own agents.

Publish Version › path Parameters

version_id
​string · uuid · required

Publish Version › Responses

Successful Response

AgentVersionOut
agent_id
​string · uuid · required
​required
answering_machine_enabled
​boolean · required
answering_machine_instruction
​string · required
​required
​required
​required
courtesy_window_seconds
​integer · required
created_at
​string · date-time · required
duration_ceiling_seconds
​integer · required
failure_threshold
​integer · required
first_line_delay_ms
​integer · required
graph_id
​string · uuid · required
greeting_interruptible
​boolean · required
id
​string · uuid · required
language
​Language · enum · required

A language the platform can speak — which is to say, one it has default phrases written in. The agent states one of these and every phrase on it is written in that one; a language with no phrases behind it would be a label.

Enum values:
en
es
search_fragment_limit
​integer · required
silence_timeout_seconds
​integer · required
status
​Status · enum · required

A version's place in the draft → published → archived lifecycle.

Enum values:
draft
published
archived
takes_documents
​boolean · required
takes_images
​boolean · required
takes_videos
​boolean · required
takes_voice_notes
​boolean · required
​object · required
​required
​VersionChange[]
document_ids
​string[]
global_tool_ids
​string[]
notices
​string[]
post_hook_tool_ids
​string[]
pre_hook_tool_ids
​string[]
POST/api/v1/agents/versions/{version_id}/publish
curl /api/v1/agents/versions/:version_id/publish \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "agent_id": "00000000-0000-0000-0000-000000000000", "ai_profile_id": "00000000-0000-0000-0000-000000000000", "answering_machine_enabled": true, "answering_machine_instruction": "answering_machine_instruction", "author_conversation_id": "00000000-0000-0000-0000-000000000000", "author_kind": "person", "author_person_id": "00000000-0000-0000-0000-000000000000", "changes": [ { "kind": "node_added", "label": "string", "subject": "string" } ], "courtesy_window_seconds": 0, "created_at": "2024-08-25T15:00:00Z", "document_ids": [ "00000000-0000-0000-0000-000000000000" ], "duration_ceiling_seconds": 0, "failure_threshold": 0, "first_line_delay_ms": 0, "global_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "graph_id": "00000000-0000-0000-0000-000000000000", "greeting_interruptible": true, "id": "00000000-0000-0000-0000-000000000000", "language": "en", "notices": [ "string" ], "post_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "pre_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "search_fragment_limit": 0, "silence_timeout_seconds": 0, "status": "draft", "takes_documents": true, "takes_images": true, "takes_videos": true, "takes_voice_notes": true, "utterances": { "key": "string" }, "version_number": 0 }
json
application/json

Get Agent

GET
/api/v1/agents/{agent_id}

Read one agent of this organization: its live version, language, AI profile, recording switch and last change. The draft is read with GET /agents/{agent_id}/draft and the published history with GET /agents/{agent_id}/versions.

Get Agent › path Parameters

agent_id
​string · uuid · required

Get Agent › Responses

Successful Response

One row of the list of agents. `language` and `updated_at` are **not** columns of the agent — they are read off its versions, which is why they are built by `service` and not by a `model_validate` — and both are here so the list screen can show them without asking a second question per row.
AgentOut
​required
id
​string · uuid · required
language
​Language · enum · required

A language the platform can speak — which is to say, one it has default phrases written in. The agent states one of these and every phrase on it is written in that one; a language with no phrases behind it would be a label.

Enum values:
en
es
name
​string · required
owner_id
​string · uuid · required
platform
​boolean · required
record_audio
​boolean · required
​required
​required
updated_at
​string · date-time · required
​
GET/api/v1/agents/{agent_id}
curl /api/v1/agents/:agent_id \ --header 'Authorization: Bearer <token>'
Example Responses
{ "ai_profile_id": "00000000-0000-0000-0000-000000000000", "current_version_id": "00000000-0000-0000-0000-000000000000", "id": "00000000-0000-0000-0000-000000000000", "language": "en", "name": "name", "owner_id": "00000000-0000-0000-0000-000000000000", "platform": true, "record_audio": true, "source_agent_id": "00000000-0000-0000-0000-000000000000", "source_version_id": "00000000-0000-0000-0000-000000000000", "updated_at": "2024-08-25T15:00:00Z" }
json
application/json

Delete Agent

DELETE
/api/v1/agents/{agent_id}

Delete an agent and every version of it, permanently. Use when the agent should stop existing altogether, not just stop taking traffic.

Refused while something still routes conversations to it; the refusal names what has to be unassigned first. Refused with 403 for one of the platform's own agents.

Delete Agent › path Parameters

agent_id
​string · uuid · required

Delete Agent › Responses

Successful Response

No data returned
DELETE/api/v1/agents/{agent_id}
curl /api/v1/agents/:agent_id \ --request DELETE \ --header 'Authorization: Bearer <token>'
Example Responses
No example specified for this content type

Copy Agent

POST
/api/v1/agents/{agent_id}/copy

Duplicate an agent, graph and all, as a new draft. Use when starting a new agent from an existing one instead of from scratch.

The copy is independent of the original and takes no traffic until published. Refused with 403 for one of the platform's own agents (the Architect, the Analyst).

Copy Agent › path Parameters

agent_id
​string · uuid · required

Copy Agent › Request Body

A copy needs its own name, "or a list of agents becomes a list of guesses". Everything else about the copy comes from what it was copied from.
AgentCopy
name
​string · minLength: 1 · required

Copy Agent › Responses

Successful Response

One row of the list of agents. `language` and `updated_at` are **not** columns of the agent — they are read off its versions, which is why they are built by `service` and not by a `model_validate` — and both are here so the list screen can show them without asking a second question per row.
AgentOut
​required
id
​string · uuid · required
language
​Language · enum · required

A language the platform can speak — which is to say, one it has default phrases written in. The agent states one of these and every phrase on it is written in that one; a language with no phrases behind it would be a label.

Enum values:
en
es
name
​string · required
owner_id
​string · uuid · required
platform
​boolean · required
record_audio
​boolean · required
​required
​required
updated_at
​string · date-time · required
​
POST/api/v1/agents/{agent_id}/copy
curl /api/v1/agents/:agent_id/copy \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "name": "name" }'
Example Request Body
{ "name": "name" }
json
Example Responses
{ "ai_profile_id": "00000000-0000-0000-0000-000000000000", "current_version_id": "00000000-0000-0000-0000-000000000000", "id": "00000000-0000-0000-0000-000000000000", "language": "en", "name": "name", "owner_id": "00000000-0000-0000-0000-000000000000", "platform": true, "record_audio": true, "source_agent_id": "00000000-0000-0000-0000-000000000000", "source_version_id": "00000000-0000-0000-0000-000000000000", "updated_at": "2024-08-25T15:00:00Z" }
json
application/json

Get Draft

GET
/api/v1/agents/{agent_id}/draft

Fetch the agent's draft — the version to edit. Use when about to change an agent's configuration or graph, or when you need its graph_id.

Its graph_id is what the graph tools (add_node, add_edge, set_root) take.

Get Draft › path Parameters

agent_id
​string · uuid · required

Get Draft › Responses

Successful Response

AgentVersionOut
agent_id
​string · uuid · required
​required
answering_machine_enabled
​boolean · required
answering_machine_instruction
​string · required
​required
​required
​required
courtesy_window_seconds
​integer · required
created_at
​string · date-time · required
duration_ceiling_seconds
​integer · required
failure_threshold
​integer · required
first_line_delay_ms
​integer · required
graph_id
​string · uuid · required
greeting_interruptible
​boolean · required
id
​string · uuid · required
language
​Language · enum · required

A language the platform can speak — which is to say, one it has default phrases written in. The agent states one of these and every phrase on it is written in that one; a language with no phrases behind it would be a label.

Enum values:
en
es
search_fragment_limit
​integer · required
silence_timeout_seconds
​integer · required
status
​Status · enum · required

A version's place in the draft → published → archived lifecycle.

Enum values:
draft
published
archived
takes_documents
​boolean · required
takes_images
​boolean · required
takes_videos
​boolean · required
takes_voice_notes
​boolean · required
​object · required
​required
​VersionChange[]
document_ids
​string[]
global_tool_ids
​string[]
notices
​string[]
post_hook_tool_ids
​string[]
pre_hook_tool_ids
​string[]
GET/api/v1/agents/{agent_id}/draft
curl /api/v1/agents/:agent_id/draft \ --header 'Authorization: Bearer <token>'
Example Responses
{ "agent_id": "00000000-0000-0000-0000-000000000000", "ai_profile_id": "00000000-0000-0000-0000-000000000000", "answering_machine_enabled": true, "answering_machine_instruction": "answering_machine_instruction", "author_conversation_id": "00000000-0000-0000-0000-000000000000", "author_kind": "person", "author_person_id": "00000000-0000-0000-0000-000000000000", "changes": [ { "kind": "node_added", "label": "string", "subject": "string" } ], "courtesy_window_seconds": 0, "created_at": "2024-08-25T15:00:00Z", "document_ids": [ "00000000-0000-0000-0000-000000000000" ], "duration_ceiling_seconds": 0, "failure_threshold": 0, "first_line_delay_ms": 0, "global_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "graph_id": "00000000-0000-0000-0000-000000000000", "greeting_interruptible": true, "id": "00000000-0000-0000-0000-000000000000", "language": "en", "notices": [ "string" ], "post_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "pre_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "search_fragment_limit": 0, "silence_timeout_seconds": 0, "status": "draft", "takes_documents": true, "takes_images": true, "takes_videos": true, "takes_voice_notes": true, "utterances": { "key": "string" }, "version_number": 0 }
json
application/json

Get Agent Map

GET
/api/v1/agents/{agent_id}/map

Read one agent's frame of the map: the agent's card, what brings it conversations, what runs before, during and after them, the collections and documents it reads and writes, and the connections its tools use -- each with its owner and whether it is working. Parts you may not see are counted in hidden, never named. Give owner to see one recipe's parts, or only the organization's own. Give draft=true to draw the frame from the agent's draft -- the version being edited, which answers no conversation until published -- instead of its published version; version_id names the version drawn and frame.draft says the draft was drawn. Changes nothing.

Get Agent Map › path Parameters

agent_id
​string · uuid · required

Get Agent Map › query Parameters

owner
​

Narrow the map to one owner: organization for the organization's own parts, or an installed recipe's id for that recipe's.

Narrow the map to one owner: organization for the organization's own parts, or an installed recipe's id for that recipe's.

draft
​boolean

Draw the agent's frame from its draft, the version being edited, instead of the version that answers conversations.

Draw the agent's frame from its draft, the version being edited, instead of the version that answers conversations.

Default: false

Get Agent Map › Responses

Successful Response

One agent's frame, as this reader may see it (rule 40): the agent's own card, the outer cards its frame names (what brings it conversations, what it reads and writes), the lines between those, and the frame.
AgentMapOut
agent_id
​string · uuid · required
​MapPartOut · required

One card. key is the map's own handle for it (<kind>:<id>), what every line and lane names; id is the part's own id, for opening its screen (rule 23) -- for a documents or capability card, the agent's.

state is None for a card that carries no dot (rule 35): a collection, documents, a capability, a number. failure -- why it failed -- is filled only for a reader who may read where the failure was recorded (rule 30). missing marks a part something points at that no longer exists, or a part an incomplete recipe lacks; name is then the last name known, or None (rule 37).

​MapPartOut[] · required
​MapFrameOut · required

One opened card's inside (rule 11). parts are the cards inside it, each with frame set to key; lines every line drawn inside it, including those from a part inside to an outer card it reads or writes. reads and writes name the outer cards drawn above and below it; one both read and written is in writes alone (rule 17).

​MapGroupOut[] · required
hidden
​integer · required
​MapLineOut[] · required
name
​string · required
​required
published
​boolean · required
read_at
​string · date-time · required
version_id
​string · uuid · required
GET/api/v1/agents/{agent_id}/map
curl /api/v1/agents/:agent_id/map \ --header 'Authorization: Bearer <token>'
Example Responses
{ "agent_id": "00000000-0000-0000-0000-000000000000", "card": { "count": 0, "detail": "string", "failure": "string", "frame": "string", "id": "00000000-0000-0000-0000-000000000000", "key": "key", "kind": "agent", "label": "string", "missing": false, "name": "string", "never_run": false, "nodes": 0, "on_every_node": false, "openable": false, "owner": { "id": "00000000-0000-0000-0000-000000000000", "key": "string", "kind": "recipe", "name": "string" }, "reaches_no_agent": false, "reason": "last_run_failed", "recipes": [], "runs_flow_as_step": false, "scope": "every_conversation", "seen_by": [], "state": "failing", "state_at": "2024-08-25T15:00:00Z", "steps_run": [] }, "cards": [ { "count": 0, "detail": "string", "failure": "string", "frame": "string", "id": "00000000-0000-0000-0000-000000000000", "key": "key", "kind": "agent", "label": "string", "missing": false, "name": "string", "never_run": false, "nodes": 0, "on_every_node": false, "openable": false, "owner": { "id": "00000000-0000-0000-0000-000000000000", "key": "string", "kind": "recipe", "name": "string" }, "reaches_no_agent": false, "reason": "last_run_failed", "recipes": [], "runs_flow_as_step": false, "scope": "every_conversation", "seen_by": [], "state": "failing", "state_at": "2024-08-25T15:00:00Z", "steps_run": [] } ], "frame": { "alone": true, "draft": false, "hidden": 0, "key": "key", "lanes": { "after": [], "before": [], "during": [], "inbound": [] }, "lines": [ { "kind": "brings_conversations", "source": "source", "target": "target" } ], "parts": [ { "count": 0, "detail": "string", "failure": "string", "frame": "string", "id": "00000000-0000-0000-0000-000000000000", "key": "key", "kind": "agent", "label": "string", "missing": false, "name": "string", "never_run": false, "nodes": 0, "on_every_node": false, "openable": false, "owner": { "id": "00000000-0000-0000-0000-000000000000", "key": "string", "kind": "recipe", "name": "string" }, "reaches_no_agent": false, "reason": "last_run_failed", "recipes": [], "runs_flow_as_step": false, "scope": "every_conversation", "seen_by": [], "state": "failing", "state_at": "2024-08-25T15:00:00Z", "steps_run": [] } ], "published": true, "reads": [ "string" ], "version_id": "00000000-0000-0000-0000-000000000000", "writes": [ "string" ] }, "groups": [ { "owner": { "id": "00000000-0000-0000-0000-000000000000", "key": "string", "kind": "recipe", "name": "string" }, "parts": [ "string" ], "recipe": { "enabled": true, "error": "string", "key": "key", "state": "installed", "switched_off_reason": "string" }, "worst": "failing" } ], "hidden": 0, "lines": [ { "kind": "brings_conversations", "source": "source", "target": "target" } ], "name": "name", "owner": "organization", "published": true, "read_at": "2024-08-25T15:00:00Z", "version_id": "00000000-0000-0000-0000-000000000000" }
json
application/json

Pending Changes

GET
/api/v1/agents/{agent_id}/pending-changes

List what publishing the draft would change, against the version that is live. Use when deciding whether a draft is ready to publish, or summarizing what a publish would do before doing it.

The same vocabulary a published version records. Empty means the draft says what the live version says; an agent that has never been published has no since to be pending against and answers 404.

Pending Changes › path Parameters

agent_id
​string · uuid · required

Pending Changes › Responses

Successful Response

​VersionChange[]
One entry of a version's what-changed summary. `subject` names the thing it happened to — the utterance, the version number restored from, or the lineage id of the node or edge involved — and is `None` where the kind is about the agent as a whole. `label` is what a person calls the subject, where the subject is a node: `dynamic_context`'s one resolved display string (the node's name, else a recap of its instructions) as it read in the version this entry describes — the version's own row for a node it holds, the previous version's for a node it removed. `None` for every other kind. A screen shows it in front of the lineage id, never instead of it: two nodes may share a name, and the id is what keeps them apart.
VersionChange
kind
​ChangeKind · enum · required

What changed since the version before, in the vocabulary of the product.

Not a diff of text: each member is a sentence a client would recognise about their own agent. Rendering one into their language is the dashboard's job, which is why these are named states and not English strings.

Enum values:
node_added
node_removed
node_instructions_changed
node_tools_changed
node_moved
edge_added
edge_removed
edge_condition_changed
​
​
GET/api/v1/agents/{agent_id}/pending-changes
curl /api/v1/agents/:agent_id/pending-changes \ --header 'Authorization: Bearer <token>'
Example Responses
[ { "kind": "node_added", "label": "string", "subject": "string" } ]
json
application/json

List Placements

GET
/api/v1/agents/{agent_id}/placements

List what sits in an agent's pre- and post-conversation slots outside its versions: each tool a recipe placed there, whose it is (owner) and whether it is on. Use it beside the draft's own hooks to say everything that runs before and after the agent's conversations. A placement runs from the next conversation without a publish and is changed only through the recipe that owns it.

List Placements › path Parameters

agent_id
​string · uuid · required

List Placements › Responses

Successful Response

​PlacementOut[]
One tool placed in an agent's `pre` or `post` slot **by something that owns the placement**, outside every version (recipes.md rule 33, agents.md rule 41). It belongs to the agent: it runs from the agent's next conversation without a publish, stays through every publish and restore, and is not carried by a copy (rule 47). `owner` is `tools`' own shape -- what kind of thing placed it and which one -- compared for equality and never resolved here. `enabled` is the owner's switch: a placement switched off is kept and does not run.
PlacementOut
agent_id
​string · uuid · required
enabled
​boolean · required
id
​string · uuid · required
​Owner · required

What another feature says when it owns a row: what kind of thing it is, and which one.

A value and not two loose columns, because the pair is meaningless apart: an id with no kind names nothing, and a kind with no id names everything. Both halves are opaque to this slice on purpose — tools is tier 0 and the things that own rows sit above it, so resolving "campaign 3f2a" into a name a person reads is the screen's job and never this one's. What is asked of it here is only ever equality: is the caller the owner.

slot
​Slot · enum · required

The lifecycle slot a tool is placed in. Which tool is attached to which slot belongs to agents; whether a tool can be in a slot belongs here, because it is a fact about the tool (service.available_in_slot).

Enum values:
pre
in
post
tool_id
​string · uuid · required
GET/api/v1/agents/{agent_id}/placements
curl /api/v1/agents/:agent_id/placements \ --header 'Authorization: Bearer <token>'
Example Responses
[ { "agent_id": "00000000-0000-0000-0000-000000000000", "enabled": true, "id": "00000000-0000-0000-0000-000000000000", "owner": { "id": "00000000-0000-0000-0000-000000000000", "kind": "kind" }, "slot": "pre", "tool_id": "00000000-0000-0000-0000-000000000000" } ]
json
application/json

Restore Version

POST
/api/v1/agents/{agent_id}/restore/{version_id}

Publish an earlier version again, making it live. Use when the current live version is wrong and an earlier one should take traffic instead.

The draft is left alone; this changes what answers, not what is being edited. Refused with 403 for one of the platform's own agents.

Restore Version › path Parameters

agent_id
​string · uuid · required
version_id
​string · uuid · required

Restore Version › Responses

Successful Response

AgentVersionOut
agent_id
​string · uuid · required
​required
answering_machine_enabled
​boolean · required
answering_machine_instruction
​string · required
​required
​required
​required
courtesy_window_seconds
​integer · required
created_at
​string · date-time · required
duration_ceiling_seconds
​integer · required
failure_threshold
​integer · required
first_line_delay_ms
​integer · required
graph_id
​string · uuid · required
greeting_interruptible
​boolean · required
id
​string · uuid · required
language
​Language · enum · required

A language the platform can speak — which is to say, one it has default phrases written in. The agent states one of these and every phrase on it is written in that one; a language with no phrases behind it would be a label.

Enum values:
en
es
search_fragment_limit
​integer · required
silence_timeout_seconds
​integer · required
status
​Status · enum · required

A version's place in the draft → published → archived lifecycle.

Enum values:
draft
published
archived
takes_documents
​boolean · required
takes_images
​boolean · required
takes_videos
​boolean · required
takes_voice_notes
​boolean · required
​object · required
​required
​VersionChange[]
document_ids
​string[]
global_tool_ids
​string[]
notices
​string[]
post_hook_tool_ids
​string[]
pre_hook_tool_ids
​string[]
POST/api/v1/agents/{agent_id}/restore/{version_id}
curl /api/v1/agents/:agent_id/restore/:version_id \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "agent_id": "00000000-0000-0000-0000-000000000000", "ai_profile_id": "00000000-0000-0000-0000-000000000000", "answering_machine_enabled": true, "answering_machine_instruction": "answering_machine_instruction", "author_conversation_id": "00000000-0000-0000-0000-000000000000", "author_kind": "person", "author_person_id": "00000000-0000-0000-0000-000000000000", "changes": [ { "kind": "node_added", "label": "string", "subject": "string" } ], "courtesy_window_seconds": 0, "created_at": "2024-08-25T15:00:00Z", "document_ids": [ "00000000-0000-0000-0000-000000000000" ], "duration_ceiling_seconds": 0, "failure_threshold": 0, "first_line_delay_ms": 0, "global_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "graph_id": "00000000-0000-0000-0000-000000000000", "greeting_interruptible": true, "id": "00000000-0000-0000-0000-000000000000", "language": "en", "notices": [ "string" ], "post_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "pre_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "search_fragment_limit": 0, "silence_timeout_seconds": 0, "status": "draft", "takes_documents": true, "takes_images": true, "takes_videos": true, "takes_voice_notes": true, "utterances": { "key": "string" }, "version_number": 0 }
json
application/json

List Versions

GET
/api/v1/agents/{agent_id}/versions

List an agent's versions, oldest first, with what changed and who changed it. Use when reviewing an agent's history or picking a version to inspect or restore.

List Versions › path Parameters

agent_id
​string · uuid · required

List Versions › Responses

Successful Response

​AgentVersionOut[]
AgentVersionOut
agent_id
​string · uuid · required
​required
answering_machine_enabled
​boolean · required
answering_machine_instruction
​string · required
​required
​required
​required
courtesy_window_seconds
​integer · required
created_at
​string · date-time · required
duration_ceiling_seconds
​integer · required
failure_threshold
​integer · required
first_line_delay_ms
​integer · required
graph_id
​string · uuid · required
greeting_interruptible
​boolean · required
id
​string · uuid · required
language
​Language · enum · required

A language the platform can speak — which is to say, one it has default phrases written in. The agent states one of these and every phrase on it is written in that one; a language with no phrases behind it would be a label.

Enum values:
en
es
search_fragment_limit
​integer · required
silence_timeout_seconds
​integer · required
status
​Status · enum · required

A version's place in the draft → published → archived lifecycle.

Enum values:
draft
published
archived
takes_documents
​boolean · required
takes_images
​boolean · required
takes_videos
​boolean · required
takes_voice_notes
​boolean · required
​object · required
​required
​VersionChange[]
document_ids
​string[]
global_tool_ids
​string[]
notices
​string[]
post_hook_tool_ids
​string[]
pre_hook_tool_ids
​string[]
GET/api/v1/agents/{agent_id}/versions
curl /api/v1/agents/:agent_id/versions \ --header 'Authorization: Bearer <token>'
Example Responses
[ { "agent_id": "00000000-0000-0000-0000-000000000000", "ai_profile_id": "00000000-0000-0000-0000-000000000000", "answering_machine_enabled": true, "answering_machine_instruction": "answering_machine_instruction", "author_conversation_id": "00000000-0000-0000-0000-000000000000", "author_kind": "person", "author_person_id": "00000000-0000-0000-0000-000000000000", "changes": [ { "kind": "node_added", "label": "string", "subject": "string" } ], "courtesy_window_seconds": 0, "created_at": "2024-08-25T15:00:00Z", "document_ids": [ "00000000-0000-0000-0000-000000000000" ], "duration_ceiling_seconds": 0, "failure_threshold": 0, "first_line_delay_ms": 0, "global_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "graph_id": "00000000-0000-0000-0000-000000000000", "greeting_interruptible": true, "id": "00000000-0000-0000-0000-000000000000", "language": "en", "notices": [ "string" ], "post_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "pre_hook_tool_ids": [ "00000000-0000-0000-0000-000000000000" ], "search_fragment_limit": 0, "silence_timeout_seconds": 0, "status": "draft", "takes_documents": true, "takes_images": true, "takes_videos": true, "takes_voice_notes": true, "utterances": { "key": "string" }, "version_number": 0 } ]
json
application/json

Get Map

GET
/api/v1/map

Read the organization's map: its agents, the automations that run on their own, what brings conversations to each agent, its collections and each agent's documents, as folded cards with the lines between them -- and, for each agent and automation, the frame of what runs before, during and after it. Each card says who owns it (an installed recipe or the organization) and whether it is working. Parts you may not see are counted in hidden, never named. Give owner to see one recipe's parts, or only the organization's own. Changes nothing.

Get Map › query Parameters

owner
​

Narrow the map to one owner: organization for the organization's own parts, or an installed recipe's id for that recipe's.

Narrow the map to one owner: organization for the organization's own parts, or an installed recipe's id for that recipe's.

Get Map › Responses

Successful Response

The organization's map, as this reader may see it (rule 40).
OrgMapOut
alone
​boolean · required
​MapPartOut[] · required
​MapFrameOut[] · required
​MapGroupOut[] · required
hidden
​integer · required
​MapLineOut[] · required
​required
read_at
​string · date-time · required
GET/api/v1/map
curl /api/v1/map \ --header 'Authorization: Bearer <token>'
Example Responses
{ "alone": true, "cards": [ { "count": 0, "detail": "string", "failure": "string", "frame": "string", "id": "00000000-0000-0000-0000-000000000000", "key": "key", "kind": "agent", "label": "string", "missing": false, "name": "string", "never_run": false, "nodes": 0, "on_every_node": false, "openable": false, "owner": { "id": "00000000-0000-0000-0000-000000000000", "key": "string", "kind": "recipe", "name": "string" }, "reaches_no_agent": false, "reason": "last_run_failed", "recipes": [], "runs_flow_as_step": false, "scope": "every_conversation", "seen_by": [], "state": "failing", "state_at": "2024-08-25T15:00:00Z", "steps_run": [] } ], "frames": [ { "alone": true, "draft": false, "hidden": 0, "key": "key", "lanes": { "after": [], "before": [], "during": [], "inbound": [] }, "lines": [ { "kind": "brings_conversations", "source": "source", "target": "target" } ], "parts": [ { "count": 0, "detail": "string", "failure": "string", "frame": "string", "id": "00000000-0000-0000-0000-000000000000", "key": "key", "kind": "agent", "label": "string", "missing": false, "name": "string", "never_run": false, "nodes": 0, "on_every_node": false, "openable": false, "owner": { "id": "00000000-0000-0000-0000-000000000000", "key": "string", "kind": "recipe", "name": "string" }, "reaches_no_agent": false, "reason": "last_run_failed", "recipes": [], "runs_flow_as_step": false, "scope": "every_conversation", "seen_by": [], "state": "failing", "state_at": "2024-08-25T15:00:00Z", "steps_run": [] } ], "published": true, "reads": [ "string" ], "version_id": "00000000-0000-0000-0000-000000000000", "writes": [ "string" ] } ], "groups": [ { "owner": { "id": "00000000-0000-0000-0000-000000000000", "key": "string", "kind": "recipe", "name": "string" }, "parts": [ "string" ], "recipe": { "enabled": true, "error": "string", "key": "key", "state": "installed", "switched_off_reason": "string" }, "worst": "failing" } ], "hidden": 0, "lines": [ { "kind": "brings_conversations", "source": "source", "target": "target" } ], "owner": "organization", "read_at": "2024-08-25T15:00:00Z" }
json
application/json

voice_agent