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

channels


List Channels

GET
/api/v1/channels

Every channel this organization has connected. Use when showing what is already connected, or checking before adding another; pass connection_id to ask what answers on one connection (none, or the one channel it carries). Changes nothing.

List Channels › query Parameters

connection_id
​

List Channels › Responses

Successful Response

​ChannelOut[]
ChannelOut
​required
audience
​backend__features__messaging__schemas__Audience · enum · required

Who writes on a connection (channels.md rule 50): the organization's own members, or its contacts -- people outside it. A road declares which it can carry (rule 51); a connection names one of those. Not notifications' Audience, which is who a notice is for: same word, another question.

Enum values:
members
contacts
burst_window_seconds
​integer · required
connection_id
​string · uuid · required
created_at
​string · date-time · required
enabled
​boolean · required
flow_id
​string · uuid · required
hands_to_agent
​boolean · required
id
​string · uuid · required
inbox_off
​boolean · required
name
​string · required
org_id
​string · uuid · required
owns_flow
​boolean · required
updated_at
​string · date-time · required
agent_cannot_write
​boolean
Default: false
​
​
​
​
GET/api/v1/channels
curl /api/v1/channels \ --header 'Authorization: Bearer <token>'
Example Responses
[ { "agent_cannot_write": false, "agent_id": "00000000-0000-0000-0000-000000000000", "answered_by": { "install_id": "00000000-0000-0000-0000-000000000000", "recipe_key": "recipe_key" }, "audience": "members", "burst_window_seconds": 0, "connection_id": "00000000-0000-0000-0000-000000000000", "created_at": "2024-08-25T15:00:00Z", "enabled": true, "flow_id": "00000000-0000-0000-0000-000000000000", "hands_to_agent": true, "id": "00000000-0000-0000-0000-000000000000", "inbox_off": true, "name": "name", "org_id": "00000000-0000-0000-0000-000000000000", "owns_flow": true, "reach_entries": [ "string" ], "reach_mode": "everyone", "reply_mode": "send", "updated_at": "2024-08-25T15:00:00Z" } ]
json
application/json

Create Channel

POST
/api/v1/channels

Connect an account to what answers on it: a flow, or an agent. Use when a new messaging account should start answering through the platform.

Pass flow_id for a flow you drew, or agent_id to have the platform write the one-step flow that hands every message to that agent — one of the two, never both. The flow is editable from the moment it exists. An agent or a flow that is not yours is 404, checked before anything is written.

Create Channel › Request Body

Create a channel: a connection, a name, and exactly one of an agent or a flow. `agent_id` is the short spelling of `flow_id` — the platform writes the one-step flow behind it — and passing both, or neither, is refused. `audience` is who writes on it (rule 50): one the connection's road declares (rule 51). Left out, it is the road's only one, or contacts on a road that carries both.
ChannelIn
connection_id
​string · uuid · required
name
​string · minLength: 1 · maxLength: 200 · required
​
​
​
​
​
​
​

Create Channel › Responses

Successful Response

ChannelOut
​required
audience
​backend__features__messaging__schemas__Audience · enum · required

Who writes on a connection (channels.md rule 50): the organization's own members, or its contacts -- people outside it. A road declares which it can carry (rule 51); a connection names one of those. Not notifications' Audience, which is who a notice is for: same word, another question.

Enum values:
members
contacts
burst_window_seconds
​integer · required
connection_id
​string · uuid · required
created_at
​string · date-time · required
enabled
​boolean · required
flow_id
​string · uuid · required
hands_to_agent
​boolean · required
id
​string · uuid · required
inbox_off
​boolean · required
name
​string · required
org_id
​string · uuid · required
owns_flow
​boolean · required
updated_at
​string · date-time · required
agent_cannot_write
​boolean
Default: false
​
​
​
​
POST/api/v1/channels
curl /api/v1/channels \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "agent_id": "00000000-0000-0000-0000-000000000000", "audience": "members", "burst_window_seconds": 0, "connection_id": "00000000-0000-0000-0000-000000000000", "flow_id": "00000000-0000-0000-0000-000000000000", "name": "name", "reach_entries": [ "string" ], "reach_mode": "everyone", "reply_mode": "send" }'
Example Request Body
{ "agent_id": "00000000-0000-0000-0000-000000000000", "audience": "members", "burst_window_seconds": 0, "connection_id": "00000000-0000-0000-0000-000000000000", "flow_id": "00000000-0000-0000-0000-000000000000", "name": "name", "reach_entries": [ "string" ], "reach_mode": "everyone", "reply_mode": "send" }
json
Example Responses
{ "agent_cannot_write": false, "agent_id": "00000000-0000-0000-0000-000000000000", "answered_by": { "install_id": "00000000-0000-0000-0000-000000000000", "recipe_key": "recipe_key" }, "audience": "members", "burst_window_seconds": 0, "connection_id": "00000000-0000-0000-0000-000000000000", "created_at": "2024-08-25T15:00:00Z", "enabled": true, "flow_id": "00000000-0000-0000-0000-000000000000", "hands_to_agent": true, "id": "00000000-0000-0000-0000-000000000000", "inbox_off": true, "name": "name", "org_id": "00000000-0000-0000-0000-000000000000", "owns_flow": true, "reach_entries": [ "string" ], "reach_mode": "everyone", "reply_mode": "send", "updated_at": "2024-08-25T15:00:00Z" }
json
application/json

List Thread Subjects

GET
/api/v1/channels/threads/subjects

List the latest subject of each email thread you name: the subject of its newest message that carries one, received or sent. Use to show what each email thread in a list is about now, since one customer may have several email threads open at once. Name each conversation as interaction_id, at most 100. A conversation that is not an email thread, has no subject, or that you may not read is left out. Changes nothing.

List Thread Subjects › query Parameters

