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

text


Open Conversation

POST
/api/v1/text/conversations

Start a conversation with an agent and get its greeting. Use once, before send_message, to begin a new text conversation.

The returned interaction_id is the handle for everything that follows and is the id of the record in the log — one id, because a conversation and the record of it are the same conversation.

By default the conversation runs against the agent's published version, and an agent that has never been published is refused (409). To test a draft before publishing it, pass draft_version_id — the agent's draft, as get_draft returns it. The conversation then runs against the draft as it stands at this call, is metered like any other, and its record carries draft_test: true, which analytics leave out by default. An edit to the draft afterwards is not seen by this conversation: open a new test after each change. A draft_version_id that is not that agent's draft is refused (409). Only this operation can open a conversation against a draft; no channel or line can.

context says who the conversation is with, and is accepted only from an organization API key, called from your server: the same request with a signed-in session is refused (403).

Open Conversation › Request Body

Which agent to talk to, and whether to ask before consequential actions. The version, the graph, the tools and the settings are the agent's published answer and are not choosable here — picking any of them would be a caller choosing what it was never offered. `mode` is not the same kind of thing: it is a fact about *this conversation* rather than about the agent, and it is the client saying how they want to work. It **defaults to `ask`**, which is the spec's "asking is always the default" in the shape of a field: a client that says nothing gets every question. `draft_version_id` is the one exception to the first paragraph, stated precisely (text-agent.md, "A conversation with a draft, for a test"): a caller that already edits an agent's draft may name **that draft** and talk to it before it is published. It is the draft's own version id, read off `get_draft` -- an id rather than a flag, because the spec's word is a *named* draft and the record then carries what was named; and it must be the draft, not a published or archived version, which would be picking a version the way the first paragraph forbids (409). Absent, the conversation runs against the published version exactly as before.
OpenRequest
agent_id
​string · uuid · required
​
​
mode
​ConfirmationMode · enum

Whether one conversation is still asking before consequential actions.

architect.md rule 20: "a person may tell one conversation to stop asking… It is a property of that conversation only — not of the person or the organization — and asking is always where a conversation starts."

It is a column vocabulary here and an input to the run-loop there, which is the same two-names split Channel has and for the same reason: this one is what the record says a conversation was set to, and that one is what decides whether the loop stops. Member for member, so a writer maps with interactions.ConfirmationMode(mode) and needs no table.

Enum values:
ask
auto
Default: ask

Open Conversation › Responses

Successful Response

A conversation that has started, and the first thing the agent said. `interaction_id` is both halves at once: it is the handle every later request in this conversation carries, and it is the id of the record in the [log](../interactions/CONTRACT.md). One id rather than two, because a conversation and the record of it are the same conversation.
OpenedConversation
agent_id
​string · uuid · required
greeting
​string · required
interaction_id
​string · uuid · required
mode
​ConfirmationMode · enum · required

Whether one conversation is still asking before consequential actions.

architect.md rule 20: "a person may tell one conversation to stop asking… It is a property of that conversation only — not of the person or the organization — and asking is always where a conversation starts."

It is a column vocabulary here and an input to the run-loop there, which is the same two-names split Channel has and for the same reason: this one is what the record says a conversation was set to, and that one is what decides whether the loop stops. Member for member, so a writer maps with interactions.ConfirmationMode(mode) and needs no table.

Enum values:
ask
auto
POST/api/v1/text/conversations
curl /api/v1/text/conversations \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "agent_id": "00000000-0000-0000-0000-000000000000", "context": { "key": "string" }, "draft_version_id": "00000000-0000-0000-0000-000000000000", "mode": "ask" }'
Example Request Body
{ "agent_id": "00000000-0000-0000-0000-000000000000", "context": { "key": "string" }, "draft_version_id": "00000000-0000-0000-0000-000000000000", "mode": "ask" }
json
Example Responses
{ "agent_id": "00000000-0000-0000-0000-000000000000", "greeting": "greeting", "interaction_id": "00000000-0000-0000-0000-000000000000", "mode": "ask" }
json
application/json

Close Conversation

POST
/api/v1/text/conversations/{interaction_id}/close

End the conversation. Use when the conversation is over and should stop taking turns; the agent says its own farewell and the record is finished, and the id stops working afterwards.

Close Conversation › path Parameters

interaction_id
​string · uuid · required

Close Conversation › Responses

Successful Response

