Skip to main content
GET
/
chat
/
conversation
/
{conversation_id}
/
cURL
curl --request GET \
  --url https://api-prod.voltai.ai/chat/conversation/{conversation_id}/ \
  --header 'x-api-key: <api-key>'
{
  "final_answer": "<string>",
  "thinking": "<string>",
  "chat_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "chat_url": "<string>",
  "conversation_id": 123,
  "sources": [
    {
      "source_name": "<string>",
      "page": 123,
      "url": "<string>",
      "id": "<string>",
      "type": "<string>",
      "display_name": "<string>"
    }
  ],
  "mode": "<string>",
  "tools": [
    {
      "id": "<string>",
      "name": "<string>",
      "display_name": "<string>",
      "title": "<string>",
      "input": {},
      "output": "<string>",
      "subagent_instance_id": "<string>"
    }
  ],
  "content": [
    {
      "type": "text",
      "text": "<string>",
      "subagent_instance_id": "<string>"
    }
  ]
}
Use GET /chat/conversation/{conversation_id}/ to retrieve a single question/answer turn that was created by an earlier POST /chat/query/ call. The response uses the same shape as the non-streaming /chat/query/ response, so the same client code that consumes a fresh agent answer can also display a stored one. Send your API key in the X-API-KEY header. The only input is the conversation_id path parameter.

When to use

  • Re-fetch after a stream disconnect. If an SSE client lost the connection mid-stream, the agent pipeline still finishes and persists the result. Call this endpoint with the conversation_id from the start event to retrieve the final answer.
  • Re-display a prior turn without re-running the agent.
  • Async workflows that hand the conversation_id between systems.

Where to get a conversation_id

Every POST /chat/query/ response includes a conversation_id:
  • In the JSON response body (conversation_id field).
  • In both the SSE start and done events when streaming.
A new conversation_id is assigned for every /chat/query/ call, including follow-ups inside the same chat_id.

Response Notes

  • The response body matches POST /chat/query/ (JSON path) field-for-field: final_answer, thinking, chat_id, chat_url, conversation_id, sources, mode, tools, content.
  • final_answer is recovered from the persisted answer text and cleaned the same way the live path cleans it (<answer>, <ref>, <abbr>, and citation markup are stripped).
  • tools and content reproduce the agent’s reasoning trail: every tool call the agent made (with its arguments, output, and status) plus the ordered text/tool transcript. These are populated from the stored conversation state.
  • sources includes the same per-entry id, type, display_name, and (for paginated docs) page fields as the live /chat/query/ response.
  • thinking is populated from the legacy agent-logs side panel when the turn was answered by the legacy orchestrator; for turns produced by the current agent pipeline it is always "" (inspect tools / content instead).
  • mode reflects the value echoed back when the conversation was answered.
  • The endpoint is read-only. It does not run the agent, does not consume floating-session capacity, and is not subject to the per-(API key, user_id) concurrency limit.
  • Returns 404 if no conversation with this ID exists in the API key’s organization (including conversations whose chat has been deleted).

Example Response

{
  "final_answer": "EMEM is embedded memory integrated into the device for storing code and data.",
  "thinking": "",
  "chat_id": "2d8a39d8-29d6-4f0f-bc5f-4c5f0f9c9d54",
  "chat_url": "https://voltai.ai/ExampleOrg/chat/2d8a39d8-29d6-4f0f-bc5f-4c5f0f9c9d54",
  "conversation_id": 184217,
  "sources": [
    {
      "id": "0351-E1",
      "source_name": "example-datasheet.pdf",
      "page": 12,
      "type": "text",
      "url": "https://voltai.ai/ExampleOrg/library?source_name=example-datasheet.pdf&source_type=text&source_page=12",
      "display_name": "Library Search"
    }
  ],
  "mode": "AUTO",
  "tools": [
    {
      "id": "call_8c2f",
      "name": "search_library",
      "display_name": "Library Search",
      "title": "Searching \"EMEM\" in Datasheets",
      "input": { "query": "EMEM", "topic_id": 17 },
      "output": "Found 3 matching chunks…",
      "status": "success",
      "subagent_instance_id": null
    }
  ],
  "content": [
    {
      "type": "tool",
      "id": "call_8c2f",
      "name": "search_library",
      "display_name": "Library Search",
      "title": "Searching \"EMEM\" in Datasheets",
      "input": { "query": "EMEM", "topic_id": 17 },
      "output": "Found 3 matching chunks…",
      "status": "success",
      "subagent_instance_id": null
    },
    {
      "type": "text",
      "text": "EMEM is embedded memory integrated into the device for storing code and data.",
      "subagent_instance_id": null
    }
  ]
}

Authorizations

x-api-key
string
header
required

Path Parameters

conversation_id
integer
required

The integer identifier returned in conversation_id from a prior /chat/query/ response (or the start / done SSE events).

Response

Stored conversation, in the same shape as the JSON response from POST /chat/query/.

Agent response.

final_answer
string
required

Cleaned answer text returned by the agent. Internal markup (<answer>, <ref>, <abbr>, citation tokens) is stripped.

thinking
string
required

Aggregated reasoning string from the legacy multi-agent orchestrator: per-agent entries are concatenated in execution order, each prefixed by a header line and separated by a blank line. Empty under the current agent pipeline — use tools and content to inspect the reasoning trail instead.

chat_id
string<uuid>
required

Thread identifier: the Chat UUID for this conversation. Reuse this value in subsequent requests to continue the same thread.

chat_url
string<uri>
required

Web UI link to this thread: https://voltai.ai/{organization_name}/chat/{chat_id} using the resolved organization's name.

conversation_id
integer
required

Identifier of the specific question/answer turn within the thread. A new conversation_id is generated for every /chat/query/ request. Use it with GET /chat/conversation/{conversation_id}/ to fetch this exact turn later.

sources
object[]
required

Evidence cited by the agent. Each entry is annotated with the tool that surfaced it (display_name) and a stable id for joining back to citation tokens in final_answer.

mode
string | null
required

Echo of the request mode. Retained for backwards compatibility; current agent behavior does not depend on it.

tools
object[]
required

Every tool call the agent made while answering this turn, in execution order. Lets non-streaming clients see the same reasoning trail that SSE clients receive as live tool_call / tool_output frames.

content
object[]
required

Raw agent transcript for the turn: an ordered list of text and tool items as the agent produced them. text items concatenate to final_answer; tool items mirror the entries in tools.

Text fragment emitted by the agent (main agent or a subagent). Concatenate all main-agent text items in order to reconstruct the agent's prose.