interaction_id
​string[] · minItems: 1 · maxItems: 100 · required

List Thread Subjects › Responses

Successful Response

​ThreadSubjectOut[]
An email thread's latest subject (inbox.md rule 35): the subject of its newest message that carries one, received or sent, and when that message was. What the inbox row shows beside its latest line, because one counterpart may have several email threads open at once.
ThreadSubjectOut
at
​string · date-time · required
interaction_id
​string · uuid · required
subject
​string · required
GET/api/v1/channels/threads/subjects
curl '/api/v1/channels/threads/subjects?interaction_id=<value>' \ --header 'Authorization: Bearer <token>'
Example Responses
[ { "at": "2024-08-25T15:00:00Z", "interaction_id": "00000000-0000-0000-0000-000000000000", "subject": "subject" } ]
json
application/json

Close Channel Thread

POST
/api/v1/channels/threads/{interaction_id}/close

End a thread. Use when a conversation on a channel is finished and should close rather than wait indefinitely. The next message from that contact opens a new one, with this one still in the log — and everything that happens when a conversation ends happens now, which on a thread nobody ever closes never happens at all.

Answers 409 while a turn is running on it, and while a person has it. A thread waiting for a person has no holder yet: take it first, and the holder closes it from the inbox. A thread you may not read answers 404, as one that does not exist.

Close Channel Thread › path Parameters

interaction_id
​string · uuid · required

Close Channel Thread › Responses

Successful Response

No data returned
POST/api/v1/channels/threads/{interaction_id}/close
curl /api/v1/channels/threads/:interaction_id/close \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
No example specified for this content type

List Thread Decisions

GET
/api/v1/channels/threads/{interaction_id}/decisions

List why each message of a thread was answered, kept for review, acted on, handed to a person or left alone: the outcome the thread flow declared, what it did, the questions its reading steps answered, the flow and the models -- or the platform's rule when no flow ran. Use to show the decision next to the contact's line whose ref_id is message_id. Changes nothing. Answers 404 for a conversation you may not read.

List Thread Decisions › path Parameters

interaction_id
​string · uuid · required

List Thread Decisions › Responses

Successful Response

​DecisionOut[]
A decision record (mail-handling.md rules 7-9), on the counterpart's message `message_id` names -- the `ref_id` of its line on the conversation. `outcome`, `acts`, `flow_id`, `models`, `failed` and `rule` are facts kept through the retention purge; `reason` is content and is `None` once purged, as `failure` is. `rule` is set, and nothing else is, for a burst that ran no flow (rule 8). `models` is the model each reading step read with, in order, `None` for the platform's own reading model.
DecisionOut
​DecisionAct[] · required
decided_at
​string · date-time · required
failed
​boolean · required
​required
​required
id
​string · uuid · required
interaction_id
​string · uuid · required
message_id
​string · uuid · required
​array · required
​required
​required
​required
GET/api/v1/channels/threads/{interaction_id}/decisions
curl /api/v1/channels/threads/:interaction_id/decisions \ --header 'Authorization: Bearer <token>'
Example Responses
[ { "acts": [ { "delivered": false, "held": false, "kept": false, "labels": [ "string" ], "ok": true, "tool": "tool" } ], "decided_at": "2024-08-25T15:00:00Z", "failed": true, "failure": "string", "flow_id": "00000000-0000-0000-0000-000000000000", "id": "00000000-0000-0000-0000-000000000000", "interaction_id": "00000000-0000-0000-0000-000000000000", "message_id": "00000000-0000-0000-0000-000000000000", "models": [ "string" ], "outcome": "answer", "reason": [ { "answer": {}, "question": "question" } ], "rule": "marked" } ]
json
application/json

Get Thread Contact File

GET
/api/v1/channels/threads/{interaction_id}/files/{message_id}

A signed link, good for 15 minutes, to a file the contact sent on this conversation, with its name, type and size. Use when a thread's transcript names a file and you need the file itself; ask again for a fresh link once one expires. The inbox asks when the reader opens the file, not before. 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. Changes nothing. Answers 404 for a conversation you may not read, and for a message whose file is not kept (never kept, refused, or purged).

Get Thread Contact File › path Parameters

interaction_id
​string · uuid · required
message_id
​string · uuid · required

Get Thread Contact File › query Parameters

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

Get Thread Contact File › Responses

Successful Response

A file a contact sent, while retention keeps it (inbox.md, Conversation): a signed link good for `CONTACT_FILE_URL_TTL`, and what the road said of the file. `message_id` is the `ref_id` on the record's placeholder utterance, which is how an inbox line finds its file.
ContactFileOut
message_id
​string · uuid · required
size_bytes
​integer · required
url
​string · required
​
​
​
GET/api/v1/channels/threads/{interaction_id}/files/{message_id}
curl /api/v1/channels/threads/:interaction_id/files/:message_id \ --header 'Authorization: Bearer <token>'
Example Responses
{ "filename": "string", "message_id": "00000000-0000-0000-0000-000000000000", "mime": "string", "preview_url": "string", "size_bytes": 0, "url": "url" }
json
application/json

Hand Thread To Agent

POST
/api/v1/channels/threads/{interaction_id}/hand-to-agent

Give a thread to an agent and take one turn, as a branch of a flow would. Use when a person-held or flow-held thread should be handed to an agent to continue.

The same verb the hand_to_agent built-in runs, over the same code: the agent is attached from this point on, it answers with the thread's transcript in view, and what it said goes back to the contact unless you ask for it not to -- or, on a connection that prepares replies for review, is kept as the thread's prepared reply for a person to send. context is what you know about this contact, shown to the agent as information about who it is talking to and never as words they said. Refused with 409 while the thread is with a person, and with 422 for an agent on a voice profile, which answers calls only. A thread you may not read answers 404, as one that does not exist.

Hand Thread To Agent › path Parameters