A conversation that has said goodbye. The farewell is the agent's own, from its published set — nothing here invents a parting sentence.
ClosedConversation
farewell
​string · required
interaction_id
​string · uuid · required
POST/api/v1/text/conversations/{interaction_id}/close
curl /api/v1/text/conversations/:interaction_id/close \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "farewell": "farewell", "interaction_id": "00000000-0000-0000-0000-000000000000" }
json
application/json

Answer Confirmation

POST
/api/v1/text/conversations/{interaction_id}/confirmations/{request_id}

Answer a question the agent asked, and watch it finish what it started. Use only in response to a confirmation request the agent raised mid-turn.

An action with a consequence outside a draft is put to you as a question and happens on your yes. This is the yes — or the no — and the reply is the rest of the turn the question interrupted, streamed exactly like a message: one frame per event as it is recorded, ending in end or error.

On confirmed the tool runs with the arguments the request showed you, and the agent answers with what it returned. On declined nothing runs, no tool call appears in the record, and the agent answers anyway — you are told what was not done rather than left with a stream that goes quiet.

A question can only be answered once. A second answer to the same request is a 404, whichever way it was answered the first time, because the answer that won is already in the trace.

Answer Confirmation › path Parameters

interaction_id
​string · uuid · required
request_id
​string · uuid · required

Answer Confirmation › Request Body

Yes or no to one question the agent asked. One field, and it is the whole of what a person may say here. The tool, its arguments and the request are all fixed by the question — a body that could adjust any of them would let the answer authorise something other than what was shown, which is precisely what the question exists to prevent.
ConfirmationAnswer
decision
​ConfirmationDecision · enum · required

How a person answered the question a consequential tool was put behind.

Two members and no third. There is no "expired" or "timed out": a conversation that ends with a question outstanding answers it DECLINED, because the thing the record has to be able to say is whether the action happened, and it did not. Inventing a member for why nobody said yes would put two answers in the one field a client reads to find out.

Enum values:
confirmed
declined

Answer Confirmation › Responses

The turn, as server-sent events, one frame per event as it is recorded. The frame name is the event's own type — utterance, tool_call, node_entered, navigation_blocked, turn_failed, confirmation_requested, confirmation_resolved — and its data is that event as the trace holds it, seq included. A confirmation_requested frame means the turn has stopped and is waiting: the agent will say nothing more until the request is answered. The stream ends in exactly one terminal frame: end when the whole turn was delivered, or error when it stopped short. The record is complete either way.

anyOf
At least one variant must match. Multiple variants may match simultaneously.

Decision Table

VariantMatching Criteria
type = object · requires: id, seq, type +1 more
type = object · requires: interaction_id
type = object · requires: interaction_id, detail
Properties for InteractionEventOut:
One row of the trace. Flat on purpose: a trace is read as a table, and the fields a type does not use are absent rather than shaped differently.
InteractionEventOut
id
​string · uuid · required
occurred_at
​string · date-time · required
seq
​integer · required
type
​EventType · enum · required

Everything a conversation can record about the path it walked.

