Read conversation messages
Changed on<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>
Returns the app's AI chat, both the messages sent to the AI and the replies it produced, oldest first.
An assistant message can have empty content when the whole turn is carried by tool calls, so treat an empty message as work the AI did rather than an error. Messages with hidden set to true are internal and do not appear in the app editor, so skip them to reconstruct the transcript shown there.
A tool call whose status is waiting_for_user_input means the AI has paused and cannot continue until that call is answered. Read its arguments_string to see what it is asking to do, then answer it with Submit tool-call input to let the turn continue. A waiting call carries its arguments in full, while a call that is not waiting can carry them cut short. The browser-typing tools are redacted either way, so a call from one of those cannot be reviewed before approving it.
Set branch_id to read a branch's conversation. It holds the branch's own messages, not main's.
For a pull-request branch, the displayed history also includes informational PR activity. Those entries are not messages sent to the AI and do not affect chat recovery.
<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time.</Warning>
Request
- Base URL: https://app.base44.com
- URL: https://app.base44.com/api/apps/{app_id}/chat/full-conversation
- Auth: HTTP bearer
Path parameters
ID of the app whose conversation to read.
Query parameters
Maximum number of messages to return, counted back from the newest. Omit to return the whole conversation.
Number of messages to skip, counted back from the newest. Combine with limit to page back through the conversation. For example, skip=20 with limit=20 returns the 20 messages before the 20 most recent. Prefer cursor.
next_cursor from the previous page, which returns the older messages before it. Send it without skip. It carries the page size, so limit is ignored. Pages are counted back from the newest message, so a message added while you page shifts the next page by one and repeats a message you already have.
ID of the branch to work on, as returned by List branches. Omit it to work on the app's main branch.
Response
Successful Response
Example response
{
"id": "1f0c2b7a-9d51-4c3e-8a62-7b4d5e6f8a90",
"messages": [
{
"id": "7f3a1c88-52d4-4a0e-9b31-2c6f0d8e4a19",
"role": "assistant",
"content": "I added a contact form to the home page.",
"file_urls": [
"https://example.com/mockup.png"
],
"checkpoint_id": "6886b8d390dc7e2f4a2c91b3",
"tool_calls": [
{
"id": "toolu_01A9FJd3kP2mNqRs7VwXyZ4b",
"name": "create_file",
"status": "waiting_for_user_input",
"requires_user_input": true,
"arguments_string": "{\"file_path\": \"src/pages/Home.jsx\", \"content\": \"export default function Home() {}\"}"
}
],
"usage": {
"prompt_tokens": 18432,
"completion_tokens": 742,
"credits_charged": 1.5
},
"metadata": {
"created_date": "2026-08-02T14:30:00",
"created_by_email": "developer@example.com"
}
}
],
"next_cursor": "gAAAAABn7vJ..."
}Changes
- breaking
queryrequest parameterbranch_idlist-of-types was narrowed by removing typesnull - breaking
queryrequest parametercursorlist-of-types was narrowed by removing typesnull - breaking
queryrequest parameterlimitlist-of-types was narrowed by removing typesnull - breaking
queryrequest parameterskiplist-of-types was narrowed by removing typesnull - breaking
for the
queryrequest parameterlimit, the type changed from no type tointeger - breaking
for the
queryrequest parameterskip, the type changed from no type tointeger - info
for the
queryrequest parameterbranch_id, the type was generalized from no type tostring - info
for the
queryrequest parametercursor, the type was generalized from no type tostring
- breaking
- info
added the new optional
queryrequest parameterbranch_id
- info