interaction_id
​string · uuid · required

Hand Thread To Agent › Request Body

Hand a thread to an agent from outside a flow — an operator's door onto the same built-in, for testing and for ops.
HandToAgentIn
agent_id
​string · uuid · required
text
​string · minLength: 1 · required
​
deliver
​boolean
Default: true

Hand Thread To Agent › Responses

Successful Response

What a hand-over answers with: what the agent said, and whether it left -- or was `kept` as the thread's prepared reply, `held` when the connection's reply mode kept what the step's own mode would have sent (mail-handling.md rules 2 and 4).
HandedOverOut
agent_id
​string · uuid · required
delivered
​boolean · required
interaction_id
​string · uuid · required
said
​string[] · required
held
​boolean
Default: false
kept
​boolean
Default: false
POST/api/v1/channels/threads/{interaction_id}/hand-to-agent
curl /api/v1/channels/threads/:interaction_id/hand-to-agent \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "agent_id": "00000000-0000-0000-0000-000000000000", "context": "string", "deliver": true, "text": "text" }'
Example Request Body
{ "agent_id": "00000000-0000-0000-0000-000000000000", "context": "string", "deliver": true, "text": "text" }
json
Example Responses
{ "agent_id": "00000000-0000-0000-0000-000000000000", "delivered": true, "held": false, "interaction_id": "00000000-0000-0000-0000-000000000000", "kept": false, "said": [ "string" ] }
json
application/json

List Thread Mail

GET
/api/v1/channels/threads/{interaction_id}/mail

List what an email thread keeps beside each message's words: its subject, whom it was copied to, and its mark (sent automatically, spam, or a sender its domain does not vouch for). Use to show a mail's subject and copies next to the contact's line whose ref_id is message_id. Changes nothing. Answers 404 for a conversation you may not read; empty on a WhatsApp thread.

List Thread Mail › path Parameters

interaction_id
​string · uuid · required

List Thread Mail › Responses

Successful Response

​MailLineOut[]
What an email thread keeps beside one message's words (inbox.md rule 35, email-threads.md rules 7-8, channels.md rule 88): its subject and whom it was copied to, kept apart from its text, and the road's mark. `message_id` is the `ref_id` of the contact's line it belongs to on the conversation.
MailLineOut
copied_to
​string[] · required
​required
message_id
​string · uuid · required
received_at
​string · date-time · required
​required
GET/api/v1/channels/threads/{interaction_id}/mail
curl /api/v1/channels/threads/:interaction_id/mail \ --header 'Authorization: Bearer <token>'
Example Responses
[ { "copied_to": [ "string" ], "mark": "machine", "message_id": "00000000-0000-0000-0000-000000000000", "received_at": "2024-08-25T15:00:00Z", "subject": "string" } ]
json
application/json

Get Prepared Reply

GET
/api/v1/channels/threads/{interaction_id}/prepared-reply

Read the reply an agent prepared on this thread for a person to review: its text (or template), the agent, the message it answers and whether it is ready or outdated -- the contact wrote again after it. 404 when nothing is prepared. Takes nothing.

Get Prepared Reply › path Parameters

interaction_id
​string · uuid · required

Get Prepared Reply › Responses

Successful Response

A thread's prepared reply (handoff.md rules 32-37): what an agent's turn wrote and nobody has sent, bound to the counterpart's message it answers. Exactly one of `text` and `template` -- the agent's reply with a template (rule 67) is kept as the template -- until retention empties both; the rest names nobody and stays. `handed_over` is whether the turn that prepared it also handed the thread to a person (rule 40): sending it then leaves the thread as that hand-over left it.
PreparedReplyOut
​required
​required
​required
handed_over
​boolean · required
id
​string · uuid · required
interaction_id
​string · uuid · required
​required
prepared_at
​string · date-time · required
state
​PreparedState · enum · required

Where a conversation's prepared reply stands (handoff.md rule 33): ready to send as it is, or outdated because the counterpart wrote again unmarked after the message it answers, or a reply was sent from the mailbox itself (PreparedOutdatedBy says which) -- sent then only with the text a person gives (rule 34). It never expires. None on the record when it holds none.

A native PostgreSQL enum (interaction_prepared_state).

Enum values:
ready
outdated
​required
​required
burst
​string[]
​
​
GET/api/v1/channels/threads/{interaction_id}/prepared-reply
curl /api/v1/channels/threads/:interaction_id/prepared-reply \ --header 'Authorization: Bearer <token>'
Example Responses
{ "agent_id": "00000000-0000-0000-0000-000000000000", "answers_at": "2024-08-25T15:00:00Z", "answers_message_id": "00000000-0000-0000-0000-000000000000", "burst": [ "00000000-0000-0000-0000-000000000000" ], "handed_over": true, "id": "00000000-0000-0000-0000-000000000000", "interaction_id": "00000000-0000-0000-0000-000000000000", "mailbox_draft": "writing", "outdated_at": "2024-08-25T15:00:00Z", "outdated_by": "contact", "prepared_at": "2024-08-25T15:00:00Z", "state": "ready", "template": { "button_payloads": [ "string" ], "language": "language", "name": "name", "variables": [ "string" ] }, "text": "string" }
json
application/json

Ask Again For Prepared Reply

POST
/api/v1/channels/threads/{interaction_id}/prepared-reply/ask-again

Ask the agent for its prepared reply again: the current one is discarded and the agent that wrote it takes one more turn over the messages nobody answered, preparing another -- no other step of the channel's flow runs. Answers the new prepared reply, or null when the agent said nothing. Charged as an agent turn; 402 when the organization's balance is spent, 404 when nothing is prepared, 409 while another person holds the thread.

Ask Again For Prepared Reply › path Parameters

interaction_id
​string · uuid · required

Ask Again For Prepared Reply › Responses