Enum values:
node_entered
navigation_blocked
tool_call
utterance
turn_failed
tool_refused
confirmation_requested
confirmation_resolved
​
​
​
​
​
​
​
​
​
colleague
​boolean
Default: false
​
​
​
​
​
flow_act
​boolean
Default: false
​
​
held
​boolean
Default: false
​
​
​
​
overlapped
​boolean
Default: false
​
prepared_changed
​boolean
Default: false
​
returned_to_flow
​boolean
Default: false
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
unvoiced
​boolean
Default: false
​
​
​
​
​
POST/api/v1/text/conversations/{interaction_id}/confirmations/{request_id}
curl /api/v1/text/conversations/:interaction_id/confirmations/:request_id \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "decision": "confirmed" }'
Example Request Body
{ "decision": "confirmed" }
json
Example Responses
{ "actor_person_id": "00000000-0000-0000-0000-000000000000", "agent_id": "00000000-0000-0000-0000-000000000000", "agent_settings": { "ai_profile_id": "00000000-0000-0000-0000-000000000000", "arrangement_attempts": [], "arrangement_kind": "string", "arrangement_position": 0, "live_model": "string", "live_provider": "string", "live_resumptions": 0, "live_thinking": "string", "live_voice": "string", "llm_model": "string", "llm_provider": "string", "llm_thinking": "string", "standby_component": "llm", "stt_model": "string", "stt_provider": "string", "tts_provider": "string", "tts_voice": "string", "used_standby": false }, "agent_version_id": "00000000-0000-0000-0000-000000000000", "assignee_person_id": "00000000-0000-0000-0000-000000000000", "attachment": {}, "began_at": "2024-08-25T15:00:00Z", "blocked_hops": 0, "blocked_reason": "hop_limit", "colleague": false, "confirmation_decision": "confirmed", "confirmation_mode": "ask", "confirmation_person_id": "00000000-0000-0000-0000-000000000000", "confirmation_request_id": "00000000-0000-0000-0000-000000000000", "error": "string", "flow_act": false, "handoff_act": "handed_over", "handoff_reason_code": "kept_for_people", "held": false, "id": "00000000-0000-0000-0000-000000000000", "label_added": true, "label_id": "00000000-0000-0000-0000-000000000000", "mailbox_address": "string", "node_id": "00000000-0000-0000-0000-000000000000", "occurred_at": "2024-08-25T15:00:00Z", "overlapped": false, "prepared_by_agent_id": "00000000-0000-0000-0000-000000000000", "prepared_changed": false, "ref_id": "00000000-0000-0000-0000-000000000000", "returned_to_flow": false, "seq": 0, "speaker": "agent", "target_node_id": "00000000-0000-0000-0000-000000000000", "text": "string", "tool_arguments": {}, "tool_call_key": "00000000-0000-0000-0000-000000000000", "tool_connection_id": "00000000-0000-0000-0000-000000000000", "tool_fixed_parameters": [ "string" ], "tool_id": "00000000-0000-0000-0000-000000000000", "tool_name": "string", "tool_outcome": "ok", "tool_phase": "pre", "tool_result": {}, "tool_roster_entry_id": "00000000-0000-0000-0000-000000000000", "tool_version_id": "00000000-0000-0000-0000-000000000000", "turn_stages": { "dead_air_ms": 0, "eou_delay_ms": 0, "first_audio_ms": 0, "held_ms": 0, "model_ms": 0, "queue_ms": 0, "record_ms": 0, "think_ms": 0, "tools_ms": 0, "tts_ttfb_ms": 0 }, "type": "node_entered", "unvoiced": false, "usage_model": "string", "usage_provider": "string", "usage_resolved_model": "string", "usage_unit": "string", "usage_units": "string" }
text
text/event-stream

Get Sent File

GET
/api/v1/text/conversations/{interaction_id}/files/{file_id}

A signed link, good for 15 minutes, to a file sent on this conversation with a message, with its name, type and size. Use when a line of the conversation names a file (its ref_id) and you need the file itself; ask again for a fresh link once one expires. view=inline asks for a link that opens the file in place rather than saving it -- honoured for a JPEG, PNG, GIF or WebP image and a PDF; any other file is still a download. Works while the conversation is open and after it ends, for as long as retention keeps the file. Changes nothing. Answers 404 for a conversation you may not read, and for a file that is not kept (never kept, refused, or purged).

Get Sent File › path Parameters

interaction_id
​string · uuid · required
file_id
​string · uuid · required

Get Sent File › query Parameters

view
​string · enum
Enum values:
download
inline
Default: download

Get Sent File › Responses

Successful Response

A file sent on a text conversation, while retention keeps it (inbox.md, Conversation): a link signed for `SENT_FILE_URL_TTL`, and what the sender said of the file. `file_id` is the `ref_id` on the person's line it was sent with, which is how an inbox line finds its file -- a thread's `ContactFileOut.message_id` in this channel's words.
SentFileOut
file_id
​string · uuid · required
mime
​string · required
size_bytes
​integer · required
url
​string · required
​
​
GET/api/v1/text/conversations/{interaction_id}/files/{file_id}
curl /api/v1/text/conversations/:interaction_id/files/:file_id \ --header 'Authorization: Bearer <token>'
Example Responses
{ "file_id": "00000000-0000-0000-0000-000000000000", "filename": "string", "mime": "mime", "preview_url": "string", "size_bytes": 0, "url": "url" }
json
application/json

Send Message

POST
/api/v1/text/conversations/{interaction_id}/messages

Say something, and watch the agent answer. Use for every turn of an already-open conversation, after open_conversation.

