> ## Documentation Index
> Fetch the complete documentation index at: https://docs.base44.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Read conversation messages

> <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](/api-reference/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.

<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>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json get /api/apps/{app_id}/chat/full-conversation
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - ApiKeyAuth: []
paths:
  /api/apps/{app_id}/chat/full-conversation:
    get:
      summary: Read conversation messages
      description: >-
        <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](/api-reference/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.


        <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>
      operationId: get_full_conversation_api_api_apps__app_id__chat_full_conversation_get
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app whose conversation to read.
            title: App Id
          description: ID of the app whose conversation to read.
          example: 6820f3a4e7b91d003c45a1f2
        - name: limit
          in: query
          required: false
          schema:
            anyOf:
              - type: integer
              - type: 'null'
            description: >-
              Maximum number of messages to return, counted back from the
              newest. Omit to return the whole conversation.
            title: Limit
          description: >-
            Maximum number of messages to return, counted back from the newest.
            Omit to return the whole conversation.
          example: 20
        - name: skip
          in: query
          required: false
          schema:
            anyOf:
              - type: integer
              - type: 'null'
            description: >-
              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.
            default: 0
            title: Skip
          description: >-
            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.
          example: 0
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConversationDetail'
        '401':
          description: Missing or invalid credentials.
        '403':
          description: You don't have access to this app.
        '404':
          description: App not found.
        '422':
          description: The `limit` or `skip` is not an integer.
components:
  schemas:
    ConversationDetail:
      properties:
        id:
          anyOf:
            - type: string
            - type: 'null'
          title: Id
          description: ID of the conversation.
          example: 1f0c2b7a-9d51-4c3e-8a62-7b4d5e6f8a90
        messages:
          anyOf:
            - items:
                $ref: '#/components/schemas/ConversationMessageSummary'
              type: array
            - type: 'null'
          title: Messages
          description: The requested window of messages, oldest first.
      type: object
      title: ConversationDetail
      description: A window of messages from an app's AI chat.
    ConversationMessageSummary:
      properties:
        id:
          anyOf:
            - type: string
            - type: 'null'
          title: Id
          description: ID of the message.
          example: 7f3a1c88-52d4-4a0e-9b31-2c6f0d8e4a19
        role:
          anyOf:
            - type: string
              enum:
                - user
                - assistant
                - system
            - type: 'null'
          title: Role
          description: >-
            Who produced the message. A `user` message is a prompt sent to the
            AI, an `assistant` message is the AI's reply, and a `system` message
            is a platform-generated note.
          example: assistant
        content:
          anyOf:
            - type: string
            - type: 'null'
          title: Content
          description: >-
            Text of the message. Empty on assistant turns whose work is carried
            entirely by tool calls, and on internal diff messages.
          example: I added a contact form to the home page.
        file_urls:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: File Urls
          description: URLs of the files attached to the message, or `null` if it has none.
          example:
            - https://example.com/mockup.png
        hidden:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Hidden
          description: >-
            Whether the message is internal and hidden from the chat in the app
            editor.
          example: false
        checkpoint_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Checkpoint Id
          description: >-
            ID of the
            [checkpoint](/developers/references/app-management/get-started/concepts#checkpoints)
            this message produced, or `null` if it produced none. Pass it as
            `checkpoint_id` to [Deploy an app](/api-reference/deploy-an-app) to
            deploy that version.
          example: 6886b8d390dc7e2f4a2c91b3
        tool_calls:
          anyOf:
            - items:
                $ref: '#/components/schemas/ConversationToolCallSummary'
              type: array
            - type: 'null'
          title: Tool Calls
          description: >-
            Tool calls the AI made on this message, or `null` on messages that
            made none. A call with `status` set to `waiting_for_user_input` is
            holding the turn open until it is answered.
        usage:
          anyOf:
            - $ref: '#/components/schemas/MessageUsageSummary'
            - type: 'null'
          description: >-
            Tokens and credits this message consumed, or `null` on messages that
            consumed none.
        metadata:
          anyOf:
            - $ref: '#/components/schemas/MessageMetadataSummary'
            - type: 'null'
          description: Who created the message and when.
      type: object
      title: ConversationMessageSummary
    ConversationToolCallSummary:
      properties:
        id:
          anyOf:
            - type: string
            - type: 'null'
          title: Id
          description: >-
            ID of the tool call. Pass it as `tool_call_id` to [Submit tool-call
            input](/api-reference/submit-tool-call-input) when `status` is
            `waiting_for_user_input`.
          example: toolu_01A9FJd3kP2mNqRs7VwXyZ4b
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
          description: Name of the tool the AI is calling.
          example: create_file
        status:
          anyOf:
            - type: string
              enum:
                - running
                - success
                - error
                - stopped
                - waiting_for_user_input
            - type: 'null'
          title: Status
          description: >-
            Where the tool call is. Either `running`, `success`, `error`,
            `stopped`, or `waiting_for_user_input`. The last one means the turn
            is paused until the call is answered.
          example: waiting_for_user_input
        requires_user_input:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Requires User Input
          description: >-
            Whether this tool call has to be approved or rejected before the
            turn can continue.
          example: true
        arguments_string:
          anyOf:
            - type: string
            - type: 'null'
          title: Arguments String
          description: >-
            What the AI asked the tool to do, as a JSON object encoded in a
            string. Parse it to see the arguments before answering a call that
            is waiting. On a call whose `requires_user_input` is `true` the
            value is complete rather than shortened, which is the case that
            matters, because approving without reading it is approving blind. On
            any other call it can be cut to the first 500 characters. The one
            exception either way is the browser-typing tools,
            `local_browser_type` and `local_browser_press_key`, which always
            replace what was typed with `[redacted]` so a password or one-time
            code is never returned, waiting or not. Approving one of those means
            approving a value you cannot see. It is an empty string on a tool
            call that takes no arguments.
          example: >-
            {"file_path": "src/pages/Home.jsx", "content": "export default
            function Home() {}"}
      type: object
      title: ConversationToolCallSummary
      description: A tool call on an assistant message.
    MessageUsageSummary:
      properties:
        prompt_tokens:
          anyOf:
            - type: integer
            - type: 'null'
          title: Prompt Tokens
          description: >-
            Tokens the model read for this message, including the conversation
            history it was given.
          example: 18432
        completion_tokens:
          anyOf:
            - type: integer
            - type: 'null'
          title: Completion Tokens
          description: Tokens the model generated for this message.
          example: 742
        credits_charged:
          anyOf:
            - type: number
            - type: 'null'
          title: Credits Charged
          description: Credits charged for this message, or `null` if it was not billed.
          example: 1.5
      type: object
      title: MessageUsageSummary
    MessageMetadataSummary:
      properties:
        created_date:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Created Date
          description: Time the message was created, as a UTC timestamp in ISO 8601 format.
          example: '2026-08-02T14:30:00'
        created_by_email:
          anyOf:
            - type: string
            - type: 'null'
          title: Created By Email
          description: >-
            Email of the user whose turn produced the message, or `anonymous` on
            a message Base44 created with no user in context.
          example: developer@example.com
      type: object
      title: MessageMetadataSummary
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: api_key
      description: Personal API key.

````