Successful Response

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

Decision Table

VariantMatching Criteria
type = object · requires: id, interaction_id, state +8 more
type = null
Properties for PreparedReplyOut:
A thread's prepared reply (handoff.md rules 32-37): what an agent's turn wrote and nobody has sent, bound to the counterpart's message it answers. Exactly one of `text` and `template` -- the agent's reply with a template (rule 67) is kept as the template -- until retention empties both; the rest names nobody and stays. `handed_over` is whether the turn that prepared it also handed the thread to a person (rule 40): sending it then leaves the thread as that hand-over left it.
PreparedReplyOut
​required
​required
​required
handed_over
​boolean · required
id
​string · uuid · required
interaction_id
​string · uuid · required
​required
prepared_at
​string · date-time · required
state
​PreparedState · enum · required

Where a conversation's prepared reply stands (handoff.md rule 33): ready to send as it is, or outdated because the counterpart wrote again unmarked after the message it answers, or a reply was sent from the mailbox itself (PreparedOutdatedBy says which) -- sent then only with the text a person gives (rule 34). It never expires. None on the record when it holds none.

A native PostgreSQL enum (interaction_prepared_state).

Enum values:
ready
outdated
​required
​required
burst
​string[]
​
​
POST/api/v1/channels/threads/{interaction_id}/prepared-reply/ask-again
curl /api/v1/channels/threads/:interaction_id/prepared-reply/ask-again \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "agent_id": "00000000-0000-0000-0000-000000000000", "answers_at": "2024-08-25T15:00:00Z", "answers_message_id": "00000000-0000-0000-0000-000000000000", "burst": [ "00000000-0000-0000-0000-000000000000" ], "handed_over": true, "id": "00000000-0000-0000-0000-000000000000", "interaction_id": "00000000-0000-0000-0000-000000000000", "mailbox_draft": "writing", "outdated_at": "2024-08-25T15:00:00Z", "outdated_by": "contact", "prepared_at": "2024-08-25T15:00:00Z", "state": "ready", "template": { "button_payloads": [ "string" ], "language": "language", "name": "name", "variables": [ "string" ] }, "text": "string" }
json
application/json

Discard Prepared Reply

POST
/api/v1/channels/threads/{interaction_id}/prepared-reply/discard

Discard the reply an agent prepared on this thread, answering what it was. The thread keeps waiting for a person with nothing prepared; writing your own reply then takes it. 404 when nothing is prepared, 409 while another person holds the thread.

Discard Prepared Reply › path Parameters

interaction_id
​string · uuid · required

Discard Prepared Reply › Responses

Successful Response

A thread's prepared reply (handoff.md rules 32-37): what an agent's turn wrote and nobody has sent, bound to the counterpart's message it answers. Exactly one of `text` and `template` -- the agent's reply with a template (rule 67) is kept as the template -- until retention empties both; the rest names nobody and stays. `handed_over` is whether the turn that prepared it also handed the thread to a person (rule 40): sending it then leaves the thread as that hand-over left it.
PreparedReplyOut
​required
​required
​required
handed_over
​boolean · required
id
​string · uuid · required
interaction_id
​string · uuid · required
​required
prepared_at
​string · date-time · required
state
​PreparedState · enum · required

Where a conversation's prepared reply stands (handoff.md rule 33): ready to send as it is, or outdated because the counterpart wrote again unmarked after the message it answers, or a reply was sent from the mailbox itself (PreparedOutdatedBy says which) -- sent then only with the text a person gives (rule 34). It never expires. None on the record when it holds none.

A native PostgreSQL enum (interaction_prepared_state).

Enum values:
ready
outdated
​required
​required
burst
​string[]
​
​
POST/api/v1/channels/threads/{interaction_id}/prepared-reply/discard
curl /api/v1/channels/threads/:interaction_id/prepared-reply/discard \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "agent_id": "00000000-0000-0000-0000-000000000000", "answers_at": "2024-08-25T15:00:00Z", "answers_message_id": "00000000-0000-0000-0000-000000000000", "burst": [ "00000000-0000-0000-0000-000000000000" ], "handed_over": true, "id": "00000000-0000-0000-0000-000000000000", "interaction_id": "00000000-0000-0000-0000-000000000000", "mailbox_draft": "writing", "outdated_at": "2024-08-25T15:00:00Z", "outdated_by": "contact", "prepared_at": "2024-08-25T15:00:00Z", "state": "ready", "template": { "button_payloads": [ "string" ], "language": "language", "name": "name", "variables": [ "string" ] }, "text": "string" }
json
application/json

Send Prepared Reply

POST
/api/v1/channels/threads/{interaction_id}/prepared-reply/send

Send the reply an agent prepared on this thread, as it is or with text in its place. It goes as yours, marked as prepared by the agent, and the thread goes back to its agent -- unless the agent's own turn handed it to a person, which returned_to_flow says. Sending does not take the thread. An outdated reply is sent only with text (409 without). 409 while another person holds the thread or a turn is running, 404 when nothing is prepared, 402 when the organization's balance is spent. Counted as one message sent without a model.

Send Prepared Reply › path Parameters

interaction_id
​string · uuid · required

Send Prepared Reply › Request Body

Send a thread's prepared reply (handoff.md rule 34): as it is, or with `text` in its place -- the person's changed words, sent as theirs and marked as changed (rule 37). An outdated reply is sent only with `text`.
PreparedSendIn
​

Send Prepared Reply › Responses

Successful Response