Each event of the turn is framed the moment it has been recorded, so what arrives here is the trace being written rather than a report of it. Three things follow and all three are deliberate. An unknown or finished conversation is a plain 404, decided before the stream exists, rather than an error frame inside a response that already claimed to be a success. Disconnecting stops the reading and nothing else — the turn finishes and the record is complete, so reconnecting and sending again continues the same conversation. And a client that stops reading without disconnecting is dropped rather than allowed to hold up the recording; service.STREAM_BUFFER argues which side gives way.

The request's own session is not involved: a turn outlives the response that started it, so it opens one of its own.

A message may carry up to five attachments -- images or documents, base64, at most 8 MiB together -- with or without text; attachment is the one-file spelling, and a message sends one or the other. The agent reads each where its profile names a reader and its switches take the kind, as a description or as the document's contents, marked as such and in the order sent; a video, or a kind it does not take, is announced to it. Each file is kept for your retention window and purged with the conversation. Audio is refused (422) on this channel for now.

Send Message › path Parameters

interaction_id
​string · uuid · required

Send Message › Request Body

One thing the other side said: words, files, or both.
Message
​
​Attachment[] · maxItems: 5
text
​string · maxLength: 64000
Default:

Send Message › Responses

The turn, as server-sent events, one frame per event as it is recorded. The frame name is the event's own type — utterance, tool_call, node_entered, navigation_blocked, turn_failed, confirmation_requested, confirmation_resolved — and its data is that event as the trace holds it, seq included. A confirmation_requested frame means the turn has stopped and is waiting: the agent will say nothing more until the request is answered. The stream ends in exactly one terminal frame: end when the whole turn was delivered, or error when it stopped short. The record is complete either way.

anyOf
At least one variant must match. Multiple variants may match simultaneously.

Decision Table

VariantMatching Criteria
type = object · requires: id, seq, type +1 more
type = object · requires: interaction_id
type = object · requires: interaction_id, detail
Properties for InteractionEventOut:
One row of the trace. Flat on purpose: a trace is read as a table, and the fields a type does not use are absent rather than shaped differently.
InteractionEventOut
id
​string · uuid · required
occurred_at
​string · date-time · required
seq
​integer · required
type
​EventType · enum · required

Everything a conversation can record about the path it walked.

Enum values:
node_entered
navigation_blocked
tool_call
utterance
turn_failed
tool_refused
confirmation_requested
confirmation_resolved
​
​
​
​
​
​
​
​
​
colleague
​boolean
Default: false
​
​
​
​
​
flow_act
​boolean
Default: false
​
​
held
​boolean
Default: false
​
​
​
​
overlapped
​boolean
Default: false
​
prepared_changed
​boolean
Default: false
​
returned_to_flow
​boolean
Default: false
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
unvoiced
​boolean
Default: false
​
​
​
​
​
POST/api/v1/text/conversations/{interaction_id}/messages
curl /api/v1/text/conversations/:interaction_id/messages \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "attachment": { "data": "data", "filename": "filename", "mime": "mime" }, "attachments": [ { "data": "data", "filename": "filename", "mime": "mime" } ], "text": "" }'
Example Request Body
{ "attachment": { "data": "data", "filename": "filename", "mime": "mime" }, "attachments": [ { "data": "data", "filename": "filename", "mime": "mime" } ], "text": "" }
json
Example Responses
{ "actor_person_id": "00000000-0000-0000-0000-000000000000", "agent_id": "00000000-0000-0000-0000-000000000000", "agent_settings": { "ai_profile_id": "00000000-0000-0000-0000-000000000000", "arrangement_attempts": [], "arrangement_kind": "string", "arrangement_position": 0, "live_model": "string", "live_provider": "string", "live_resumptions": 0, "live_thinking": "string", "live_voice": "string", "llm_model": "string", "llm_provider": "string", "llm_thinking": "string", "standby_component": "llm", "stt_model": "string", "stt_provider": "string", "tts_provider": "string", "tts_voice": "string", "used_standby": false }, "agent_version_id": "00000000-0000-0000-0000-000000000000", "assignee_person_id": "00000000-0000-0000-0000-000000000000", "attachment": {}, "began_at": "2024-08-25T15:00:00Z", "blocked_hops": 0, "blocked_reason": "hop_limit", "colleague": false, "confirmation_decision": "confirmed", "confirmation_mode": "ask", "confirmation_person_id": "00000000-0000-0000-0000-000000000000", "confirmation_request_id": "00000000-0000-0000-0000-000000000000", "error": "string", "flow_act": false, "handoff_act": "handed_over", "handoff_reason_code": "kept_for_people", "held": false, "id": "00000000-0000-0000-0000-000000000000", "label_added": true, "label_id": "00000000-0000-0000-0000-000000000000", "mailbox_address": "string", "node_id": "00000000-0000-0000-0000-000000000000", "occurred_at": "2024-08-25T15:00:00Z", "overlapped": false, "prepared_by_agent_id": "00000000-0000-0000-0000-000000000000", "prepared_changed": false, "ref_id": "00000000-0000-0000-0000-000000000000", "returned_to_flow": false, "seq": 0, "speaker": "agent", "target_node_id": "00000000-0000-0000-0000-000000000000", "text": "string", "tool_arguments": {}, "tool_call_key": "00000000-0000-0000-0000-000000000000", "tool_connection_id": "00000000-0000-0000-0000-000000000000", "tool_fixed_parameters": [ "string" ], "tool_id": "00000000-0000-0000-0000-000000000000", "tool_name": "string", "tool_outcome": "ok", "tool_phase": "pre", "tool_result": {}, "tool_roster_entry_id": "00000000-0000-0000-0000-000000000000", "tool_version_id": "00000000-0000-0000-0000-000000000000", "turn_stages": { "dead_air_ms": 0, "eou_delay_ms": 0, "first_audio_ms": 0, "held_ms": 0, "model_ms": 0, "queue_ms": 0, "record_ms": 0, "think_ms": 0, "tools_ms": 0, "tts_ttfb_ms": 0 }, "type": "node_entered", "unvoiced": false, "usage_model": "string", "usage_provider": "string", "usage_resolved_model": "string", "usage_unit": "string", "usage_units": "string" }
text
text/event-stream

