List the messages in a conversation
Read the questions and answers in a conversation, oldest first, paged by cursor. An answer is recorded before it is generated, so render only complete ones.
GET
/
conversations
/
{conversation_id}
/
messages
curl --request GET "$MITHUNAI_URL/arukz/api/v1/conversations/c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60/messages?limit=50" \
--header "Authorization: Bearer $MITHUNAI_API_KEY"
import os, requests
conversation_id = "c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60"
response = requests.get(
f"{os.environ['MITHUNAI_URL']}/arukz/api/v1/conversations/{conversation_id}/messages",
headers={"Authorization": f"Bearer {os.environ['MITHUNAI_API_KEY']}"},
params={"limit": 50},
timeout=60,
)
response.raise_for_status()
print(response.json())
const conversationId = 'c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60'
const response = await fetch(
`${process.env.MITHUNAI_URL}/arukz/api/v1/conversations/${conversationId}/messages?limit=50`,
{ headers: { Authorization: `Bearer ${process.env.MITHUNAI_API_KEY}` } },
)
console.log(await response.json())
{
"data": [
{
"id": "0e6b1d4f-8a27-4c93-b5d0-7f2e9a3c6b18",
"conversation_id": "c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60",
"role": "user",
"sequence": 1,
"status": "complete",
"text": "How do I rotate an API key?",
"citations": [],
"abstained": false,
"created_at": "2026-09-24T10:15:05.771204+00:00",
"model": null,
"finish_reason": null,
"idempotency_key": "ticket-4821-q1",
"metadata": {}
},
{
"id": "7c3a9e52-1b6d-4f08-a4e7-2d9b5f1c8e36",
"conversation_id": "c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60",
"role": "assistant",
"sequence": 2,
"status": "complete",
"text": "Mint a new key, move your integration to it, then revoke the old key [1].",
"citations": [
{
"source_id": "3d8f2a61-7e4b-4c19-9a05-b6e1d7c2f480",
"ordinal": 1,
"title": "Managing API keys",
"url": "https://docs.example.com/admin/api-keys#rotation",
"snippet": "Rotation is mint-then-revoke: create the replacement first, then revoke the old key.",
"anchor": "rotation",
"score": 0.82
}
],
"abstained": false,
"created_at": "2026-09-24T10:15:05.771204+00:00",
"model": "anthropic/claude-sonnet-5",
"finish_reason": "end_turn",
"idempotency_key": null,
"metadata": {}
}
],
"next_cursor": null,
"has_more": false
}
{ "code": "not_found", "message": "The requested resource was not found." }
Messages are ordered by
sequence, oldest first, and paged with a cursor. Loop until has_more is false; see Pagination.
An answer is recorded before it is generated, so while a question is being answered you see its answer message with status pending. Render only complete answers as finished. If a stream was cut off, this is where you find the answer in whatever state it reached.
The same visibility rules apply as for Get a conversation: you can read conversations you own, and owner or admin callers can read any in the organization. Anything else is 404.
This request also resolves the conversation’s assistant. If that assistant can no longer answer (it is disabled or archived, or has no knowledge attached), this request returns 400 validation_error.
string
required
The conversation ID.
integer
default:"50"
The page size, from 1 to 100.
string
The
next_cursor value from the previous page. A cursor this server did not issue returns 400.Response
object[]
required
The messages on this page.
Show properties
Show properties
string
The message ID.
string
The conversation the message belongs to.
string
user for a question, assistant for an answer.integer
Position in the conversation, starting at 1. An answer’s sequence is its question’s plus one.
string
complete, pending (still being generated), interrupted (stopped early after producing
some text) or failed (produced nothing usable). A question is always complete.string
The message text. Empty for a pending or failed answer.
object[]
The sources an answer is grounded in. Always empty for a question.
Show properties
Show properties
string
Identifier of the cited passage. It stays the same while the document’s content is
unchanged and changes when changed content is re-ingested. It is not a knowledge source ID
or a document ID.
integer
The citation’s number, from 1. It matches the
[1]-style marker in the answer text.string
Title of the cited document. May be an empty string.
string | null
The source URL, when the document has one.
string | null
An excerpt supporting the answer.
string | null
A location within the source, such as a heading or page.
number | null
The retrieval relevance score of the cited passage. Higher is more relevant. Use it for
diagnostics and ranking, not as a probability.
boolean
true when the assistant declined to answer because your knowledge did not support an answer.
This is a successful outcome, not an error. See How answers
work.string
ISO 8601 timestamp with a UTC offset.
string | null
The model that produced an answer, as
provider/name. null for a question.string | null
Why generation stopped, as reported.
length means the answer was cut off at the output
limit. For a failed answer it holds the error code. null for a question.string | null
The key you sent with the question, echoed back.
null on answers.object
The metadata you sent with the question.
string | null
required
Pass this back as
cursor to get the next page. null on the last page.boolean
required
Whether another page exists.
curl --request GET "$MITHUNAI_URL/arukz/api/v1/conversations/c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60/messages?limit=50" \
--header "Authorization: Bearer $MITHUNAI_API_KEY"
import os, requests
conversation_id = "c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60"
response = requests.get(
f"{os.environ['MITHUNAI_URL']}/arukz/api/v1/conversations/{conversation_id}/messages",
headers={"Authorization": f"Bearer {os.environ['MITHUNAI_API_KEY']}"},
params={"limit": 50},
timeout=60,
)
response.raise_for_status()
print(response.json())
const conversationId = 'c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60'
const response = await fetch(
`${process.env.MITHUNAI_URL}/arukz/api/v1/conversations/${conversationId}/messages?limit=50`,
{ headers: { Authorization: `Bearer ${process.env.MITHUNAI_API_KEY}` } },
)
console.log(await response.json())
{
"data": [
{
"id": "0e6b1d4f-8a27-4c93-b5d0-7f2e9a3c6b18",
"conversation_id": "c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60",
"role": "user",
"sequence": 1,
"status": "complete",
"text": "How do I rotate an API key?",
"citations": [],
"abstained": false,
"created_at": "2026-09-24T10:15:05.771204+00:00",
"model": null,
"finish_reason": null,
"idempotency_key": "ticket-4821-q1",
"metadata": {}
},
{
"id": "7c3a9e52-1b6d-4f08-a4e7-2d9b5f1c8e36",
"conversation_id": "c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60",
"role": "assistant",
"sequence": 2,
"status": "complete",
"text": "Mint a new key, move your integration to it, then revoke the old key [1].",
"citations": [
{
"source_id": "3d8f2a61-7e4b-4c19-9a05-b6e1d7c2f480",
"ordinal": 1,
"title": "Managing API keys",
"url": "https://docs.example.com/admin/api-keys#rotation",
"snippet": "Rotation is mint-then-revoke: create the replacement first, then revoke the old key.",
"anchor": "rotation",
"score": 0.82
}
],
"abstained": false,
"created_at": "2026-09-24T10:15:05.771204+00:00",
"model": "anthropic/claude-sonnet-5",
"finish_reason": "end_turn",
"idempotency_key": null,
"metadata": {}
}
],
"next_cursor": null,
"has_more": false
}
{ "code": "not_found", "message": "The requested resource was not found." }
Last modified on September 26, 2026
⌘I
curl --request GET "$MITHUNAI_URL/arukz/api/v1/conversations/c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60/messages?limit=50" \
--header "Authorization: Bearer $MITHUNAI_API_KEY"
import os, requests
conversation_id = "c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60"
response = requests.get(
f"{os.environ['MITHUNAI_URL']}/arukz/api/v1/conversations/{conversation_id}/messages",
headers={"Authorization": f"Bearer {os.environ['MITHUNAI_API_KEY']}"},
params={"limit": 50},
timeout=60,
)
response.raise_for_status()
print(response.json())
const conversationId = 'c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60'
const response = await fetch(
`${process.env.MITHUNAI_URL}/arukz/api/v1/conversations/${conversationId}/messages?limit=50`,
{ headers: { Authorization: `Bearer ${process.env.MITHUNAI_API_KEY}` } },
)
console.log(await response.json())
{
"data": [
{
"id": "0e6b1d4f-8a27-4c93-b5d0-7f2e9a3c6b18",
"conversation_id": "c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60",
"role": "user",
"sequence": 1,
"status": "complete",
"text": "How do I rotate an API key?",
"citations": [],
"abstained": false,
"created_at": "2026-09-24T10:15:05.771204+00:00",
"model": null,
"finish_reason": null,
"idempotency_key": "ticket-4821-q1",
"metadata": {}
},
{
"id": "7c3a9e52-1b6d-4f08-a4e7-2d9b5f1c8e36",
"conversation_id": "c41f8a2e-6d93-4b0a-b7e5-3f1d2c8a9e60",
"role": "assistant",
"sequence": 2,
"status": "complete",
"text": "Mint a new key, move your integration to it, then revoke the old key [1].",
"citations": [
{
"source_id": "3d8f2a61-7e4b-4c19-9a05-b6e1d7c2f480",
"ordinal": 1,
"title": "Managing API keys",
"url": "https://docs.example.com/admin/api-keys#rotation",
"snippet": "Rotation is mint-then-revoke: create the replacement first, then revoke the old key.",
"anchor": "rotation",
"score": 0.82
}
],
"abstained": false,
"created_at": "2026-09-24T10:15:05.771204+00:00",
"model": "anthropic/claude-sonnet-5",
"finish_reason": "end_turn",
"idempotency_key": null,
"metadata": {}
}
],
"next_cursor": null,
"has_more": false
}
{ "code": "not_found", "message": "The requested resource was not found." }