What sending a prepared reply answers (handoff.md rule 34): the send, and whether the thread went back to its flow -- false only where the turn that prepared it also handed it to a person (rule 40).
PreparedSentOut
changed
​boolean · required
interaction_id
​string · uuid · required
returned_to_flow
​boolean · required
held
​boolean
Default: false
kept
​boolean
Default: false
​
POST/api/v1/channels/threads/{interaction_id}/prepared-reply/send
curl /api/v1/channels/threads/:interaction_id/prepared-reply/send \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "text": "string" }'
Example Request Body
{ "text": "string" }
json
Example Responses
{ "changed": true, "held": false, "interaction_id": "00000000-0000-0000-0000-000000000000", "kept": false, "message_id": "string", "returned_to_flow": true }
json
application/json

Reply On Channel Thread

POST
/api/v1/channels/threads/{interaction_id}/reply

Answer on a thread yourself: free text, or an approved template. Use when a person, not the flow or an agent, should answer this thread directly.

What you send is on the thread as yours — a third speaker beside the contact and the agent — and replying to a thread nobody holds takes it: from then on its flow is silent and you answer it until you release it. The answer says so: took_thread is true when this reply took the thread, false when you already held it. Refused with 409 while another person holds it (naming them; writing never takes a thread over) or while a turn is running on it, and with 402 when the organization's balance is spent, which takes nothing. Counted as a message sent without a model.

Free text — with choices, if any, as buttons or numbered options — goes only while the road lets the organization speak freely: past the official API's window it is refused with 409 before anything is taken or written, and the body says what would go instead (instead) and when free text stopped (free_text_until). A template goes whatever the window.

attachment sends one file by its public https link, with text as its caption -- free text for the window -- and is on the thread as your line with the link after your words.

Reply On Channel Thread › path Parameters

interaction_id
​string · uuid · required

Reply On Channel Thread › Request Body

What one outgoing message is: free text, an attachment, or both -- the text then its caption -- **or** an approved template. Exactly one of a template and the rest, and the refusal for both or neither is the service's — a template with a line of text beside it is two messages asked for as one, and the provider would send whichever the builder happened to read first. `choices` go under free text: as reply buttons where the road shows them, as numbered text where it does not (rule 62) or where an attachment carries the text as its caption (rule 79), and a reply naming one by its number or label then arrives as its payload (rule 63).
OutboundIn
​
​ChoiceIn[] · maxItems: 10
​
​

Reply On Channel Thread › Responses

Successful Response

What a person's reply answers with: what any send does (`channels.SentOut`), and whether this answer took the thread (handoff.md rule 7). `took_thread` is true when nobody held the thread and this reply made its sender the holder: from then on the agent stays silent until they release it. False when the sender already held it. It is the server's word for what the inbox tells the sender with that answer, so a caller through the API is told the same thing.
ReplyOut
interaction_id
​string · uuid · required
took_thread
​boolean · required
held
​boolean
Default: false
kept
​boolean
Default: false
​
POST/api/v1/channels/threads/{interaction_id}/reply
curl /api/v1/channels/threads/:interaction_id/reply \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "attachment": { "filename": "string", "kind": "image", "mime": "string", "size_bytes": 1, "url": "url" }, "choices": [ { "label": "label", "payload": "string" } ], "template": { "button_payloads": [ "string" ], "language": "language", "name": "name", "variables": [ "string" ] }, "text": "string" }'
Example Request Body
{ "attachment": { "filename": "string", "kind": "image", "mime": "string", "size_bytes": 1, "url": "url" }, "choices": [ { "label": "label", "payload": "string" } ], "template": { "button_payloads": [ "string" ], "language": "language", "name": "name", "variables": [ "string" ] }, "text": "string" }
json
Example Responses
{ "held": false, "interaction_id": "00000000-0000-0000-0000-000000000000", "kept": false, "message_id": "string", "took_thread": true }
json
application/json

Get Channel

GET
/api/v1/channels/{channel_id}

One channel: the account it speaks through and the flow that answers. Use when opening a specific channel by id. Changes nothing.

Get Channel › path Parameters

channel_id
​string · uuid · required

Get Channel › Responses

Successful Response

ChannelOut
​required
audience
​backend__features__messaging__schemas__Audience · enum · required

Who writes on a connection (channels.md rule 50): the organization's own members, or its contacts -- people outside it. A road declares which it can carry (rule 51); a connection names one of those. Not notifications' Audience, which is who a notice is for: same word, another question.

Enum values:
members
contacts
burst_window_seconds
​integer · required
connection_id
​string · uuid · required
created_at
​string · date-time · required
enabled
​boolean · required
flow_id
​string · uuid · required
hands_to_agent
​boolean · required
id
​string · uuid · required
inbox_off
​boolean · required
name
​string · required
org_id
​string · uuid · required
owns_flow
​boolean · required
updated_at
​string · date-time · required
agent_cannot_write
​boolean
Default: false
​
​
​
​
GET/api/v1/channels/{channel_id}
curl /api/v1/channels/:channel_id \ --header 'Authorization: Bearer <token>'
Example Responses
{ "agent_cannot_write": false, "agent_id": "00000000-0000-0000-0000-000000000000", "answered_by": { "install_id": "00000000-0000-0000-0000-000000000000", "recipe_key": "recipe_key" }, "audience": "members", "burst_window_seconds": 0, "connection_id": "00000000-0000-0000-0000-000000000000", "created_at": "2024-08-25T15:00:00Z", "enabled": true, "flow_id": "00000000-0000-0000-0000-000000000000", "hands_to_agent": true, "id": "00000000-0000-0000-0000-000000000000", "inbox_off": true, "name": "name", "org_id": "00000000-0000-0000-0000-000000000000", "owns_flow": true, "reach_entries": [ "string" ], "reach_mode": "everyone", "reply_mode": "send", "updated_at": "2024-08-25T15:00:00Z" }
json
application/json

Delete Channel

DELETE
/api/v1/channels/{channel_id}

Stop answering on this account. Use when a channel should stop existing entirely, not just stop responding — use update_channel to merely switch it off. Conversations already on it stay in the log; nothing is closed and nothing is refused.

