Sends one user message to an assistant and returns the turn it produced. Pass chatUid to continue a conversation; leave it out to start one and keep the id that comes back.
Synchronous (default). The request is held until the assistant finishes and the response is the array of messages the turn produced — the user message, any tool messages, and the assistant reply — in chronological order. The reply is the last element, and its text is in content.message.
Asynchronous (?async=true). The response is an acknowledgement with the chatUid and nothing else. Follow the run with the realtime endpoint (polling) or the stream endpoint (server-sent events).
Queueing. An async send that cannot start a run right away is queued on the conversation instead: the acknowledgement carries queued: true and willProcess. Reading queuedMessages from the realtime endpoint tells you whether anything is still waiting. Sending while the conversation is busy requires messageQueueEnabled on the assistant; without it the send is rejected with 409 CHAT_BUSY, and past maxQueuedMessages (50 by default) further sends are rejected with 409 too.
Payload-template mode (messageTemplate). Lets a third-party webhook, whose body shape you do not control, point straight at this endpoint: the body is then treated as an opaque payload and the message text is rendered from the template.
An API key from your Devic console, sent as Authorization: Bearer <key>. An embedded front end sends a tenant-session token instead, so no API key reaches the browser, and an OAuth integration sends its access token. Missing, invalid or expired credentials get a 401. See Authentication.
Path Parameters
identifier
string
required
Identifier of the assistant, as returned by the assistants endpoints.
Query Parameters
async
boolean
default:false
Send true to return as soon as the message is accepted, with the chatUid to poll, instead of waiting for the assistant to finish.
language
string
Language the assistant has to answer in, as a language code (en, es, fr, ...). Overrides whatever the prompt says for this message only.
skipSummarization
boolean
default:false
Send true to skip the per-message summaries. Saves a secondary model call, so it cuts latency and cost when nothing reads summary.
messageTemplate
string
Turns on payload-template mode. The request body stops being a ProcessMessageRequest and is taken as an opaque payload, and the message text is rendered from this template: {{path.to.field}} resolves a dot-path into the body, {{$date}} resolves to the current server date (YYYY-MM-DD, see tz).
In this mode every other body field — metadata, tenantId, provider, model, ... — is ignored, so an external payload cannot set them. A template that renders an empty string (a sticker, a reaction, an unrelated event) is acknowledged with 200 and no run, so the sender does not retry.
chatUidTemplate
string
Template for the chatUid in payload-template mode, same syntax as messageTemplate and only valid together with it. Use it to derive the conversation grouping from the payload, for example one conversation per source chat per day. When omitted, or when it renders empty, a new chatUid is generated.
userNameTemplate
string
Template for the userName in payload-template mode, same syntax as messageTemplate and only valid together with it.
tz
string
IANA timezone used to resolve {{$date}} in the templates. Defaults to UTC; an invalid value falls back to UTC.
Body
application/json
The message to send and the context it is sent with. In payload-template mode the body is instead the third-party payload the templates read from.
One user message and the context it is sent with. The assistant answers that single message; the rest of the conversation is recovered from chatUid.
message
string
required
The user message the assistant has to answer. Required, except in payload-template mode (messageTemplate query parameter), where the body is an opaque third-party payload and the text is rendered from the template instead.
Example:
"What solar panels do you recommend?"
chatUid
string
Conversation to continue. Omit it to start a new one: the generated id comes back on the messages of the response (and, in async mode, in the acknowledgement), and is what you send on the next call.
Example:
"550e8400-e29b-41d4-a716-446655440000"
userName
string
Name of the end user writing, used for personalisation and shown in the conversation logs.
Example:
"John Doe"
tags
string[]
Tags stored on the conversation, to filter it later from the chat listing endpoints.
Example:
["support", "onboarding"]
files
object[]
Files attached to the message. Upload them first with the file upload endpoint, then pass the returned download URL here.
Show child attributes
images
object[]
Images attached to the message, always as URLs (never base64). Requires a vision-capable model.
Show child attributes
metadata
object
Free-form context stored on the conversation. Two keys are read by the platform; anything else is kept as-is and can be read back from the chat history.
Tenant (customer/organization) this conversation belongs to in multi-tenant setups. Auto-registers the tenant on first use and attributes its cost/usage. See the Tenants endpoints.
Example:
"tenant_12345"
subtenantId
string
End user/entity inside the tenant. When omitted it is derived from metadata.subtenantMetadata.id or the legacy metadata.userId. Used for per-subtenant cost attribution and usage limits.
Example:
"user_67890"
previousConversation
object[]
Earlier exchanges to seed the conversation with, for example when migrating a chat from another system. Only accepted when starting a new conversation, that is, without chatUid.
Restricts this message to these tools, by name, out of the ones the assistant's tool servers offer. Omit the field to leave the assistant's own configuration alone; send an empty array to run the message with no tools at all.
Example:
["get_weather", "calculator"]
disabledIntegrations
string[]
Apps the end user connected that should sit out this message, by slug. A deny list over the tenant's own connected apps only — the assistant's tool servers are governed by enabledTools. The account stays connected and the next message has it back unless it is named again.
Example:
["gmail"]
provider
enum<string>
Overrides the assistant's LLM provider for this message. The account must have that provider configured.
Available options:
open-ai,
anthropic,
google-gemini,
deepseek,
kimi,
xai
Example:
"open-ai"
model
string
Overrides the assistant's model for this message. Must be a supported model and, when provider is also sent, must belong to it.
Example:
"gpt-4.1"
tools
object[]
Model Interface Protocol: tools that run on your side. When the assistant calls one, the turn stops with the call pending and you answer it with the tool-response endpoint.
Show child attributes
transcriptId
string
Id of a speech-to-text transcript (from the transcription endpoint) that seeded this message, so the conversation keeps a link to the original audio.
Example:
"550e8400-e29b-41d4-a716-446655440000"
Response
Synchronously, the messages the turn produced, oldest first, with the assistant reply last. In async mode, the acknowledgement with the chatUid to poll.
object[]
object
A single message of a conversation, as the platform stored it.
uid
string
Unique message id
Example:
"75ecbcfc-a3be-43ba-8da6-b3e16e8d7280"
chatUid
string
Conversation this message belongs to
Example:
"550e8400-e29b-41d4-a716-446655440000"
role
enum<string>
Who the message is from. developer messages are the ones the platform injects (current date, injected context) and can be ignored by most clients.
Available options:
user,
assistant,
developer,
tool
content
object
Body of the message.
Show child attributes
timestamp
number
Unix timestamp in milliseconds
Example:
1706000000000
userUID
string
Identity the message was written under
Example:
"api-key:42"
summary
string
Short AI-generated summary of the message, unless summarisation was skipped
Example:
"The user asks which panels to install on a 60 m2 roof."
contentSource
string
Where content.message came from when the model did not write it. finish_tool means the reply was taken from the finish tool's message argument, so it can be read without parsing tool calls. Absent on messages the model wrote itself.
Example:
"finish_tool"
tool_calls
object[]
Tool calls the assistant made on this message
Show child attributes
tool_call_id
string
On tool messages, the call this message answers
Example:
"call_abc123"
latencyMs
number
How long the model or the tool took, in milliseconds
Example:
1045
messageTokenUsage
object
Tokens this message accounted for
Show child attributes
messageCost
object
What this message cost, at the pricing in force when it ran
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Devic Documentation","description":"Turn your SaaS AI-native with Devic. Build, deploy, and operate agents, assistants, MCP tools, RAG, and AI workflows from one platform.","colors":{"primary":"#4764E6","light":"#6F8EFF","dark":"#2C3A8C"},"logo":{"light":"https://mintcdn.com/devic/gabzi_FqrplBFOjV/logo/devic-light.svg?fit=max\u0026auto=format\u0026n=gabzi_FqrplBFOjV\u0026q=85\u0026s=ec3c30fed45bb07177168ad49854c2c5","dark":"https://mintcdn.com/devic/gabzi_FqrplBFOjV/logo/devic-dark.svg?fit=max\u0026auto=format\u0026n=gabzi_FqrplBFOjV\u0026q=85\u0026s=2b637f4060c2001b87f21305b19a4b9c","href":"https://app.devic.ai/"},"favicon":{"light":"https://mintcdn.com/devic/gabzi_FqrplBFOjV/favicon.svg?fit=max\u0026auto=format\u0026n=gabzi_FqrplBFOjV\u0026q=85\u0026s=78aacd249630ae953a05222ef3ca5b69","dark":"https://mintcdn.com/devic/gabzi_FqrplBFOjV/favicon.svg?fit=max\u0026auto=format\u0026n=gabzi_FqrplBFOjV\u0026q=85\u0026s=78aacd249630ae953a05222ef3ca5b69"},"navbar":{"links":[{"href":"mailto:info@devic.ai","label":"Support"}],"primary":{"type":"button","label":"Login","href":"https://app.devic.ai/"}},"footer":{"socials":{"x":"https://x.com/devic_ai","github":"https://github.com/devicai","linkedin":"https://www.linkedin.com/company/devicai"}},"integrations":{"ga4":{"measurementId":"G-8K836ZN854"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"thumbnails":{"background":"https://mintcdn.com/devic/w7qYRbVpXOedcE7E/images/5e60580e-c9b6-41ae-a6e5-984cf4648873.png?fit=max\u0026auto=format\u0026n=w7qYRbVpXOedcE7E\u0026q=85\u0026s=4f2220729f821080ee1ca120071a72a7"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"devic","hasAudioNarration":false,"actualSubdomain":"devic","customDomains":["docs.devic.ai"],"gitSource":{"type":"github","owner":"devicai","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{},"buildId":"6aabf34eccf8fcf4f066c745","clientVersion":"0.0.4131","searchFilterCounts":[{"language":"default","tag":"API reference","count":186},{"language":"default","tag":"Devic","count":89},{"language":"default","tag":"Agents","count":48},{"language":"default","tag":"Assistants","count":31},{"language":"default","tag":"Knowledge","count":25},{"language":"default","tag":"Environments","count":18},{"language":"default","tag":"Integrations","count":15},{"language":"default","tag":"Tool Servers","count":14},{"language":"default","tag":"MCPs","count":13},{"language":"default","tag":"Guardrails","count":12}]},"assistantConfig":{"enableStarterQuestions":false},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/endpoint/post-api-v1-assistants-identifier-messages","slug":"/api-reference/endpoint/post-api-v1-assistants-identifier-messages","pageMetadata":{"title":"Process a message with an assistant","openapi":"POST /v1/assistants/{identifier}/messages","description":"Sends one user message to an assistant and returns the turn it produced. Pass `chatUid` to continue a conversation; leave it out to start one and keep the id that comes back.\n\n**Synchronous (default).** The request is held until the assistant finishes and the response is the array of messages the turn produced — the user message, any tool messages, and the assistant reply — in chronological order. The reply is the last element, and its text is in `content.message`.\n\n**Asynchronous (`?async=true`).** The response is an acknowledgement with the `chatUid` and nothing else. Follow the run with the realtime endpoint (polling) or the stream endpoint (server-sent events).\n\n**Queueing.** An async send that cannot start a run right away is queued on the conversation instead: the acknowledgement carries `queued: true` and `willProcess`. Reading `queuedMessages` from the realtime endpoint tells you whether anything is still waiting. Sending while the conversation is busy requires `messageQueueEnabled` on the assistant; without it the send is rejected with `409 CHAT_BUSY`, and past `maxQueuedMessages` (50 by default) further sends are rejected with 409 too.\n\n**Payload-template mode (`messageTemplate`).** Lets a third-party webhook, whose body shape you do not control, point straight at this endpoint: the body is then treated as an opaque payload and the message text is rendered from the template.","href":"/api-reference/endpoint/post-api-v1-assistants-identifier-messages"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Sends one user message to an assistant and returns the turn it produced. Pass \", _jsx(_components.code, {\n children: \"chatUid\"\n }), \" to continue a conversation; leave it out to start one and keep the id that comes back.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Synchronous (default).\"\n }), \" The request is held until the assistant finishes and the response is the array of messages the turn produced — the user message, any tool messages, and the assistant reply — in chronological order. The reply is the last element, and its text is in \", _jsx(_components.code, {\n children: \"content.message\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsxs(_components.strong, {\n children: [\"Asynchronous (\", _jsx(_components.code, {\n children: \"?async=true\"\n }), \").\"]\n }), \" The response is an acknowledgement with the \", _jsx(_components.code, {\n children: \"chatUid\"\n }), \" and nothing else. Follow the run with the realtime endpoint (polling) or the stream endpoint (server-sent events).\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Queueing.\"\n }), \" An async send that cannot start a run right away is queued on the conversation instead: the acknowledgement carries \", _jsx(_components.code, {\n children: \"queued: true\"\n }), \" and \", _jsx(_components.code, {\n children: \"willProcess\"\n }), \". Reading \", _jsx(_components.code, {\n children: \"queuedMessages\"\n }), \" from the realtime endpoint tells you whether anything is still waiting. Sending while the conversation is busy requires \", _jsx(_components.code, {\n children: \"messageQueueEnabled\"\n }), \" on the assistant; without it the send is rejected with \", _jsx(_components.code, {\n children: \"409 CHAT_BUSY\"\n }), \", and past \", _jsx(_components.code, {\n children: \"maxQueuedMessages\"\n }), \" (50 by default) further sends are rejected with 409 too.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsxs(_components.strong, {\n children: [\"Payload-template mode (\", _jsx(_components.code, {\n children: \"messageTemplate\"\n }), \").\"]\n }), \" Lets a third-party webhook, whose body shape you do not control, point straight at this endpoint: the body is then treated as an opaque payload and the message text is rendered from the template.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Process a message with an assistant","openapi":"POST /v1/assistants/{identifier}/messages","description":"Sends one user message to an assistant and returns the turn it produced. Pass `chatUid` to continue a conversation; leave it out to start one and keep the id that comes back.\n\n**Synchronous (default).** The request is held until the assistant finishes and the response is the array of messages the turn produced — the user message, any tool messages, and the assistant reply — in chronological order. The reply is the last element, and its text is in `content.message`.\n\n**Asynchronous (`?async=true`).** The response is an acknowledgement with the `chatUid` and nothing else. Follow the run with the realtime endpoint (polling) or the stream endpoint (server-sent events).\n\n**Queueing.** An async send that cannot start a run right away is queued on the conversation instead: the acknowledgement carries `queued: true` and `willProcess`. Reading `queuedMessages` from the realtime endpoint tells you whether anything is still waiting. Sending while the conversation is busy requires `messageQueueEnabled` on the assistant; without it the send is rejected with `409 CHAT_BUSY`, and past `maxQueuedMessages` (50 by default) further sends are rejected with 409 too.\n\n**Payload-template mode (`messageTemplate`).** Lets a third-party webhook, whose body shape you do not control, point straight at this endpoint: the body is then treated as an opaque payload and the message text is rendered from the template.","href":"/api-reference/endpoint/post-api-v1-assistants-identifier-messages"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Assistants"],"summary":"Process a message with an assistant","description":"Sends one user message to an assistant and returns the turn it produced. Pass `chatUid` to continue a conversation; leave it out to start one and keep the id that comes back.\n\n**Synchronous (default).** The request is held until the assistant finishes and the response is the array of messages the turn produced — the user message, any tool messages, and the assistant reply — in chronological order. The reply is the last element, and its text is in `content.message`.\n\n**Asynchronous (`?async=true`).** The response is an acknowledgement with the `chatUid` and nothing else. Follow the run with the realtime endpoint (polling) or the stream endpoint (server-sent events).\n\n**Queueing.** An async send that cannot start a run right away is queued on the conversation instead: the acknowledgement carries `queued: true` and `willProcess`. Reading `queuedMessages` from the realtime endpoint tells you whether anything is still waiting. Sending while the conversation is busy requires `messageQueueEnabled` on the assistant; without it the send is rejected with `409 CHAT_BUSY`, and past `maxQueuedMessages` (50 by default) further sends are rejected with 409 too.\n\n**Payload-template mode (`messageTemplate`).** Lets a third-party webhook, whose body shape you do not control, point straight at this endpoint: the body is then treated as an opaque payload and the message text is rendered from the template.","operationId":"processAssistantMessage","security":["2bf1705d-faf3-4009-980b-29f9d7b6b998"],"parameters":["cc5948a0-afbe-4e7e-a6b4-05b0e111e322","d401494f-b7fd-4d2d-95e0-de4fb25f3804","8c51be14-11ea-4df5-ac28-30017936bdc5","d7078732-0a8d-4642-a642-cbfb2719cb78","3bcb7ac5-2972-438c-a2c5-9253fed4a46e","dd89c4a0-780c-439b-ba06-3c6e1717bc4b","0d191f0c-90c7-4d45-91f9-1ac3baad9e4f","d88542c8-098b-4bc6-99fb-49f077b7e4dc"],"requestBody":"d9fa02b2-3a3c-48eb-be5f-79ab72eb1026","responses":{"200":"eca04ceb-6747-4c24-8896-9f642a3b28ed","400":"90635a09-1bac-49e5-a202-6e8e3bcbddb6","401":"02e37ff5-0ddb-4a38-af44-9f5afe015deb","404":"5484c105-9297-4b6f-9671-fa01792a5d0c","409":"1bc70721-b0bf-402c-a641-213ccfb8a2d0","429":"01e94493-4f91-4721-841f-fb7e79616574","500":"18dccb16-2878-47e9-9755-6bb892a257d9"},"method":"post","type":"path","servers":["e360797e-985a-42f5-b140-d9e4bd40f85b","5c6b8660-0b3a-4bee-8364-9993adaed626"],"path":"/v1/assistants/{identifier}/messages","baseUrlOptions":["https://api.devic.ai","https://staging-api.devic.ai"],"title":"Process a message with an assistant","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"cc5948a0-afbe-4e7e-a6b4-05b0e111e322":{"name":"identifier","in":"path","required":true,"description":"Identifier of the assistant, as returned by the assistants endpoints.","schema":{"type":"string","isRequired":true,"description":"Identifier of the assistant, as returned by the assistants endpoints.","uniqueKey":"","typeLabel":"string"},"example":"550e8400-e29b-41d4-a716-446655440000"},"d401494f-b7fd-4d2d-95e0-de4fb25f3804":{"name":"async","in":"query","required":false,"description":"Send `true` to return as soon as the message is accepted, with the `chatUid` to poll, instead of waiting for the assistant to finish.","schema":{"type":"boolean","default":false,"isRequired":false,"description":"Send `true` to return as soon as the message is accepted, with the `chatUid` to poll, instead of waiting for the assistant to finish.","uniqueKey":"","typeLabel":"boolean"},"example":true},"8c51be14-11ea-4df5-ac28-30017936bdc5":{"name":"language","in":"query","required":false,"description":"Language the assistant has to answer in, as a language code (`en`, `es`, `fr`, ...). Overrides whatever the prompt says for this message only.","schema":{"type":"string","isRequired":false,"description":"Language the assistant has to answer in, as a language code (`en`, `es`, `fr`, ...). Overrides whatever the prompt says for this message only.","uniqueKey":"","typeLabel":"string"},"example":"es"},"d7078732-0a8d-4642-a642-cbfb2719cb78":{"name":"skipSummarization","in":"query","required":false,"description":"Send `true` to skip the per-message summaries. Saves a secondary model call, so it cuts latency and cost when nothing reads `summary`.","schema":{"type":"boolean","default":false,"isRequired":false,"description":"Send `true` to skip the per-message summaries. Saves a secondary model call, so it cuts latency and cost when nothing reads `summary`.","uniqueKey":"","typeLabel":"boolean"}},"3bcb7ac5-2972-438c-a2c5-9253fed4a46e":{"name":"messageTemplate","in":"query","required":false,"description":"Turns on payload-template mode. The request body stops being a `ProcessMessageRequest` and is taken as an opaque payload, and the message text is rendered from this template: `{{path.to.field}}` resolves a dot-path into the body, `{{$date}}` resolves to the current server date (`YYYY-MM-DD`, see `tz`).\n\nIn this mode every other body field — `metadata`, `tenantId`, `provider`, `model`, ... — is ignored, so an external payload cannot set them. A template that renders an empty string (a sticker, a reaction, an unrelated event) is acknowledged with 200 and no run, so the sender does not retry.","schema":{"type":"string","isRequired":false,"description":"Turns on payload-template mode. The request body stops being a `ProcessMessageRequest` and is taken as an opaque payload, and the message text is rendered from this template: `{{path.to.field}}` resolves a dot-path into the body, `{{$date}}` resolves to the current server date (`YYYY-MM-DD`, see `tz`).\n\nIn this mode every other body field — `metadata`, `tenantId`, `provider`, `model`, ... — is ignored, so an external payload cannot set them. A template that renders an empty string (a sticker, a reaction, an unrelated event) is acknowledged with 200 and no run, so the sender does not retry.","uniqueKey":"","typeLabel":"string"},"example":"{{message.sender.name}}: {{message.text}}"},"dd89c4a0-780c-439b-ba06-3c6e1717bc4b":{"name":"chatUidTemplate","in":"query","required":false,"description":"Template for the `chatUid` in payload-template mode, same syntax as `messageTemplate` and only valid together with it. Use it to derive the conversation grouping from the payload, for example one conversation per source chat per day. When omitted, or when it renders empty, a new `chatUid` is generated.","schema":{"type":"string","isRequired":false,"description":"Template for the `chatUid` in payload-template mode, same syntax as `messageTemplate` and only valid together with it. Use it to derive the conversation grouping from the payload, for example one conversation per source chat per day. When omitted, or when it renders empty, a new `chatUid` is generated.","uniqueKey":"","typeLabel":"string"},"example":"wa-{{message.conversationId}}-{{$date}}"},"0d191f0c-90c7-4d45-91f9-1ac3baad9e4f":{"name":"userNameTemplate","in":"query","required":false,"description":"Template for the `userName` in payload-template mode, same syntax as `messageTemplate` and only valid together with it.","schema":{"type":"string","isRequired":false,"description":"Template for the `userName` in payload-template mode, same syntax as `messageTemplate` and only valid together with it.","uniqueKey":"","typeLabel":"string"},"example":"{{message.sender.name}}"},"d88542c8-098b-4bc6-99fb-49f077b7e4dc":{"name":"tz","in":"query","required":false,"description":"IANA timezone used to resolve `{{$date}}` in the templates. Defaults to UTC; an invalid value falls back to UTC.","schema":{"type":"string","isRequired":false,"description":"IANA timezone used to resolve `{{$date}}` in the templates. Defaults to UTC; an invalid value falls back to UTC.","uniqueKey":"","typeLabel":"string"},"example":"Europe/Madrid"}},"requestBody":{"required":true,"description":"The message to send and the context it is sent with. In payload-template mode the body is instead the third-party payload the templates read from.","content":{"application/json":{"schema":{"type":"object","required":["message"],"description":"One user message and the context it is sent with. The assistant answers that single message; the rest of the conversation is recovered from `chatUid`.","properties":{"message":{"type":"string","description":"The user message the assistant has to answer. Required, except in payload-template mode (`messageTemplate` query parameter), where the body is an opaque third-party payload and the text is rendered from the template instead.","example":"What solar panels do you recommend?","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"chatUid":{"type":"string","description":"Conversation to continue. Omit it to start a new one: the generated id comes back on the messages of the response (and, in async mode, in the acknowledgement), and is what you send on the next call.","example":"550e8400-e29b-41d4-a716-446655440000","uniqueKey":"chatUid","typeLabel":"string"},"userName":{"type":"string","description":"Name of the end user writing, used for personalisation and shown in the conversation logs.","example":"John Doe","uniqueKey":"userName","typeLabel":"string"},"tags":{"type":"array","items":{"type":"string","uniqueKey":"tags.items.[INDEX]","typeLabel":"string"},"description":"Tags stored on the conversation, to filter it later from the chat listing endpoints.","example":["support","onboarding"],"uniqueKey":"tags","typeLabel":"string[]"},"files":{"type":"array","description":"Files attached to the message. Upload them first with the file upload endpoint, then pass the returned download URL here.","items":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"File name shown in the conversation","example":"invoice.pdf","isRequired":true,"uniqueKey":"files.items.[INDEX].name","typeLabel":"string"},"donwloadUrl":{"type":"string","description":"URL the platform downloads the file from. Note the historical spelling of this field, kept for backwards compatibility.","example":"https://files.devic.ai/uploads/invoice.pdf","uniqueKey":"files.items.[INDEX].donwloadUrl","typeLabel":"string"},"fileType":{"type":"string","enum":["IMAGE","DOCUMENT","VIDEO","AUDIO","ELECTRICITY_BILL","OTHER"],"description":"Kind of file, used to decide how it is processed","example":"DOCUMENT","uniqueKey":"files.items.[INDEX].fileType","typeLabel":"enum\u003cstring>"}},"uniqueKey":"files.items.[INDEX]","typeLabel":"object"},"uniqueKey":"files","typeLabel":"object[]"},"images":{"type":"array","description":"Images attached to the message, always as URLs (never base64). Requires a vision-capable model.","items":{"type":"object","required":["imageUrl"],"properties":{"imageUrl":{"type":"string","example":"https://files.devic.ai/uploads/roof.jpg","isRequired":true,"uniqueKey":"images.items.[INDEX].imageUrl","typeLabel":"string"}},"uniqueKey":"images.items.[INDEX]","typeLabel":"object"},"uniqueKey":"images","typeLabel":"object[]"},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form context stored on the conversation. Two keys are read by the platform; anything else is kept as-is and can be read back from the chat history.","properties":{"promptTemplateParams":{"type":"object","additionalProperties":true,"description":"Values for the `{{variable}}` placeholders of the assistant prompt. Also accepted under the legacy misspelling `propmptTemplateParams`.","example":{"userName":"John","companyName":"Acme Corp"},"uniqueKey":"metadata.promptTemplateParams","typeLabel":"object"},"tenantToken":{"type":"string","description":"Token forwarded to the tool servers that are configured to authenticate the end user.","example":"tenant_abc123","uniqueKey":"metadata.tenantToken","typeLabel":"string"}},"example":{"promptTemplateParams":{"companyName":"Acme Corp"},"source":"web-widget"},"uniqueKey":"metadata","typeLabel":"object"},"tenantId":{"type":"string","description":"Tenant (customer/organization) this conversation belongs to in multi-tenant setups. Auto-registers the tenant on first use and attributes its cost/usage. See the Tenants endpoints.","example":"tenant_12345","uniqueKey":"tenantId","typeLabel":"string"},"subtenantId":{"type":"string","description":"End user/entity inside the tenant. When omitted it is derived from `metadata.subtenantMetadata.id` or the legacy `metadata.userId`. Used for per-subtenant cost attribution and usage limits.","example":"user_67890","uniqueKey":"subtenantId","typeLabel":"string"},"previousConversation":{"type":"array","description":"Earlier exchanges to seed the conversation with, for example when migrating a chat from another system. Only accepted when starting a new conversation, that is, without `chatUid`.","items":{"type":"object","required":["message","role"],"properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"previousConversation.items.[INDEX].message","typeLabel":"string"},"role":{"type":"string","enum":["user","assistant"],"isRequired":true,"uniqueKey":"previousConversation.items.[INDEX].role","typeLabel":"enum\u003cstring>"}},"uniqueKey":"previousConversation.items.[INDEX]","typeLabel":"object"},"example":[{"message":"Hello","role":"user"},{"message":"Hi there!","role":"assistant"}],"uniqueKey":"previousConversation","typeLabel":"object[]"},"enabledTools":{"type":"array","items":{"type":"string","uniqueKey":"enabledTools.items.[INDEX]","typeLabel":"string"},"description":"Restricts this message to these tools, by name, out of the ones the assistant's tool servers offer. Omit the field to leave the assistant's own configuration alone; send an empty array to run the message with no tools at all.","example":["get_weather","calculator"],"uniqueKey":"enabledTools","typeLabel":"string[]"},"disabledIntegrations":{"type":"array","items":{"type":"string","uniqueKey":"disabledIntegrations.items.[INDEX]","typeLabel":"string"},"description":"Apps the end user connected that should sit out this message, by slug. A deny list over the tenant's own connected apps only — the assistant's tool servers are governed by `enabledTools`. The account stays connected and the next message has it back unless it is named again.","example":["gmail"],"uniqueKey":"disabledIntegrations","typeLabel":"string[]"},"provider":{"type":"string","description":"Overrides the assistant's LLM provider for this message. The account must have that provider configured.","enum":["open-ai","anthropic","google-gemini","deepseek","kimi","xai"],"example":"open-ai","uniqueKey":"provider","typeLabel":"enum\u003cstring>"},"model":{"type":"string","description":"Overrides the assistant's model for this message. Must be a supported model and, when `provider` is also sent, must belong to it.","example":"gpt-4.1","uniqueKey":"model","typeLabel":"string"},"tools":{"type":"array","description":"Model Interface Protocol: tools that run on your side. When the assistant calls one, the turn stops with the call pending and you answer it with the tool-response endpoint.","items":{"type":"object","required":["type","function"],"description":"Client-side tool definition, in the OpenAI function-calling format.","properties":{"type":{"type":"string","enum":["function"],"example":"function","isRequired":true,"uniqueKey":"tools.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"function":{"type":"object","required":["name","description","parameters"],"properties":{"name":{"type":"string","example":"get_user_location","isRequired":true,"uniqueKey":"tools.items.[INDEX].function.name","typeLabel":"string"},"description":{"type":"string","example":"Get the current user location","isRequired":true,"uniqueKey":"tools.items.[INDEX].function.description","typeLabel":"string"},"parameters":{"type":"object","description":"JSON Schema of the arguments","properties":{"type":{"type":"string","example":"object","uniqueKey":"tools.items.[INDEX].function.parameters.type","typeLabel":"string"},"properties":{"type":"object","additionalProperties":true,"uniqueKey":"tools.items.[INDEX].function.parameters.properties","typeLabel":"object"},"required":{"type":"array","items":{"type":"string","uniqueKey":"tools.items.[INDEX].function.parameters.required.items.[INDEX]","typeLabel":"string"},"uniqueKey":"tools.items.[INDEX].function.parameters.required","typeLabel":"string[]"}},"isRequired":true,"uniqueKey":"tools.items.[INDEX].function.parameters","typeLabel":"object"}},"isRequired":true,"uniqueKey":"tools.items.[INDEX].function","typeLabel":"object"}},"uniqueKey":"tools.items.[INDEX]","typeLabel":"object"},"uniqueKey":"tools","typeLabel":"object[]"},"transcriptId":{"type":"string","description":"Id of a speech-to-text transcript (from the transcription endpoint) that seeded this message, so the conversation keeps a link to the original audio.","example":"550e8400-e29b-41d4-a716-446655440000","uniqueKey":"transcriptId","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"What solar panels do you recommend?","chatUid":"550e8400-e29b-41d4-a716-446655440000","userName":"John Doe","tags":["support","onboarding"],"files":[{"name":"invoice.pdf","donwloadUrl":"https://files.devic.ai/uploads/invoice.pdf","fileType":"DOCUMENT"}],"images":[{"imageUrl":"https://files.devic.ai/uploads/roof.jpg"}],"metadata":{"promptTemplateParams":{"companyName":"Acme Corp"},"source":"web-widget"},"tenantId":"tenant_12345","subtenantId":"user_67890","previousConversation":[{"message":"Hello","role":"user"},{"message":"Hi there!","role":"assistant"}],"enabledTools":["get_weather","calculator"],"disabledIntegrations":["gmail"],"provider":"open-ai","model":"gpt-4.1","tools":[{"type":"function","function":{"name":"get_user_location","description":"Get the current user location","parameters":{"type":"object","properties":{},"required":["\u003cstring>"]}}}],"transcriptId":"550e8400-e29b-41d4-a716-446655440000"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"eca04ceb-6747-4c24-8896-9f642a3b28ed":{"description":"Synchronously, the messages the turn produced, oldest first, with the assistant reply last. In async mode, the acknowledgement with the `chatUid` to poll.","content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"type":"object","description":"A single message of a conversation, as the platform stored it.","properties":{"uid":{"type":"string","description":"Unique message id","example":"75ecbcfc-a3be-43ba-8da6-b3e16e8d7280","uniqueKey":"oneOf.0.items.[INDEX].uid","typeLabel":"string"},"chatUid":{"type":"string","description":"Conversation this message belongs to","example":"550e8400-e29b-41d4-a716-446655440000","uniqueKey":"oneOf.0.items.[INDEX].chatUid","typeLabel":"string"},"role":{"type":"string","enum":["user","assistant","developer","tool"],"description":"Who the message is from. `developer` messages are the ones the platform injects (current date, injected context) and can be ignored by most clients.","uniqueKey":"oneOf.0.items.[INDEX].role","typeLabel":"enum\u003cstring>"},"content":{"type":"object","description":"Body of the message.","properties":{"message":{"type":"string","description":"The text. This is the field to render.","example":"I would recommend a 450 W monocrystalline panel.","uniqueKey":"oneOf.0.items.[INDEX].content.message","typeLabel":"string"},"data":{"type":"object","additionalProperties":true,"description":"Structured payload, when the assistant is configured with a structured output.","uniqueKey":"oneOf.0.items.[INDEX].content.data","typeLabel":"object"},"files":{"type":"array","description":"Files carried by the message, echoed in the same shape they were sent in.","items":{"type":"object","properties":{"name":{"type":"string","example":"invoice.pdf","uniqueKey":"oneOf.0.items.[INDEX].content.files.items.[INDEX].name","typeLabel":"string"},"donwloadUrl":{"type":"string","example":"https://files.devic.ai/uploads/invoice.pdf","uniqueKey":"oneOf.0.items.[INDEX].content.files.items.[INDEX].donwloadUrl","typeLabel":"string"},"fileType":{"type":"string","enum":["IMAGE","DOCUMENT","VIDEO","AUDIO","ELECTRICITY_BILL","OTHER"],"example":"DOCUMENT","uniqueKey":"oneOf.0.items.[INDEX].content.files.items.[INDEX].fileType","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.0.items.[INDEX].content.files.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.items.[INDEX].content.files","typeLabel":"object[]"}},"uniqueKey":"oneOf.0.items.[INDEX].content","typeLabel":"object"},"timestamp":{"type":"number","description":"Unix timestamp in milliseconds","example":1706000000000,"uniqueKey":"oneOf.0.items.[INDEX].timestamp","typeLabel":"number"},"userUID":{"type":"string","description":"Identity the message was written under","example":"api-key:42","uniqueKey":"oneOf.0.items.[INDEX].userUID","typeLabel":"string"},"summary":{"type":"string","description":"Short AI-generated summary of the message, unless summarisation was skipped","example":"The user asks which panels to install on a 60 m2 roof.","uniqueKey":"oneOf.0.items.[INDEX].summary","typeLabel":"string"},"contentSource":{"type":"string","description":"Where `content.message` came from when the model did not write it. `finish_tool` means the reply was taken from the finish tool's `message` argument, so it can be read without parsing tool calls. Absent on messages the model wrote itself.","example":"finish_tool","uniqueKey":"oneOf.0.items.[INDEX].contentSource","typeLabel":"string"},"tool_calls":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","example":"call_abc123","description":"Unique tool call ID","isRequired":true,"uniqueKey":"oneOf.0.items.[INDEX].tool_calls.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","example":"function","description":"Tool call type","isRequired":true,"uniqueKey":"oneOf.0.items.[INDEX].tool_calls.items.[INDEX].type","typeLabel":"string"},"function":{"type":"object","description":"Function call details","example":{"name":"get_user_location","arguments":"{}"},"isRequired":true,"uniqueKey":"oneOf.0.items.[INDEX].tool_calls.items.[INDEX].function","typeLabel":"object"}},"required":["id","type","function"],"uniqueKey":"oneOf.0.items.[INDEX].tool_calls.items.[INDEX]","typeLabel":"object"},"description":"Tool calls the assistant made on this message","uniqueKey":"oneOf.0.items.[INDEX].tool_calls","typeLabel":"object[]"},"tool_call_id":{"type":"string","description":"On `tool` messages, the call this message answers","example":"call_abc123","uniqueKey":"oneOf.0.items.[INDEX].tool_call_id","typeLabel":"string"},"latencyMs":{"type":"number","description":"How long the model or the tool took, in milliseconds","example":1045,"uniqueKey":"oneOf.0.items.[INDEX].latencyMs","typeLabel":"number"},"messageTokenUsage":{"type":"object","description":"Tokens this message accounted for","properties":{"inputTokens":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageTokenUsage.inputTokens","typeLabel":"number"},"outputTokens":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageTokenUsage.outputTokens","typeLabel":"number"},"inputCachedTokens":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageTokenUsage.inputCachedTokens","typeLabel":"number"},"inputCacheWriteTokens":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageTokenUsage.inputCacheWriteTokens","typeLabel":"number"},"outputCachedTokens":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageTokenUsage.outputCachedTokens","typeLabel":"number"},"reasoningOutputTokens":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageTokenUsage.reasoningOutputTokens","typeLabel":"number"},"totalTokens":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageTokenUsage.totalTokens","typeLabel":"number"},"provider":{"type":"string","uniqueKey":"oneOf.0.items.[INDEX].messageTokenUsage.provider","typeLabel":"string"},"model":{"type":"string","uniqueKey":"oneOf.0.items.[INDEX].messageTokenUsage.model","typeLabel":"string"}},"uniqueKey":"oneOf.0.items.[INDEX].messageTokenUsage","typeLabel":"object"},"messageCost":{"type":"object","description":"What this message cost, at the pricing in force when it ran","properties":{"inputCost":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageCost.inputCost","typeLabel":"number"},"outputCost":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageCost.outputCost","typeLabel":"number"},"inputCachedCost":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageCost.inputCachedCost","typeLabel":"number"},"inputCacheWriteCost":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageCost.inputCacheWriteCost","typeLabel":"number"},"outputCachedCost":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageCost.outputCachedCost","typeLabel":"number"},"reasoningOutputCost":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageCost.reasoningOutputCost","typeLabel":"number"},"totalCost":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageCost.totalCost","typeLabel":"number"},"currency":{"type":"string","example":"USD","uniqueKey":"oneOf.0.items.[INDEX].messageCost.currency","typeLabel":"string"},"calculatedAt":{"type":"number","uniqueKey":"oneOf.0.items.[INDEX].messageCost.calculatedAt","typeLabel":"number"}},"uniqueKey":"oneOf.0.items.[INDEX].messageCost","typeLabel":"object"}},"uniqueKey":"oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"Synchronous mode: the messages of the finished turn","uniqueKey":"oneOf.0","typeLabel":"object[]"},{"type":"object","description":"Acknowledgement returned by `?async=true`: the conversation id to poll, and — when the message was parked instead of started — where it sits in the queue.","required":["chatUid"],"properties":{"chatUid":{"type":"string","description":"Conversation the message went into. Poll the realtime endpoint with it, or open the stream.","example":"550e8400-e29b-41d4-a716-446655440000","isRequired":true,"uniqueKey":"oneOf.1.chatUid","typeLabel":"string"},"queued":{"type":"boolean","description":"The message was queued rather than started right away","example":true,"uniqueKey":"oneOf.1.queued","typeLabel":"boolean"},"queuePosition":{"type":"number","description":"How many messages are waiting on this conversation, this one included","example":1,"uniqueKey":"oneOf.1.queuePosition","typeLabel":"number"},"willProcess":{"type":"string","enum":["after_delay","next_turn","on_resume"],"description":"When the queued message reaches the model. `after_delay`: it joined the assistant's input-delay window. `next_turn`: a run is in flight and it joins that run. `on_resume`: the conversation is waiting on a subagent, a timed pause or a tool response.","example":"next_turn","uniqueKey":"oneOf.1.willProcess","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object[] | object"},"examples":{"Example":{"title":"Example","value":[{"uid":"75ecbcfc-a3be-43ba-8da6-b3e16e8d7280","chatUid":"550e8400-e29b-41d4-a716-446655440000","role":"user","content":{"message":"I would recommend a 450 W monocrystalline panel.","data":{},"files":[{"name":"invoice.pdf","donwloadUrl":"https://files.devic.ai/uploads/invoice.pdf","fileType":"DOCUMENT"}]},"timestamp":1706000000000,"userUID":"api-key:42","summary":"The user asks which panels to install on a 60 m2 roof.","contentSource":"finish_tool","tool_calls":[{"id":"call_abc123","type":"function","function":{"name":"get_user_location","arguments":"{}"}}],"tool_call_id":"call_abc123","latencyMs":1045,"messageTokenUsage":{"inputTokens":123,"outputTokens":123,"inputCachedTokens":123,"inputCacheWriteTokens":123,"outputCachedTokens":123,"reasoningOutputTokens":123,"totalTokens":123,"provider":"\u003cstring>","model":"\u003cstring>"},"messageCost":{"inputCost":123,"outputCost":123,"inputCachedCost":123,"inputCacheWriteCost":123,"outputCachedCost":123,"reasoningOutputCost":123,"totalCost":123,"currency":"USD","calculatedAt":123}}]}},"exampleType":"generated"}},"exampleType":"generated"},"90635a09-1bac-49e5-a202-6e8e3bcbddb6":{"description":"Invalid payload, provider not configured for the account, model unknown or not the provider's, or a template that could not be rendered.","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string","description":"Error code","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"details":{"type":"object","additionalProperties":true,"description":"Additional details about the error","uniqueKey":"details","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","message":"\u003cstring>","details":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"02e37ff5-0ddb-4a38-af44-9f5afe015deb":{"description":"Unauthorized - Invalid or missing token","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"5484c105-9297-4b6f-9671-fa01792a5d0c":{"description":"Assistant not found","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"1bc70721-b0bf-402c-a641-213ccfb8a2d0":{"description":"The conversation is busy and cannot take the message: either the assistant does not have `messageQueueEnabled` (error `CHAT_BUSY`), or its queue is already full (`maxQueuedMessages`).","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string","description":"Error code","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"details":{"type":"object","additionalProperties":true,"description":"Additional details about the error","uniqueKey":"details","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","message":"\u003cstring>","details":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"01e94493-4f91-4721-841f-fb7e79616574":{"description":"Too Many Requests - Rate limit exceeded","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"18dccb16-2878-47e9-9755-6bb892a257d9":{"description":"Internal Server Error","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{"2bf1705d-faf3-4009-980b-29f9d7b6b998":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An API key from your Devic console, sent as `Authorization: Bearer \u003ckey>`. An embedded front end sends a tenant-session token instead, so no API key reaches the browser, and an OAuth integration sends its access token. Missing, invalid or expired credentials get a `401`. See [Authentication](/api-reference/introduction#authentication).","scopes":[]}}},"servers":{"e360797e-985a-42f5-b140-d9e4bd40f85b":{"url":"https://api.devic.ai","description":"Production server"},"5c6b8660-0b3a-4bee-8364-9993adaed626":{"url":"https://staging-api.devic.ai","description":"Staging server"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"An API key from your Devic console, sent as `Authorization: Bearer \u003ckey>`. An embedded front end sends a tenant-session token instead, so no API key reaches the browser, and an OAuth integration sends its access token. Missing, invalid or expired credentials get a `401`. See [Authentication](/api-reference/introduction#authentication).","scopes":[]},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"An API key from your Devic console, sent as `Authorization: Bearer \u003ckey>`. An embedded front end sends a tenant-session token instead, so no API key reaches the browser, and an OAuth integration sends its access token. Missing, invalid or expired credentials get a `401`. See [Authentication](/api-reference/introduction#authentication).","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"devic","siteName":"Devic Documentation","title":"Process a message with an assistant - Devic Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-17T08:58:39.939Z","originalFileLocation":"api-reference/endpoint/post-api-v1-assistants-identifier-messages.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Sends one user message to an assistant and returns the turn it produced. Pass chatUid to continue a conversation; leave it out to start one and keep the id that comes back. Synchronous (default). The request is held until the assistant finishes and the response is the array of messages the turn produced — the user message, any tool messages, and the assistant reply — in chronological order. The reply is the last element, and its text is in content.message. Asynchronous (?async=true). The response is an acknowledgement with the chatUid and nothing else. Follow the run with the realtime endpoint (polling) or the stream endpoint (server-sent events). Queueing. An async send that cannot start a run right away is queued on the conversation instead: the acknowledgement carries queued: true and willProcess. Reading queuedMessages from the realtime endpoint tells you whether anything is still waiting. Sending while the conversation is busy requires messageQueueEnabled on the assistant; without it the send is rejected with 409 CHAT_BUSY, and past maxQueuedMessages (50 by default) further sends are rejected with 409 too. Payload-template mode (messageTemplate). Lets a third-party webhook, whose body shape you do not control, point straight at this endpoint: the body is then treated as an opaque payload and the message text is rendered from the template.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Devic Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/devic/oZEAyyhd9yq0DCvd/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/devic/oZEAyyhd9yq0DCvd/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/devic/oZEAyyhd9yq0DCvd/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/devic/oZEAyyhd9yq0DCvd/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/devic/oZEAyyhd9yq0DCvd/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/devic/oZEAyyhd9yq0DCvd/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/devic/oZEAyyhd9yq0DCvd/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/devic/oZEAyyhd9yq0DCvd/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/devic/oZEAyyhd9yq0DCvd/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Process a message with an assistant - Devic Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Sends one user message to an assistant and returns the turn it produced. Pass chatUid to continue a conversation; leave it out to start one and keep the id that comes back. Synchronous (default). The request is held until the assistant finishes and the response is the array of messages the turn produced — the user message, any tool messages, and the assistant reply — in chronological order. The reply is the last element, and its text is in content.message. Asynchronous (?async=true). The response is an acknowledgement with the chatUid and nothing else. Follow the run with the realtime endpoint (polling) or the stream endpoint (server-sent events). Queueing. An async send that cannot start a run right away is queued on the conversation instead: the acknowledgement carries queued: true and willProcess. Reading queuedMessages from the realtime endpoint tells you whether anything is still waiting. Sending while the conversation is busy requires messageQueueEnabled on the assistant; without it the send is rejected with 409 CHAT_BUSY, and past maxQueuedMessages (50 by default) further sends are rejected with 409 too. Payload-template mode (messageTemplate). Lets a third-party webhook, whose body shape you do not control, point straight at this endpoint: the body is then treated as an opaque payload and the message text is rendered from the template.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Devic Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.devic.ai/api-reference/endpoint/post-api-v1-assistants-identifier-messages\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://devic.mintlify.site/_mintlify/api/og/v2?division=Assistants\u0026amp;title=Process+a+message+with+an+assistant\u0026amp;description=Sends+one+user+message+to+an+assistant+and+returns+the+turn+it+produced.+Pass+%60chatUid%60+to+continue+a+conversation%3B+leave+it+out+to+start+one+and+keep+the+id+th\u0026amp;theme=95b260005b3b0c5cfb2d00ae\u0026amp;signature=908ba957ffbc0d7f3adb7b5842ed6a86e8509ecaa278aba0439fbc9942d8c71e\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Process a message with an assistant - Devic Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Sends one user message to an assistant and returns the turn it produced. Pass chatUid to continue a conversation; leave it out to start one and keep the id that comes back. Synchronous (default). The request is held until the assistant finishes and the response is the array of messages the turn produced — the user message, any tool messages, and the assistant reply — in chronological order. The reply is the last element, and its text is in content.message. Asynchronous (?async=true). The response is an acknowledgement with the chatUid and nothing else. Follow the run with the realtime endpoint (polling) or the stream endpoint (server-sent events). Queueing. An async send that cannot start a run right away is queued on the conversation instead: the acknowledgement carries queued: true and willProcess. Reading queuedMessages from the realtime endpoint tells you whether anything is still waiting. Sending while the conversation is busy requires messageQueueEnabled on the assistant; without it the send is rejected with 409 CHAT_BUSY, and past maxQueuedMessages (50 by default) further sends are rejected with 409 too. Payload-template mode (messageTemplate). Lets a third-party webhook, whose body shape you do not control, point straight at this endpoint: the body is then treated as an opaque payload and the message text is rendered from the template.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://devic.mintlify.site/_mintlify/api/og/v2?division=Assistants\u0026amp;title=Process+a+message+with+an+assistant\u0026amp;description=Sends+one+user+message+to+an+assistant+and+returns+the+turn+it+produced.+Pass+%60chatUid%60+to+continue+a+conversation%3B+leave+it+out+to+start+one+and+keep+the+id+th\u0026amp;theme=95b260005b3b0c5cfb2d00ae\u0026amp;signature=908ba957ffbc0d7f3adb7b5842ed6a86e8509ecaa278aba0439fbc9942d8c71e\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/devic/oZEAyyhd9yq0DCvd/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Devic Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#4764E6\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.devic.ai/api-reference/endpoint/post-api-v1-assistants-identifier-messages\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/endpoint/post-api-v1-assistants-identifier-messages.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.devic.ai/#organization\",\"name\":\"Devic Documentation\",\"url\":\"https://docs.devic.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/devic/gabzi_FqrplBFOjV/logo/devic-light.svg?fit=max\u0026auto=format\u0026n=gabzi_FqrplBFOjV\u0026q=85\u0026s=ec3c30fed45bb07177168ad49854c2c5\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.devic.ai#website\",\"name\":\"Devic Documentation\",\"url\":\"https://docs.devic.ai\",\"publisher\":{\"@id\":\"https://docs.devic.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.devic.ai/api-reference/endpoint/post-api-v1-assistants-identifier-messages#webpage\",\"url\":\"https://docs.devic.ai/api-reference/endpoint/post-api-v1-assistants-identifier-messages\",\"name\":\"Process a message with an assistant\",\"description\":\"Sends one user message to an assistant and returns the turn it produced. Pass chatUid to continue a conversation; leave it out to start one and keep the id that comes back. Synchronous (default). The request is held until the assistant finishes and the response is the array of messages the turn produced — the user message, any tool messages, and the assistant reply — in chronological order. The reply is the last element, and its text is in content.message. Asynchronous (?async=true). The response is an acknowledgement with the chatUid and nothing else. Follow the run with the realtime endpoint (polling) or the stream endpoint (server-sent events). Queueing. An async send that cannot start a run right away is queued on the conversation instead: the acknowledgement carries queued: true and willProcess. Reading queuedMessages from the realtime endpoint tells you whether anything is still waiting. Sending while the conversation is busy requires messageQueueEnabled on the assistant; without it the send is rejected with 409 CHAT_BUSY, and past maxQueuedMessages (50 by default) further sends are rejected with 409 too. Payload-template mode (messageTemplate). Lets a third-party webhook, whose body shape you do not control, point straight at this endpoint: the body is then treated as an opaque payload and the message text is rendered from the template.\",\"dateModified\":\"2026-09-17T08:58:39.939Z\",\"isPartOf\":{\"@id\":\"https://docs.devic.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.devic.ai/api-reference/endpoint/post-api-v1-assistants-identifier-messages#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.devic.ai/api-reference/endpoint/post-api-v1-assistants-identifier-messages#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Assistants\",\"item\":\"https://docs.devic.ai/api-reference/endpoint/get-api-v1-assistants\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Process a message with an assistant\",\"item\":\"https://docs.devic.ai/api-reference/endpoint/post-api-v1-assistants-identifier-messages\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.devic.ai/api-reference/endpoint/post-api-v1-assistants-identifier-messages#apireference\",\"headline\":\"Process a message with an assistant\",\"name\":\"Process a message with an assistant\",\"description\":\"Sends one user message to an assistant and returns the turn it produced. Pass chatUid to continue a conversation; leave it out to start one and keep the id that comes back. Synchronous (default). The request is held until the assistant finishes and the response is the array of messages the turn produced — the user message, any tool messages, and the assistant reply — in chronological order. The reply is the last element, and its text is in content.message. Asynchronous (?async=true). The response is an acknowledgement with the chatUid and nothing else. Follow the run with the realtime endpoint (polling) or the stream endpoint (server-sent events). Queueing. An async send that cannot start a run right away is queued on the conversation instead: the acknowledgement carries queued: true and willProcess. Reading queuedMessages from the realtime endpoint tells you whether anything is still waiting. Sending while the conversation is busy requires messageQueueEnabled on the assistant; without it the send is rejected with 409 CHAT_BUSY, and past maxQueuedMessages (50 by default) further sends are rejected with 409 too. Payload-template mode (messageTemplate). Lets a third-party webhook, whose body shape you do not control, point straight at this endpoint: the body is then treated as an opaque payload and the message text is rendered from the template.\",\"url\":\"https://docs.devic.ai/api-reference/endpoint/post-api-v1-assistants-identifier-messages\",\"mainEntityOfPage\":{\"@id\":\"https://docs.devic.ai/api-reference/endpoint/post-api-v1-assistants-identifier-messages#webpage\"},\"dateModified\":\"2026-09-17T08:58:39.939Z\",\"publisher\":{\"@id\":\"https://docs.devic.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.devic.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Devic Documentation\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Devic Documentation\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/endpoint/post-api-v1-assistants-identifier-messages.md","siteName":"Devic Documentation","nav":{"global":null,"tabs":[{"tab":"Devic","pages":[{"title":"Devic","href":"/devic/introduction"}]},{"tab":"API reference","groups":[{"group":"Introduction","pages":[{"title":"Introduction","href":"/api-reference/introduction"}]},{"group":"Agents","pages":[{"title":"List all agents","openapi":"GET /v1/agents","href":"/api-reference/endpoint/get-api-v1-agents"},{"title":"Create a new agent","openapi":"POST /v1/agents","href":"/api-reference/endpoint/post-api-v1-agents"},{"title":"Get agent by ID","openapi":"GET /v1/agents/{agentId}","href":"/api-reference/endpoint/get-api-v1-agents-agentid"},{"title":"Update an agent","openapi":"PATCH /v1/agents/{agentId}","href":"/api-reference/endpoint/patch-api-v1-agents-agentid"},{"title":"Delete an agent","openapi":"DELETE /v1/agents/{agentId}","href":"/api-reference/endpoint/delete-api-v1-agents-agentid"},{"title":"Get unique tags from all agent threads","openapi":"GET /v1/agents/threads/tags","href":"/api-reference/endpoint/get-api-v1-agents-threads-tags"},{"title":"Get a specific thread by ID","openapi":"GET /v1/agents/threads/{threadId}","href":"/api-reference/endpoint/get-api-v1-agents-threads-threadid"},{"title":"Update a thread","openapi":"PATCH /v1/agents/threads/{threadId}","href":"/api-reference/endpoint/patch-api-v1-agents-threads-threadid"},{"title":"Get threads for an agent","openapi":"GET /v1/agents/{agentId}/threads","href":"/api-reference/endpoint/get-api-v1-agents-agentid-threads"},{"title":"Create a new thread for an agent","openapi":"POST /v1/agents/{agentId}/threads","href":"/api-reference/endpoint/post-api-v1-agents-agentid-threads"},{"title":"Get agent evaluation configuration","openapi":"GET /v1/agents/agents/{agentId}/evaluation-config","href":"/api-reference/endpoint/get-api-v1-agents-agents-agentid-evaluation-config"},{"title":"Update agent evaluation configuration","openapi":"PUT /v1/agents/agents/{agentId}/evaluation-config","href":"/api-reference/endpoint/put-api-v1-agents-agents-agentid-evaluation-config"},{"title":"Handle thread approval request","openapi":"POST /v1/agents/threads/{threadId}/approval","href":"/api-reference/endpoint/post-api-v1-agents-threads-threadid-approval"},{"title":"Complete a thread","openapi":"POST /v1/agents/threads/{threadId}/complete","href":"/api-reference/endpoint/post-api-v1-agents-threads-threadid-complete"},{"title":"Evaluate a thread","openapi":"POST /v1/agents/threads/{threadId}/evaluate","href":"/api-reference/endpoint/post-api-v1-agents-threads-threadid-evaluate"},{"title":"Get thread evaluation","openapi":"GET /v1/agents/threads/{threadId}/evaluation","href":"/api-reference/endpoint/get-api-v1-agents-threads-threadid-evaluation"},{"title":"Get all thread evaluations","openapi":"GET /v1/agents/threads/{threadId}/evaluations","href":"/api-reference/endpoint/get-api-v1-agents-threads-threadid-evaluations"},{"title":"Get feedback for a thread","openapi":"GET /v1/agents/threads/{threadId}/feedback","href":"/api-reference/endpoint/get-api-v1-agents-threads-threadid-feedback"},{"title":"Submit feedback for a thread message","openapi":"POST /v1/agents/threads/{threadId}/feedback","href":"/api-reference/endpoint/post-api-v1-agents-threads-threadid-feedback"},{"title":"Continue a thread with a user message","openapi":"POST /v1/agents/threads/{threadId}/messages","href":"/api-reference/endpoint/post-api-v1-agents-threads-threadid-messages"},{"title":"Pause a thread","openapi":"POST /v1/agents/threads/{threadId}/pause","href":"/api-reference/endpoint/post-api-v1-agents-threads-threadid-pause"},{"title":"Resume a thread","openapi":"POST /v1/agents/threads/{threadId}/resume","href":"/api-reference/endpoint/post-api-v1-agents-threads-threadid-resume"},{"title":"Search messages within a thread","openapi":"GET /v1/agents/threads/{threadId}/search","href":"/api-reference/endpoint/get-api-v1-agents-threads-threadid-search"},{"title":"Get daily costs for an agent","openapi":"GET /v1/agents/agents/{agentId}/costs/daily","href":"/api-reference/endpoint/get-api-v1-agents-agents-agentid-costs-daily"},{"title":"Get monthly costs for an agent","openapi":"GET /v1/agents/agents/{agentId}/costs/monthly","href":"/api-reference/endpoint/get-api-v1-agents-agents-agentid-costs-monthly"},{"title":"Get cost summary for an agent","openapi":"GET /v1/agents/agents/{agentId}/costs/summary","href":"/api-reference/endpoint/get-api-v1-agents-agents-agentid-costs-summary"},{"title":"Get unique tags from agent threads","openapi":"GET /v1/agents/agents/{agentId}/threads/tags","href":"/api-reference/endpoint/get-api-v1-agents-agents-agentid-threads-tags"},{"title":"Get specific thread evaluation by ID","openapi":"GET /v1/agents/threads/{threadId}/evaluations/{evaluationId}","href":"/api-reference/endpoint/get-api-v1-agents-threads-threadid-evaluations-evaluationid"}]},{"group":"Assistants","pages":[{"title":"Get all available assistant specializations","openapi":"GET /v1/assistants","href":"/api-reference/endpoint/get-api-v1-assistants"},{"title":"Create a new assistant","openapi":"POST /v1/assistants","href":"/api-reference/endpoint/post-api-v1-assistants"},{"title":"Get all chat histories with filters","openapi":"POST /v1/assistants/chats","href":"/api-reference/endpoint/post-api-v1-assistants-chats"},{"title":"Get unique tags from chat histories","openapi":"GET /v1/assistants/tags","href":"/api-reference/endpoint/get-api-v1-assistants-tags"},{"title":"Get a specific assistant specialization","openapi":"GET /v1/assistants/{identifier}","href":"/api-reference/endpoint/get-api-v1-assistants-identifier"},{"title":"Update an assistant","openapi":"PATCH /v1/assistants/{identifier}","href":"/api-reference/endpoint/patch-api-v1-assistants-identifier"},{"title":"Delete an assistant","openapi":"DELETE /v1/assistants/{identifier}","href":"/api-reference/endpoint/delete-api-v1-assistants-identifier"},{"title":"Get chat histories for an assistant","openapi":"GET /v1/assistants/{identifier}/chats","description":"A page of the conversations held with one assistant, newest first. Ask for `omitContent=true` when you only need to list them: it leaves `chatContent` out, which is most of the payload.","href":"/api-reference/endpoint/get-api-v1-assistants-identifier-chats"},{"title":"Process a message with an assistant","openapi":"POST /v1/assistants/{identifier}/messages","href":"/api-reference/endpoint/post-api-v1-assistants-identifier-messages"},{"title":"Get chat history for a conversation","openapi":"GET /v1/assistants/{identifier}/chats/{chatUid}","description":"One conversation with all its messages, plus the model, tokens, cost and the memory or compaction events it went through. 404 when the conversation does not exist or belongs to another assistant.","href":"/api-reference/endpoint/get-api-v1-assistants-identifier-chats-chatuid"},{"title":"Get feedback for a chat","openapi":"GET /v1/assistants/{identifier}/chats/{chatUid}/feedback","href":"/api-reference/endpoint/get-api-v1-assistants-identifier-chats-chatuid-feedback"},{"title":"Submit feedback for a chat message","openapi":"POST /v1/assistants/{identifier}/chats/{chatUid}/feedback","href":"/api-reference/endpoint/post-api-v1-assistants-identifier-chats-chatuid-feedback"},{"title":"Search messages within a chat","openapi":"GET /v1/assistants/{identifier}/chats/{chatUid}/search","href":"/api-reference/endpoint/get-api-v1-assistants-identifier-chats-chatuid-search"},{"title":"Stop an in-progress async chat","openapi":"POST /v1/assistants/{identifier}/chats/{chatUid}/stop","href":"/api-reference/endpoint/post-api-v1-assistants-identifier-chats-chatuid-stop"},{"title":"Submit tool responses (Model Interface Protocol)","openapi":"POST /v1/assistants/{identifier}/chats/{chatUid}/tool-response","href":"/api-reference/endpoint/post-api-v1-assistants-identifier-chats-chatuid-tool-response"},{"title":"Get real-time chat history","openapi":"GET /v1/assistants/{identifier}/chats/{chatUid}/realtime","href":"/api-reference/endpoint/get-api-v1-assistants-identifier-chats-chatuid-realtime"},{"title":"Follow real-time chat history (SSE)","openapi":"GET /v1/assistants/{identifier}/chats/{chatUid}/stream","href":"/api-reference/endpoint/get-api-v1-assistants-identifier-chats-chatuid-stream"}]},{"group":"Memory","pages":[{"title":"Core memory entries of the assistant’s bucket","openapi":"GET /v1/memory/assistants/{identifier}/core","href":"/api-reference/endpoint/get-api-v1-memory-assistants-identifier-core"},{"title":"Add a core memory entry","openapi":"POST /v1/memory/assistants/{identifier}/core","href":"/api-reference/endpoint/post-api-v1-memory-assistants-identifier-core"},{"title":"Edit a core memory entry","openapi":"PATCH /v1/memory/assistants/{identifier}/core/{entryId}","href":"/api-reference/endpoint/patch-api-v1-memory-assistants-identifier-core-entryid"},{"title":"Remove a core memory entry","openapi":"DELETE /v1/memory/assistants/{identifier}/core/{entryId}","href":"/api-reference/endpoint/delete-api-v1-memory-assistants-identifier-core-entryid"}]},{"group":"Tool Servers","pages":[{"title":"List all tool servers","openapi":"GET /v1/tool-servers","href":"/api-reference/endpoint/get-api-v1-tool-servers"},{"title":"Create a new tool server","openapi":"POST /v1/tool-servers","href":"/api-reference/endpoint/post-api-v1-tool-servers"},{"title":"Get tool server by ID","openapi":"GET /v1/tool-servers/{toolServerId}","href":"/api-reference/endpoint/get-api-v1-tool-servers-toolserverid"},{"title":"Update tool server","openapi":"PATCH /v1/tool-servers/{toolServerId}","href":"/api-reference/endpoint/patch-api-v1-tool-servers-toolserverid"},{"title":"Delete tool server","openapi":"DELETE /v1/tool-servers/{toolServerId}","href":"/api-reference/endpoint/delete-api-v1-tool-servers-toolserverid"},{"title":"Clone a tool server","openapi":"POST /v1/tool-servers/{toolServerId}/clone","href":"/api-reference/endpoint/post-api-v1-tool-servers-toolserverid-clone"},{"title":"Get tool server definition","openapi":"GET /v1/tool-servers/{toolServerId}/definition","href":"/api-reference/endpoint/get-api-v1-tool-servers-toolserverid-definition"},{"title":"Update tool server definition","openapi":"PATCH /v1/tool-servers/{toolServerId}/definition","href":"/api-reference/endpoint/patch-api-v1-tool-servers-toolserverid-definition"},{"title":"Get all tools in a tool server","openapi":"GET /v1/tool-servers/{toolServerId}/tools","href":"/api-reference/endpoint/get-api-v1-tool-servers-toolserverid-tools"},{"title":"Add a tool to a tool server","openapi":"POST /v1/tool-servers/{toolServerId}/tools","href":"/api-reference/endpoint/post-api-v1-tool-servers-toolserverid-tools"},{"title":"Get a specific tool by name","openapi":"GET /v1/tool-servers/{toolServerId}/tools/{toolName}","href":"/api-reference/endpoint/get-api-v1-tool-servers-toolserverid-tools-toolname"},{"title":"Update a tool by name","openapi":"PATCH /v1/tool-servers/{toolServerId}/tools/{toolName}","href":"/api-reference/endpoint/patch-api-v1-tool-servers-toolserverid-tools-toolname"},{"title":"Delete a tool by name","openapi":"DELETE /v1/tool-servers/{toolServerId}/tools/{toolName}","href":"/api-reference/endpoint/delete-api-v1-tool-servers-toolserverid-tools-toolname"},{"title":"Test a tool call","openapi":"POST /v1/tool-servers/{toolServerId}/tools/{toolName}/test","href":"/api-reference/endpoint/post-api-v1-tool-servers-toolserverid-tools-toolname-test"}]},{"group":"MCP Gateway","pages":[{"title":"List visibility profiles","openapi":"GET /v1/tool-servers/{toolServerId}/profiles","href":"/api-reference/endpoint/get-api-v1-tool-servers-toolserverid-profiles"},{"title":"Create a visibility profile","openapi":"POST /v1/tool-servers/{toolServerId}/profiles","href":"/api-reference/endpoint/post-api-v1-tool-servers-toolserverid-profiles"},{"title":"List per-user access","openapi":"GET /v1/tool-servers/{toolServerId}/users","href":"/api-reference/endpoint/get-api-v1-tool-servers-toolserverid-users"},{"title":"Update a visibility profile","openapi":"PATCH /v1/tool-servers/{toolServerId}/profiles/{profileId}","href":"/api-reference/endpoint/patch-api-v1-tool-servers-toolserverid-profiles-profileid"},{"title":"Delete a visibility profile","openapi":"DELETE /v1/tool-servers/{toolServerId}/profiles/{profileId}","href":"/api-reference/endpoint/delete-api-v1-tool-servers-toolserverid-profiles-profileid"},{"title":"Set a user’s access and visibility","openapi":"PATCH /v1/tool-servers/{toolServerId}/users/{userUID}","href":"/api-reference/endpoint/patch-api-v1-tool-servers-toolserverid-users-useruid"},{"title":"Remove a user’s access row","openapi":"DELETE /v1/tool-servers/{toolServerId}/users/{userUID}","href":"/api-reference/endpoint/delete-api-v1-tool-servers-toolserverid-users-useruid"}]},{"group":"Integrations","pages":[{"title":"List connectable apps","openapi":"GET /v1/integrations","href":"/api-reference/endpoint/get-api-v1-integrations"},{"title":"List connected integrations","openapi":"GET /v1/integrations/connected","href":"/api-reference/endpoint/get-api-v1-integrations-connected"},{"title":"Get a connectable app","openapi":"GET /v1/integrations/{app}","href":"/api-reference/endpoint/get-api-v1-integrations-app"},{"title":"How an app can be connected","openapi":"GET /v1/integrations/{app}/auth","href":"/api-reference/endpoint/get-api-v1-integrations-app-auth"},{"title":"Connect an account","openapi":"POST /v1/integrations/{app}/connect","href":"/api-reference/endpoint/post-api-v1-integrations-app-connect"},{"title":"Whether an account is connected","openapi":"GET /v1/integrations/{app}/connection-status","href":"/api-reference/endpoint/get-api-v1-integrations-app-connection-status"},{"title":"Build a tool server from a connected account","openapi":"POST /v1/integrations/{app}/servers","href":"/api-reference/endpoint/post-api-v1-integrations-app-servers"},{"title":"List an app’s event types","openapi":"GET /v1/integrations/{app}/triggers","href":"/api-reference/endpoint/get-api-v1-integrations-app-triggers"},{"title":"List a connected integration’s tools","openapi":"GET /v1/integrations/servers/{id}/tools","href":"/api-reference/endpoint/get-api-v1-integrations-servers-id-tools"},{"title":"Change which tools a connected integration exposes","openapi":"PATCH /v1/integrations/servers/{id}/tools","href":"/api-reference/endpoint/patch-api-v1-integrations-servers-id-tools"},{"title":"Get an event type","openapi":"GET /v1/integrations/{app}/triggers/{slug}","href":"/api-reference/endpoint/get-api-v1-integrations-app-triggers-slug"},{"title":"Test one of a connected integration’s tools","openapi":"POST /v1/integrations/servers/{id}/tools/{toolName}/test","href":"/api-reference/endpoint/post-api-v1-integrations-servers-id-tools-toolname-test"}]},{"group":"Triggers","pages":[{"title":"List triggers","openapi":"GET /v1/triggers","href":"/api-reference/endpoint/get-api-v1-triggers"},{"title":"Create a trigger","openapi":"POST /v1/triggers","href":"/api-reference/endpoint/post-api-v1-triggers"},{"title":"Get a trigger","openapi":"GET /v1/triggers/{id}","href":"/api-reference/endpoint/get-api-v1-triggers-id"},{"title":"Update a trigger","openapi":"PATCH /v1/triggers/{id}","href":"/api-reference/endpoint/patch-api-v1-triggers-id"},{"title":"Delete a trigger","openapi":"DELETE /v1/triggers/{id}","href":"/api-reference/endpoint/delete-api-v1-triggers-id"},{"title":"List a trigger’s recent deliveries","openapi":"GET /v1/triggers/{id}/events","href":"/api-reference/endpoint/get-api-v1-triggers-id-events"}]},{"group":"Projects","pages":[{"title":"List all projects","openapi":"GET /v1/projects","href":"/api-reference/endpoint/get-api-v1-projects"},{"title":"Create a new project","openapi":"POST /v1/projects","href":"/api-reference/endpoint/post-api-v1-projects"},{"title":"Get a project by ID","openapi":"GET /v1/projects/{projectId}","href":"/api-reference/endpoint/get-api-v1-projects-projectid"},{"title":"Update a project","openapi":"PATCH /v1/projects/{projectId}","href":"/api-reference/endpoint/patch-api-v1-projects-projectid"},{"title":"Archive a project","openapi":"DELETE /v1/projects/{projectId}","href":"/api-reference/endpoint/delete-api-v1-projects-projectid"},{"title":"List project assistant conversations","openapi":"GET /v1/projects/{projectId}/conversations","href":"/api-reference/endpoint/get-api-v1-projects-projectid-conversations"},{"title":"Get project stats summary","openapi":"GET /v1/projects/{projectId}/stats","href":"/api-reference/endpoint/get-api-v1-projects-projectid-stats"},{"title":"List project agent threads","openapi":"GET /v1/projects/{projectId}/threads","href":"/api-reference/endpoint/get-api-v1-projects-projectid-threads"},{"title":"Get daily costs for a project","openapi":"GET /v1/projects/{projectId}/costs/daily","href":"/api-reference/endpoint/get-api-v1-projects-projectid-costs-daily"},{"title":"Get monthly costs for a project","openapi":"GET /v1/projects/{projectId}/costs/monthly","href":"/api-reference/endpoint/get-api-v1-projects-projectid-costs-monthly"}]},{"group":"Tenants","pages":[{"title":"List tenants","openapi":"GET /v1/tenants","href":"/api-reference/endpoint/get-api-v1-tenants"},{"title":"Get a tenant","openapi":"GET /v1/tenants/{tenantId}","href":"/api-reference/endpoint/get-api-v1-tenants-tenantid"},{"title":"Update a tenant","openapi":"PATCH /v1/tenants/{tenantId}","href":"/api-reference/endpoint/patch-api-v1-tenants-tenantid"},{"title":"Delete a tenant","openapi":"DELETE /v1/tenants/{tenantId}","href":"/api-reference/endpoint/delete-api-v1-tenants-tenantid"},{"title":"Get tenant costs","openapi":"GET /v1/tenants/{tenantId}/costs","href":"/api-reference/endpoint/get-api-v1-tenants-tenantid-costs"},{"title":"Get tenant stats","openapi":"GET /v1/tenants/{tenantId}/stats","href":"/api-reference/endpoint/get-api-v1-tenants-tenantid-stats"},{"title":"List subtenants","openapi":"GET /v1/tenants/{tenantId}/subtenants","href":"/api-reference/endpoint/get-api-v1-tenants-tenantid-subtenants"},{"title":"Get a subtenant","openapi":"GET /v1/tenants/{tenantId}/subtenants/{subtenantId}","href":"/api-reference/endpoint/get-api-v1-tenants-tenantid-subtenants-subtenantid"},{"title":"Update a subtenant (name, avatar)","openapi":"PATCH /v1/tenants/{tenantId}/subtenants/{subtenantId}","href":"/api-reference/endpoint/patch-api-v1-tenants-tenantid-subtenants-subtenantid"}]},{"group":"Tenant Sessions","pages":[{"title":"Issue a tenant session","openapi":"POST /api/v1/tenant-sessions","href":"/api-reference/endpoint/post-api-v1-tenant-sessions"}]},{"group":"Tenant Integrations","pages":[{"title":"List the apps this assistant offers, with my connection status","openapi":"GET /v1/tenant-integrations","href":"/api-reference/endpoint/get-api-v1-tenant-integrations"},{"title":"Re-read my connections now","openapi":"POST /v1/tenant-integrations/refresh","href":"/api-reference/endpoint/post-api-v1-tenant-integrations-refresh"},{"title":"Disconnect one of my accounts","openapi":"DELETE /v1/tenant-integrations/accounts/{accountId}","href":"/api-reference/endpoint/delete-api-v1-tenant-integrations-accounts-accountid"},{"title":"My connected accounts for one app","openapi":"GET /v1/tenant-integrations/{app}/accounts","href":"/api-reference/endpoint/get-api-v1-tenant-integrations-app-accounts"},{"title":"What connecting this app asks of me","openapi":"GET /v1/tenant-integrations/{app}/auth","href":"/api-reference/endpoint/get-api-v1-tenant-integrations-app-auth"},{"title":"Connect one of my accounts","openapi":"POST /v1/tenant-integrations/{app}/connect","href":"/api-reference/endpoint/post-api-v1-tenant-integrations-app-connect"}]},{"group":"Tenant Usage","pages":[{"title":"List tiers (plans)","openapi":"GET /v1/tenant-usage/tiers","href":"/api-reference/endpoint/get-api-v1-tenant-usage-tiers"},{"title":"Get tenant usage \u0026 limits","openapi":"GET /v1/tenant-usage/{tenantId}","href":"/api-reference/endpoint/get-api-v1-tenant-usage-tenantid"},{"title":"Get tenant usage history","openapi":"GET /v1/tenant-usage/{tenantId}/history","href":"/api-reference/endpoint/get-api-v1-tenant-usage-tenantid-history"},{"title":"Get subtenant usage \u0026 limits","openapi":"GET /v1/tenant-usage/{tenantId}/subtenants/{subtenantId}","href":"/api-reference/endpoint/get-api-v1-tenant-usage-tenantid-subtenants-subtenantid"},{"title":"Get subtenant usage history","openapi":"GET /v1/tenant-usage/{tenantId}/subtenants/{subtenantId}/history","href":"/api-reference/endpoint/get-api-v1-tenant-usage-tenantid-subtenants-subtenantid-history"}]},{"group":"Tenant Admin","pages":[{"title":"Add usage to a tenant","openapi":"POST /v1/tenant-admin/{tenantId}/add-usage","href":"/api-reference/endpoint/post-api-v1-tenant-admin-tenantid-add-usage"},{"title":"Add usage to a subtenant","openapi":"POST /v1/tenant-admin/{tenantId}/subtenants/{subtenantId}/add-usage","href":"/api-reference/endpoint/post-api-v1-tenant-admin-tenantid-subtenants-subtenantid-add-usage"},{"title":"Change a tenant tier (plan)","openapi":"POST /v1/tenant-admin/{tenantId}/tier","href":"/api-reference/endpoint/post-api-v1-tenant-admin-tenantid-tier"},{"title":"Reset tenant usage counters","openapi":"POST /v1/tenant-admin/{tenantId}/usage-limits/reset","href":"/api-reference/endpoint/post-api-v1-tenant-admin-tenantid-usage-limits-reset"},{"title":"Change a subtenant tier (plan)","openapi":"POST /v1/tenant-admin/{tenantId}/subtenants/{subtenantId}/tier","href":"/api-reference/endpoint/post-api-v1-tenant-admin-tenantid-subtenants-subtenantid-tier"},{"title":"Reset subtenant usage counters","openapi":"POST /v1/tenant-admin/{tenantId}/subtenants/{subtenantId}/usage-limits/reset","href":"/api-reference/endpoint/post-api-v1-tenant-admin-tenantid-subtenants-subtenantid-usage-limits-reset"}]},{"group":"Knowledge","pages":[{"title":"List document folders","openapi":"GET /v1/document-folders","href":"/api-reference/endpoint/get-api-v1-document-folders"},{"title":"Create a document folder","openapi":"POST /v1/document-folders","href":"/api-reference/endpoint/post-api-v1-document-folders"},{"title":"List documents","openapi":"GET /v1/documents","href":"/api-reference/endpoint/get-api-v1-documents"},{"title":"Create a markdown document","openapi":"POST /v1/documents","href":"/api-reference/endpoint/post-api-v1-documents"},{"title":"Update a document folder","openapi":"PATCH /v1/document-folders/{id}","href":"/api-reference/endpoint/patch-api-v1-document-folders-id"},{"title":"Delete a document folder","openapi":"DELETE /v1/document-folders/{id}","href":"/api-reference/endpoint/delete-api-v1-document-folders-id"},{"title":"Get document graph","openapi":"GET /v1/documents/graph","href":"/api-reference/endpoint/get-api-v1-documents-graph"},{"title":"Get a document by ID","openapi":"GET /v1/documents/{id}","href":"/api-reference/endpoint/get-api-v1-documents-id"},{"title":"Update a document","openapi":"PATCH /v1/documents/{id}","href":"/api-reference/endpoint/patch-api-v1-documents-id"},{"title":"Delete a document","openapi":"DELETE /v1/documents/{id}","href":"/api-reference/endpoint/delete-api-v1-documents-id"},{"title":"Attach a folder to an agent or assistant","openapi":"POST /v1/document-folders/{folderId}/attach","href":"/api-reference/endpoint/post-api-v1-document-folders-folderid-attach"},{"title":"Detach a folder from an agent or assistant","openapi":"POST /v1/document-folders/{folderId}/detach","href":"/api-reference/endpoint/post-api-v1-document-folders-folderid-detach"},{"title":"Attach a document to an agent or assistant","openapi":"POST /v1/documents/{id}/attach","href":"/api-reference/endpoint/post-api-v1-documents-id-attach"},{"title":"Detach a document from an agent or assistant","openapi":"POST /v1/documents/{id}/detach","href":"/api-reference/endpoint/post-api-v1-documents-id-detach"},{"title":"List subdocuments","openapi":"GET /v1/documents/{id}/subdocuments","href":"/api-reference/endpoint/get-api-v1-documents-id-subdocuments"},{"title":"Get document usage","openapi":"GET /v1/documents/{id}/usage","href":"/api-reference/endpoint/get-api-v1-documents-id-usage"},{"title":"List document versions","openapi":"GET /v1/documents/{id}/versions","href":"/api-reference/endpoint/get-api-v1-documents-id-versions"},{"title":"Revert a document to a previous version","openapi":"POST /v1/documents/{id}/revert/{version}","href":"/api-reference/endpoint/post-api-v1-documents-id-revert-version"},{"title":"Get a document version","openapi":"GET /v1/documents/{id}/versions/{version}","href":"/api-reference/endpoint/get-api-v1-documents-id-versions-version"}]},{"group":"Skills","pages":[{"title":"List the skills catalog (documents + folders)","openapi":"GET /v1/documents/skills","href":"/api-reference/endpoint/get-api-v1-documents-skills"},{"title":"Scaffold a folder-skill (folder + SKILL.md manifest)","openapi":"POST /v1/documents/skills/scaffold","href":"/api-reference/endpoint/post-api-v1-documents-skills-scaffold"},{"title":"List distinct skill/document tags","openapi":"GET /v1/documents/skills/tags","href":"/api-reference/endpoint/get-api-v1-documents-skills-tags"},{"title":"Download a skill tree (files with relative paths + content)","openapi":"GET /v1/documents/skills/{id}/tree","href":"/api-reference/endpoint/get-api-v1-documents-skills-id-tree"},{"title":"Record that a skill was uninstalled locally (CLI)","openapi":"DELETE /v1/documents/skills/{id}/install","href":"/api-reference/endpoint/delete-api-v1-documents-skills-id-install"},{"title":"Download a skill tree and record the install (CLI)","openapi":"POST /v1/documents/skills/{id}/install","href":"/api-reference/endpoint/post-api-v1-documents-skills-id-install"}]},{"group":"Files","pages":[{"title":"Upload a file","openapi":"POST /v1/files/upload","href":"/api-reference/endpoint/post-api-v1-files-upload"}]},{"group":"Speech to Text","pages":[{"title":"Transcribe audio (speech-to-text)","openapi":"POST /v1/whisper","href":"/api-reference/endpoint/post-api-v1-whisper"},{"title":"Get a transcript by id","openapi":"GET /v1/whisper/{transcriptId}","href":"/api-reference/endpoint/get-api-v1-whisper-transcriptid"}]},{"group":"Environments","pages":[{"title":"List environments","openapi":"GET /v1/environments","href":"/api-reference/endpoint/get-api-v1-environments"},{"title":"Create an environment","openapi":"POST /v1/environments","href":"/api-reference/endpoint/post-api-v1-environments"},{"title":"Delete an environment","openapi":"DELETE /v1/environments/{environmentId}","href":"/api-reference/endpoint/delete-api-v1-environments-environmentid"},{"title":"Get an environment by id","openapi":"GET /v1/environments/{environmentId}","href":"/api-reference/endpoint/get-api-v1-environments-environmentid"},{"title":"Update an environment","openapi":"PATCH /v1/environments/{environmentId}","href":"/api-reference/endpoint/patch-api-v1-environments-environmentid"},{"title":"List the agents and assistants connected to an environment","openapi":"GET /v1/environments/{environmentId}/connections","href":"/api-reference/endpoint/get-api-v1-environments-environmentid-connections"},{"title":"Disconnect an agent or assistant from its environment","openapi":"DELETE /v1/environments/{environmentId}/connections/{entityType}/{entityId}","href":"/api-reference/endpoint/delete-api-v1-environments-environmentid-connections-entitytype-entityid"},{"title":"Connect an agent or assistant to an environment","openapi":"PUT /v1/environments/{environmentId}/connections/{entityType}/{entityId}","href":"/api-reference/endpoint/put-api-v1-environments-environmentid-connections-entitytype-entityid"},{"title":"Bake (or re-bake) the environment snapshot","openapi":"POST /v1/environments/{environmentId}/snapshot/initialize","href":"/api-reference/endpoint/post-api-v1-environments-environmentid-snapshot-initialize"},{"title":"List the per-tenant snapshots derived from this environment","openapi":"GET /v1/environments/{environmentId}/tenant-snapshots","href":"/api-reference/endpoint/get-api-v1-environments-environmentid-tenant-snapshots"},{"title":"Post api v1 environments environmentid tenant snapshots tenantid initialize","href":"/api-reference/endpoint/post-api-v1-environments-environmentid-tenant-snapshots-tenantid-initialize"},{"title":"Delete api v1 environments environmentid tenant snapshots tenantid","href":"/api-reference/endpoint/delete-api-v1-environments-environmentid-tenant-snapshots-tenantid"},{"title":"List the sandbox sessions run on this environment","openapi":"GET /v1/environments/{environmentId}/sessions","href":"/api-reference/endpoint/get-api-v1-environments-environmentid-sessions"},{"title":"Get the most recent session, reconciled against the engine","openapi":"GET /v1/environments/{environmentId}/sessions/last","href":"/api-reference/endpoint/get-api-v1-environments-environmentid-sessions-last"},{"title":"Get one session with its command log","openapi":"GET /v1/environments/{environmentId}/sessions/{sessionId}","href":"/api-reference/endpoint/get-api-v1-environments-environmentid-sessions-sessionid"},{"title":"List the CLIs installed on this environment","openapi":"GET /v1/environments/{environmentId}/clis","href":"/api-reference/endpoint/get-api-v1-environments-environmentid-clis"}]},{"group":"Sandboxes","pages":[{"title":"Start a sandbox session","openapi":"POST /v1/environments/{environmentId}/sandbox/start","href":"/api-reference/endpoint/post-api-v1-environments-environmentid-sandbox-start"},{"title":"Whether a session is live on this environment","openapi":"GET /v1/environments/{environmentId}/sandbox/status","href":"/api-reference/endpoint/get-api-v1-environments-environmentid-sandbox-status"},{"title":"Run a command in the sandbox","openapi":"POST /v1/environments/{environmentId}/sandbox/exec","href":"/api-reference/endpoint/post-api-v1-environments-environmentid-sandbox-exec"},{"title":"Stop the session","openapi":"POST /v1/environments/{environmentId}/sandbox/stop","href":"/api-reference/endpoint/post-api-v1-environments-environmentid-sandbox-stop"},{"title":"List a directory inside the sandbox","openapi":"POST /v1/environments/{environmentId}/sandbox/files/list","href":"/api-reference/endpoint/post-api-v1-environments-environmentid-sandbox-files-list"},{"title":"Read a text file from the sandbox","openapi":"POST /v1/environments/{environmentId}/sandbox/files/read","href":"/api-reference/endpoint/post-api-v1-environments-environmentid-sandbox-files-read"},{"title":"Write a file into the sandbox","openapi":"POST /v1/environments/{environmentId}/sandbox/files/write","href":"/api-reference/endpoint/post-api-v1-environments-environmentid-sandbox-files-write"}]},{"group":"Tenant MCP","pages":[{"title":"The MCP servers this assistant offers me, and the ones I connected","openapi":"GET /v1/tenant-mcp","href":"/api-reference/endpoint/get-api-v1-tenant-mcp"},{"title":"Connect an MCP server","openapi":"POST /v1/tenant-mcp","href":"/api-reference/endpoint/post-api-v1-tenant-mcp"},{"title":"Disconnect an MCP server","openapi":"DELETE /v1/tenant-mcp/{id}","href":"/api-reference/endpoint/delete-api-v1-tenant-mcp-id"},{"title":"One of my MCP servers","openapi":"GET /v1/tenant-mcp/{id}","href":"/api-reference/endpoint/get-api-v1-tenant-mcp-id"},{"title":"Rename one of my MCP servers","openapi":"PATCH /v1/tenant-mcp/{id}","href":"/api-reference/endpoint/patch-api-v1-tenant-mcp-id"},{"title":"The tools this server exposes","openapi":"GET /v1/tenant-mcp/{id}/tools","href":"/api-reference/endpoint/get-api-v1-tenant-mcp-id-tools"},{"title":"Authorize again","openapi":"POST /v1/tenant-mcp/{id}/reconnect","href":"/api-reference/endpoint/post-api-v1-tenant-mcp-id-reconnect"}]},{"group":"Documentation","pages":[{"title":"Documentation index page","openapi":"GET /v1/docs","href":"/api-reference/endpoint/get-api-v1-docs"},{"title":"Get rendered markdown documentation page","openapi":"GET /v1/docs/{filename}","href":"/api-reference/endpoint/get-api-v1-docs-filename"},{"title":"Get raw markdown documentation file","openapi":"GET /v1/docs/{filename}.md","href":"/api-reference/endpoint/get-api-v1-docs-filename-md"}]},{"group":"Health","pages":[{"title":"Health check endpoint","openapi":"GET /v1/health","href":"/api-reference/endpoint/get-api-v1-health"}]}]}]},"basePath":"","title":"Process a message with an assistant - Devic Documentation","buildId":"dpl_5joLUXmnJgwqjrHAS4dxZrQTdxgh","deploymentId":"dpl_5joLUXmnJgwqjrHAS4dxZrQTdxgh","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DPDWPCdE.js","utils-DyjUHyLo.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BWYE1cdS.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-COAzxpEw.js","snippetPresets-DNiD_S52.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-CjwVt80x.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-ByHQMk7z.js","shallow-CaZuw1AO.js","getApiPlaygroundDisplay-DPVPOknm.js","CodeSnippet-B31CH-Mp.js","CodeSnippets-BxTYZWz6.js","Page-DDHbuAIY.js","getPastedJson-DhoAwiNO.js","icon-Dhq8z75J.js","MethodPill-DLXmKOwr.js","DuplicateIcon-jzdVwyRU.js","createIcon-eD0b3klN.js","DynamicMarkdown-BfddVCX7.js","SectionHeading-2pSCIo17.js","axios-vUo_bRtp.js","Markdown-DsWjhwJ4.js","clsx-B2t_mZQG.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CUljsAY7.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Cf70306N.js"]}