Set Mode

PATCH
/api/v1/text/conversations/{interaction_id}/mode

Tell this conversation to stop asking, or to start asking again. Use when the caller wants consequential actions to run without a confirmation request, or wants to turn that confirmation back on.

auto proceeds without the question from here on; ask is the default and puts every consequential action to you. It belongs to this conversation and to nothing else — not to you, not to your organization — so the next one you open starts by asking again unless you say otherwise.

The switch is recorded whichever way it goes. Turning the questions off turns off the asking and never the recording, and the record is where you find out what was done.

A question already on your screen stays there: this changes what happens to the next action, and does not answer the one you are looking at.

Set Mode › path Parameters

interaction_id
​string · uuid · required

Set Mode › Request Body

Stop asking, or start again.
ModeUpdate
mode
​ConfirmationMode · enum · required

Whether one conversation is still asking before consequential actions.

architect.md rule 20: "a person may tell one conversation to stop asking… It is a property of that conversation only — not of the person or the organization — and asking is always where a conversation starts."

It is a column vocabulary here and an input to the run-loop there, which is the same two-names split Channel has and for the same reason: this one is what the record says a conversation was set to, and that one is what decides whether the loop stops. Member for member, so a writer maps with interactions.ConfirmationMode(mode) and needs no table.

Enum values:
ask
auto

Set Mode › Responses

Successful Response

What a conversation is set to now. The mode is not readable anywhere else: it belongs to the live conversation and there is no row behind it. This is what the switch answers with, and it is the current state rather than a receipt for the change.
ConversationMode
interaction_id
​string · uuid · required
mode
​ConfirmationMode · enum · required

Whether one conversation is still asking before consequential actions.

architect.md rule 20: "a person may tell one conversation to stop asking… It is a property of that conversation only — not of the person or the organization — and asking is always where a conversation starts."

It is a column vocabulary here and an input to the run-loop there, which is the same two-names split Channel has and for the same reason: this one is what the record says a conversation was set to, and that one is what decides whether the loop stops. Member for member, so a writer maps with interactions.ConfirmationMode(mode) and needs no table.

Enum values:
ask
auto
PATCH/api/v1/text/conversations/{interaction_id}/mode
curl /api/v1/text/conversations/:interaction_id/mode \ --request PATCH \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "mode": "ask" }'
Example Request Body
{ "mode": "ask" }
json
Example Responses
{ "interaction_id": "00000000-0000-0000-0000-000000000000", "mode": "ask" }
json
application/json

data-retentiontools