Answers 409 while a turn is still running on one of its threads: that turn finishes, and the same call then succeeds.

Delete Channel › path Parameters

channel_id
​string · uuid · required

Delete Channel › Responses

Successful Response

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

Update Channel

PATCH
/api/v1/channels/{channel_id}

Rename a channel, change how long it waits for the next message, or switch it off. Use when a channel's own settings need to change — only the fields given. A channel that is off still records what arrives; it runs nothing.

Update Channel › path Parameters

channel_id
​string · uuid · required

Update Channel › Request Body

Partial edit — only the fields set change. The connection and the flow are deliberately absent: either is a different channel, not an edit to this one.
ChannelUpdate
​
​
​
​
​
​
​

Update Channel › Responses

Successful Response

ChannelOut
​required
audience
​backend__features__messaging__schemas__Audience · enum · required

Who writes on a connection (channels.md rule 50): the organization's own members, or its contacts -- people outside it. A road declares which it can carry (rule 51); a connection names one of those. Not notifications' Audience, which is who a notice is for: same word, another question.

Enum values:
members
contacts
burst_window_seconds
​integer · required
connection_id
​string · uuid · required
created_at
​string · date-time · required
enabled
​boolean · required
flow_id
​string · uuid · required
hands_to_agent
​boolean · required
id
​string · uuid · required
inbox_off
​boolean · required
name
​string · required
org_id
​string · uuid · required
owns_flow
​boolean · required
updated_at
​string · date-time · required
agent_cannot_write
​boolean
Default: false
​
​
​
​
PATCH/api/v1/channels/{channel_id}
curl /api/v1/channels/:channel_id \ --request PATCH \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "audience": "members", "burst_window_seconds": 0, "enabled": true, "name": "string", "reach_entries": [ "string" ], "reach_mode": "everyone", "reply_mode": "send" }'
Example Request Body
{ "audience": "members", "burst_window_seconds": 0, "enabled": true, "name": "string", "reach_entries": [ "string" ], "reach_mode": "everyone", "reply_mode": "send" }
json
Example Responses
{ "agent_cannot_write": false, "agent_id": "00000000-0000-0000-0000-000000000000", "answered_by": { "install_id": "00000000-0000-0000-0000-000000000000", "recipe_key": "recipe_key" }, "audience": "members", "burst_window_seconds": 0, "connection_id": "00000000-0000-0000-0000-000000000000", "created_at": "2024-08-25T15:00:00Z", "enabled": true, "flow_id": "00000000-0000-0000-0000-000000000000", "hands_to_agent": true, "id": "00000000-0000-0000-0000-000000000000", "inbox_off": true, "name": "name", "org_id": "00000000-0000-0000-0000-000000000000", "owns_flow": true, "reach_entries": [ "string" ], "reach_mode": "everyone", "reply_mode": "send", "updated_at": "2024-08-25T15:00:00Z" }
json
application/json

Send On Channel

POST
/api/v1/channels/{channel_id}/send

Write to somebody on this channel who has not written to you. Use when the platform speaks first on a channel, as the organization — a person answering a thread from the inbox replies on the thread instead.

Opens the thread for that address if none is open and reuses the one that is; on an email connection it always starts a new conversation, and so a new thread, under the subject the connection's settings name. What a provider will carry outside its own window is the provider's rule: the official WhatsApp API refuses free text a day after the contact last wrote, and a template is the one message it accepts.

attachment sends one file by its public https link, with text as its caption; the platform never fetches it. A road refuses one larger than it declares for its kind, of a type it does not take, or an audio file with words; choices beside one go as numbered text in its caption.

Sending reads the thread it reaches: an address whose conversation you may not read answers 404, as a channel that does not exist, and nothing is sent.

Send On Channel › path Parameters

channel_id
​string · uuid · required

Send On Channel › Request Body

`OutboundIn` plus who it goes to, for the route that opens a conversation with somebody who has not written.
SendOnChannelIn
address
​string · minLength: 1 · maxLength: 200 · required
​
​ChoiceIn[] · maxItems: 10
​
​

Send On Channel › Responses

Successful Response

What a send answers with: the provider's own id for the message, when the road gives one, and the thread it landed on. `kept` when a flow's send was kept as the thread's prepared reply instead, and `held` when it was the connection's reply mode that kept it (mail-handling.md rule 4).
SentOut
interaction_id
​string · uuid · required
held
​boolean
Default: false
kept
​boolean
Default: false
​
POST/api/v1/channels/{channel_id}/send
curl /api/v1/channels/:channel_id/send \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "address": "address", "attachment": { "filename": "string", "kind": "image", "mime": "string", "size_bytes": 1, "url": "url" }, "choices": [ { "label": "label", "payload": "string" } ], "template": { "button_payloads": [ "string" ], "language": "language", "name": "name", "variables": [ "string" ] }, "text": "string" }'
Example Request Body
{ "address": "address", "attachment": { "filename": "string", "kind": "image", "mime": "string", "size_bytes": 1, "url": "url" }, "choices": [ { "label": "label", "payload": "string" } ], "template": { "button_payloads": [ "string" ], "language": "language", "name": "name", "variables": [ "string" ] }, "text": "string" }
json
Example Responses
{ "held": false, "interaction_id": "00000000-0000-0000-0000-000000000000", "kept": false, "message_id": "string" }
json
application/json

List Channel Threads

GET
/api/v1/channels/{channel_id}/threads

The channel's open conversations you may read — whose address, and which record. Use when showing a channel's live threads, before closing or handing one to an agent. Changes nothing. What was said on one is read from the interaction log like any other conversation.

List Channel Threads › path Parameters

channel_id
​string · uuid · required

List Channel Threads › Responses

Successful Response

​ThreadOut[]
One open thread of a channel. Everything that was *said* on it is read through `interactions` — this is the channel's own half: whose address, which record, and when they last wrote.
ThreadOut
address
​string · required
channel_id
​string · uuid · required
created_at
​string · date-time · required
id
​string · uuid · required
interaction_id
​string · uuid · required
​required
​
may_speak_freely
​boolean
Default: true
GET/api/v1/channels/{channel_id}/threads
curl /api/v1/channels/:channel_id/threads \ --header 'Authorization: Bearer <token>'
Example Responses
[ { "address": "address", "channel_id": "00000000-0000-0000-0000-000000000000", "created_at": "2024-08-25T15:00:00Z", "free_text_until": "2024-08-25T15:00:00Z", "id": "00000000-0000-0000-0000-000000000000", "interaction_id": "00000000-0000-0000-0000-000000000000", "last_inbound_at": "2024-08-25T15:00:00Z", "may_speak_freely": true } ]
json
application/json

List Roster

GET
/api/v1/roster

The people the organization vouches for. Use when showing the roster, or checking for an existing entry before creating another. Changes nothing. Owners and admins read every entry; a member reads their own.

List Roster › Responses

200

Successful Response

​RosterEntryOut[]
One person on the roster. `membership_id` is set for an entry linked to a membership -- its address on the app -- and such an entry comes and goes with the membership (rule 72). `resolves` is false while its person is deactivated: its addresses resolve to no one.
RosterEntryOut
​RosterAddressOut[] · required
display_name
​string · required
id
​string · uuid · required
​required
resolves
​boolean · required
GET/api/v1/roster
curl /api/v1/roster \ --header 'Authorization: Bearer <token>'
Example Responses
[ { "addresses": [ { "id": "00000000-0000-0000-0000-000000000000", "kind": "phone", "value": "value" } ], "display_name": "display_name", "id": "00000000-0000-0000-0000-000000000000", "membership_id": "00000000-0000-0000-0000-000000000000", "resolves": true } ]
json
application/json

Create Roster Entry

POST
/api/v1/roster

Vouch for somebody with no account: a name and the addresses they write from. Use when a person without a platform account should still be recognized by their addresses. Owners and admins only.

Create Roster Entry › Request Body

A person the organization vouches for who holds no account (rule 74): a name and at least one address.
RosterEntryIn
​RosterAddressIn[] · minItems: 1 · maxItems: 20 · required
display_name
​string · minLength: 1 · maxLength: 200 · required

Create Roster Entry › Responses

Successful Response

One person on the roster. `membership_id` is set for an entry linked to a membership -- its address on the app -- and such an entry comes and goes with the membership (rule 72). `resolves` is false while its person is deactivated: its addresses resolve to no one.
RosterEntryOut
​RosterAddressOut[] · required
display_name
​string · required
id
​string · uuid · required
​required
resolves
​boolean · required
POST/api/v1/roster
curl /api/v1/roster \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "addresses": [ { "kind": "phone", "value": "value" } ], "display_name": "display_name" }'
Example Request Body
{ "addresses": [ { "kind": "phone", "value": "value" } ], "display_name": "display_name" }
json
Example Responses
{ "addresses": [ { "id": "00000000-0000-0000-0000-000000000000", "kind": "phone", "value": "value" } ], "display_name": "display_name", "id": "00000000-0000-0000-0000-000000000000", "membership_id": "00000000-0000-0000-0000-000000000000", "resolves": true }
json
application/json

Get Own Roster Entry

GET
/api/v1/roster/me

Your own entry: the one linked to your membership, whatever your role. Use when the caller needs their own roster entry rather than a named one. Changes nothing. 404 when your membership has none.

Get Own Roster Entry › Responses

200

Successful Response

One person on the roster. `membership_id` is set for an entry linked to a membership -- its address on the app -- and such an entry comes and goes with the membership (rule 72). `resolves` is false while its person is deactivated: its addresses resolve to no one.
RosterEntryOut
​RosterAddressOut[] · required
display_name
​string · required
id
​string · uuid · required
​required
resolves
​boolean · required
GET/api/v1/roster/me
curl /api/v1/roster/me \ --header 'Authorization: Bearer <token>'
Example Responses
{ "addresses": [ { "id": "00000000-0000-0000-0000-000000000000", "kind": "phone", "value": "value" } ], "display_name": "display_name", "id": "00000000-0000-0000-0000-000000000000", "membership_id": "00000000-0000-0000-0000-000000000000", "resolves": true }
json
application/json

Get Roster Entry

GET
/api/v1/roster/{entry_id}

One entry: any for an owner or an admin, your own for a member. Use when opening a specific roster entry by id. Changes nothing.

Get Roster Entry › path Parameters

entry_id
​string · uuid · required

Get Roster Entry › Responses

Successful Response

One person on the roster. `membership_id` is set for an entry linked to a membership -- its address on the app -- and such an entry comes and goes with the membership (rule 72). `resolves` is false while its person is deactivated: its addresses resolve to no one.
RosterEntryOut
​RosterAddressOut[] · required
display_name
​string · required
id
​string · uuid · required
​required
resolves
​boolean · required
GET/api/v1/roster/{entry_id}
curl /api/v1/roster/:entry_id \ --header 'Authorization: Bearer <token>'
Example Responses
{ "addresses": [ { "id": "00000000-0000-0000-0000-000000000000", "kind": "phone", "value": "value" } ], "display_name": "display_name", "id": "00000000-0000-0000-0000-000000000000", "membership_id": "00000000-0000-0000-0000-000000000000", "resolves": true }
json
application/json

Delete Roster Entry

DELETE
/api/v1/roster/{entry_id}

Stop vouching for somebody with no account. Use when a roster entry should no longer exist. An entry that is a membership's leaves when the membership ends, and is refused here.

Delete Roster Entry › path Parameters

entry_id
​string · uuid · required

Delete Roster Entry › Responses

Successful Response

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

Update Roster Entry

PATCH
/api/v1/roster/{entry_id}

Rename an entry. Use when a roster entry's name needs correcting. Owners and admins only.

Update Roster Entry › path Parameters

entry_id
​string · uuid · required

Update Roster Entry › Request Body

RosterEntryUpdate
display_name
​string · minLength: 1 · maxLength: 200 · required

Update Roster Entry › Responses

Successful Response

One person on the roster. `membership_id` is set for an entry linked to a membership -- its address on the app -- and such an entry comes and goes with the membership (rule 72). `resolves` is false while its person is deactivated: its addresses resolve to no one.
RosterEntryOut
​RosterAddressOut[] · required
display_name
​string · required
id
​string · uuid · required
​required
resolves
​boolean · required
PATCH/api/v1/roster/{entry_id}
curl /api/v1/roster/:entry_id \ --request PATCH \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "display_name": "display_name" }'
Example Request Body
{ "display_name": "display_name" }
json
Example Responses
{ "addresses": [ { "id": "00000000-0000-0000-0000-000000000000", "kind": "phone", "value": "value" } ], "display_name": "display_name", "id": "00000000-0000-0000-0000-000000000000", "membership_id": "00000000-0000-0000-0000-000000000000", "resolves": true }
json
application/json

Add Roster Address

POST
/api/v1/roster/{entry_id}/addresses

Add an address an entry writes from. Use when a roster entry starts writing from a new address. 409 when it is already on the roster.

Add Roster Address › path Parameters

entry_id
​string · uuid · required

Add Roster Address › Request Body

RosterAddressIn
kind
​RosterAddressKind · enum · required

A kind of address a road knows a sender by (rule 70). The three WhatsApp roads share one. The app's address is the membership itself and is never written by hand (rule 72), so it is not a kind anyone writes.

Enum values:
phone
value
​string · minLength: 1 · maxLength: 64 · required

Add Roster Address › Responses

Successful Response

One person on the roster. `membership_id` is set for an entry linked to a membership -- its address on the app -- and such an entry comes and goes with the membership (rule 72). `resolves` is false while its person is deactivated: its addresses resolve to no one.
RosterEntryOut
​RosterAddressOut[] · required
display_name
​string · required
id
​string · uuid · required
​required
resolves
​boolean · required
POST/api/v1/roster/{entry_id}/addresses
curl /api/v1/roster/:entry_id/addresses \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "kind": "phone", "value": "value" }'
Example Request Body
{ "kind": "phone", "value": "value" }
json
Example Responses
{ "addresses": [ { "id": "00000000-0000-0000-0000-000000000000", "kind": "phone", "value": "value" } ], "display_name": "display_name", "id": "00000000-0000-0000-0000-000000000000", "membership_id": "00000000-0000-0000-0000-000000000000", "resolves": true }
json
application/json

Change Roster Address

PUT
/api/v1/roster/{entry_id}/addresses/{address_id}

Change one of an entry's addresses. Use when an address on file is wrong and should be corrected in place. 409 when the new address is already on the roster.

Change Roster Address › path Parameters

entry_id
​string · uuid · required
address_id
​string · uuid · required

Change Roster Address › Request Body

RosterAddressIn
kind
​RosterAddressKind · enum · required

A kind of address a road knows a sender by (rule 70). The three WhatsApp roads share one. The app's address is the membership itself and is never written by hand (rule 72), so it is not a kind anyone writes.

Enum values:
phone
value
​string · minLength: 1 · maxLength: 64 · required

Change Roster Address › Responses

Successful Response

One person on the roster. `membership_id` is set for an entry linked to a membership -- its address on the app -- and such an entry comes and goes with the membership (rule 72). `resolves` is false while its person is deactivated: its addresses resolve to no one.
RosterEntryOut
​RosterAddressOut[] · required
display_name
​string · required
id
​string · uuid · required
​required
resolves
​boolean · required
PUT/api/v1/roster/{entry_id}/addresses/{address_id}
curl /api/v1/roster/:entry_id/addresses/:address_id \ --request PUT \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "kind": "phone", "value": "value" }'
Example Request Body
{ "kind": "phone", "value": "value" }
json
Example Responses
{ "addresses": [ { "id": "00000000-0000-0000-0000-000000000000", "kind": "phone", "value": "value" } ], "display_name": "display_name", "id": "00000000-0000-0000-0000-000000000000", "membership_id": "00000000-0000-0000-0000-000000000000", "resolves": true }
json
application/json

Remove Roster Address

DELETE
/api/v1/roster/{entry_id}/addresses/{address_id}

Remove one of an entry's addresses. Use when an address should no longer be recognized as this entry's. An entry with no account is known only by its addresses and keeps one: removing its last is refused — remove the entry instead.

Remove Roster Address › path Parameters

entry_id
​string · uuid · required
address_id
​string · uuid · required

Remove Roster Address › Responses

Successful Response

One person on the roster. `membership_id` is set for an entry linked to a membership -- its address on the app -- and such an entry comes and goes with the membership (rule 72). `resolves` is false while its person is deactivated: its addresses resolve to no one.
RosterEntryOut
​RosterAddressOut[] · required
display_name
​string · required
id
​string · uuid · required
​required
resolves
​boolean · required
DELETE/api/v1/roster/{entry_id}/addresses/{address_id}
curl /api/v1/roster/:entry_id/addresses/:address_id \ --request DELETE \ --header 'Authorization: Bearer <token>'
Example Responses
{ "addresses": [ { "id": "00000000-0000-0000-0000-000000000000", "kind": "phone", "value": "value" } ], "display_name": "display_name", "id": "00000000-0000-0000-0000-000000000000", "membership_id": "00000000-0000-0000-0000-000000000000", "resolves": true }
json
application/json

outbound_callscustom-data