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

> ## Agent Instructions
> Internal links on these pages omit the .md extension. Append .md to a docs page URL, or send an Accept: text/markdown header, to get that page as markdown.

# List comments

> <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 open comment threads with all their comments, newest first. Set `include_resolved` to `true` to include resolved threads too.

Threads are ordered by when they were created, newest first. A page holds up to `limit` threads, 500 by default. While `has_more` is `true`, request the next page with `cursor` set to `next_cursor`, and send nothing else beside it. A cursor works for 24 hours, only on this app. A thread created after you start paging shows up on a fresh first page, not in later pages.

Screenshot links in the response work for one hour. Call this again for fresh ones, or use [Create comment screenshot link](/api-reference/create-comment-screenshot-link) for a link that lasts a year.

This is limited to 600 requests per minute per app, shared by [List comments](/api-reference/list-comments) and [List mentionable users](/api-reference/list-mentionable-users). A signed-in session has its own limit, and every personal access token for the workspace shares one. Some workspaces have a different limit. Every request that counts against the limit gets `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` (Unix time in seconds) headers, and a `429` also gets `Retry-After` in seconds. If the limiter itself is unavailable, requests go through without these headers.

<Note>Call this as an editor of the app, with a personal access token sent as a Bearer token or from a signed-in session. A read-only token works here. Workspace API keys aren't accepted.</Note>

<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}/comments
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - PersonalAccessTokenAuth: []
paths:
  /api/apps/{app_id}/comments:
    get:
      summary: List comments
      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 open comment threads with all their comments, newest
        first. Set `include_resolved` to `true` to include resolved threads too.


        Threads are ordered by when they were created, newest first. A page
        holds up to `limit` threads, 500 by default. While `has_more` is `true`,
        request the next page with `cursor` set to `next_cursor`, and send
        nothing else beside it. A cursor works for 24 hours, only on this app. A
        thread created after you start paging shows up on a fresh first page,
        not in later pages.


        Screenshot links in the response work for one hour. Call this again for
        fresh ones, or use [Create comment screenshot
        link](/api-reference/create-comment-screenshot-link) for a link that
        lasts a year.


        This is limited to 600 requests per minute per app, shared by [List
        comments](/api-reference/list-comments) and [List mentionable
        users](/api-reference/list-mentionable-users). A signed-in session has
        its own limit, and every personal access token for the workspace shares
        one. Some workspaces have a different limit. Every request that counts
        against the limit gets `X-RateLimit-Limit`, `X-RateLimit-Remaining` and
        `X-RateLimit-Reset` (Unix time in seconds) headers, and a `429` also
        gets `Retry-After` in seconds. If the limiter itself is unavailable,
        requests go through without these headers.


        <Note>Call this as an editor of the app, with a personal access token
        sent as a Bearer token or from a signed-in session. A read-only token
        works here. Workspace API keys aren't accepted.</Note>


        <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: list_app_comments_api_apps__app_id__comments_get
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app.
            title: App Id
          description: ID of the app.
          example: 6820f3a4e7b91d003c45a1f2
        - name: include_resolved
          in: query
          required: false
          schema:
            anyOf:
              - type: boolean
              - type: 'null'
            description: Set to `true` to include resolved threads. Defaults to `false`.
            title: Include Resolved
          description: Set to `true` to include resolved threads. Defaults to `false`.
          example: true
        - name: limit
          in: query
          required: false
          schema:
            anyOf:
              - type: integer
                maximum: 500
                minimum: 1
              - type: 'null'
            description: Threads per page, 1 to 500. Defaults to 500.
            title: Limit
          description: Threads per page, 1 to 500. Defaults to 500.
          example: 50
        - name: cursor
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              `next_cursor` from the previous page. Send it on its own: it
              carries `include_resolved` and `limit`, so sending either beside
              it returns a `400`.
            title: Cursor
          description: >-
            `next_cursor` from the previous page. Send it on its own: it carries
            `include_resolved` and `limit`, so sending either beside it returns
            a `400`.
          example: gAAAAABn7vJ0q2kX
      responses:
        '200':
          description: One page of the app's comment threads, newest first.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentThreadList'
        '400':
          description: >-
            `cursor` is invalid, expired, or from another app, or
            `include_resolved` or `limit` was sent beside it.
        '401':
          description: Missing or invalid credentials.
        '403':
          description: >-
            You don't have editor access to this app, the app is blocked, or you
            used a workspace API key.
        '404':
          description: App not found.
        '409':
          description: Your workspace requires an unlocked SSO session.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: >-
            Rate limit exceeded. Wait the number of seconds in `Retry-After`
            before retrying.
components:
  schemas:
    CommentThreadList:
      properties:
        items:
          items:
            $ref: '#/components/schemas/CommentThreadItem'
          type: array
          title: Items
          description: Threads on this page, newest first.
          example:
            - comment:
                content: Make this button match the header color.
                created_date: '2026-10-05T09:14:22.512000Z'
                id: 68e2b7c4d4f0a9001c3e5a1c
                reactions: {}
                sender_id: 6820f41be7b91d003c45a20a
                sender_name: Dana Levi
              reactor_names: {}
              replies: []
              thread:
                anchor:
                  element_tag: button
                  source_location: pages/Pricing.jsx:42:8
                created_date: '2026-10-05T09:14:22.512000Z'
                id: 68e2b7c1d4f0a9001c3e5a17
                last_activity_at: '2026-10-05T09:14:22.512000Z'
                message_count: 0
                page_path: /pricing
                unread: true
        has_more:
          type: boolean
          title: Has More
          description: Whether more threads follow this page.
          example: false
        next_cursor:
          anyOf:
            - type: string
            - type: 'null'
          title: Next Cursor
          description: Pass as `cursor` to get the next page. `null` on the last page.
          example: gAAAAABn7vJ0q2kX
      type: object
      required:
        - items
        - has_more
        - next_cursor
      title: CommentThreadList
      description: One page of an app's comment threads.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    CommentThreadItem:
      properties:
        thread:
          $ref: '#/components/schemas/CommentThread'
          description: The thread's state.
        comment:
          $ref: '#/components/schemas/CommentMessage'
          description: The first comment, which started the thread.
        replies:
          items:
            $ref: '#/components/schemas/CommentMessage'
          type: array
          title: Replies
          description: Replies, oldest first.
          example:
            - content: Done, it now uses the header blue.
              created_date: '2026-10-05T09:14:22.512000Z'
              id: 68e2b80fd4f0a9001c3e5a21
              reactions: {}
              sender_id: base44
              sender_name: Base44
        reactor_names:
          additionalProperties:
            type: string
          type: object
          title: Reactor Names
          description: >-
            User ID mapped to name, for the people who reacted anywhere in the
            thread.
          example:
            6820f41be7b91d003c45a20a: Dana Levi
      type: object
      required:
        - thread
        - comment
        - replies
        - reactor_names
      title: CommentThreadItem
      description: A comment thread with all its comments.
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
    CommentThread:
      properties:
        id:
          type: string
          title: Id
          description: ID of the thread.
          example: 68e2b7c1d4f0a9001c3e5a17
        page_path:
          type: string
          title: Page Path
          description: Path of the app page the thread is on.
          example: /pricing
        anchor:
          $ref: '#/components/schemas/CommentAnchor'
          description: Where the thread is pinned in the app's preview.
        screenshot_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Screenshot Url
          description: >-
            Signed link to the screenshot attached to the thread, valid for one
            hour. `null` when the thread has no screenshot or it can't be read.
          example: >-
            https://static.base44.com/images/private/6820f3a4e7b91d003c45a1f2/4b1e9c2a7_shot.png?token=eyJhbGciOi
        resolved_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Resolved At
          description: When the thread was resolved, in UTC, or `null` while it's open.
          example: '2026-10-05T09:14:22.512000Z'
        message_count:
          type: integer
          title: Message Count
          description: Number of replies, not counting the first comment.
          example: 2
        last_activity_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Last Activity At
          description: When the thread was created or last replied to, in UTC.
          example: '2026-10-05T09:14:22.512000Z'
        created_date:
          type: string
          format: date-time
          title: Created Date
          description: When the thread was created, in UTC.
          example: '2026-10-05T09:14:22.512000Z'
        agent_working_since:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Agent Working Since
          description: >-
            When the builder agent started working on the thread, in UTC, or
            `null` when it isn't working on it. A value older than an hour is
            left over from a turn that stopped.
          example: '2026-10-05T09:14:22.512000Z'
        unread:
          type: boolean
          title: Unread
          description: >-
            Whether the thread has a comment from someone else posted after you
            last read it. Always `false` in the responses of Create comment and
            Update comment anchor.
          example: true
      type: object
      required:
        - id
        - page_path
        - anchor
        - screenshot_url
        - resolved_at
        - message_count
        - last_activity_at
        - created_date
        - agent_working_since
        - unread
      title: CommentThread
      description: A comment thread's state.
    CommentMessage:
      properties:
        id:
          type: string
          title: Id
          description: ID of the comment.
          example: 68e2b7c4d4f0a9001c3e5a1c
        content:
          type: string
          title: Content
          description: Text of the comment.
          example: Make this button match the header color.
        sender_id:
          type: string
          title: Sender Id
          description: >-
            ID of the Base44 user who wrote it, or `base44` for a reply from the
            builder agent.
          example: 6820f41be7b91d003c45a20a
        sender_name:
          type: string
          title: Sender Name
          description: >-
            Name of the author when they wrote it, or their email when they had
            no name. `Base44` for the builder agent.
          example: Dana Levi
        sender_avatar_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Sender Avatar Url
          description: URL of the author's profile image, or `null` when they have none.
          example: https://lh3.googleusercontent.com/a/ACg8ocJ2
        created_date:
          type: string
          format: date-time
          title: Created Date
          description: When the comment was posted, in UTC.
          example: '2026-10-05T09:14:22.512000Z'
        edited_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Edited At
          description: >-
            When the comment was last edited, in UTC, or `null` when it never
            was.
          example: '2026-10-05T09:14:22.512000Z'
        reactions:
          additionalProperties:
            items:
              type: string
            type: array
          type: object
          title: Reactions
          description: >-
            Each emoji reacted with, mapped to the IDs of the users who reacted
            with it.
          example:
            👍:
              - 6820f41be7b91d003c45a20a
      type: object
      required:
        - id
        - content
        - sender_id
        - sender_name
        - sender_avatar_url
        - created_date
        - edited_at
        - reactions
      title: CommentMessage
      description: 'One comment: the first comment of a thread or a reply.'
    CommentAnchor:
      properties:
        source_location:
          anyOf:
            - type: string
              maxLength: 512
            - type: 'null'
          title: Source Location
          description: >-
            Position of the element's tag in the app's code, as
            `file:line:column`, exactly as the element's `data-source-location`
            attribute in the preview. The pin shows only on an element with this
            value. `null` for a thread with no pin.
          example: pages/Pricing.jsx:42:8
        element_tag:
          anyOf:
            - type: string
              maxLength: 64
            - type: 'null'
          title: Element Tag
          description: HTML tag of the element, such as `button`.
          example: button
        instance_index:
          anyOf:
            - type: integer
              minimum: 0
            - type: 'null'
          title: Instance Index
          description: >-
            Which of the elements sharing `source_location` the pin is on,
            counting from `0` in page order, for an element repeated in a list.
            `null` means the first.
          example: 0
        point:
          anyOf:
            - $ref: '#/components/schemas/CommentAnchorPoint'
            - type: 'null'
          description: >-
            Where on the element the pin sits. `null` puts it at the middle of
            the top edge.
        crop:
          anyOf:
            - $ref: '#/components/schemas/CommentAnchorCrop'
            - type: 'null'
          description: >-
            Area of the page the screenshot shows, used to redraw the crop box
            in the builder.
        region:
          anyOf:
            - $ref: '#/components/schemas/CommentAnchorRegion'
            - type: 'null'
          description: Area of the visible preview the screenshot shows when it was taken.
        viewport_size:
          anyOf:
            - $ref: '#/components/schemas/CommentAnchorViewportSize'
            - type: 'null'
          description: Size of the preview when the screenshot was taken.
      type: object
      title: CommentAnchor
      description: >-
        Where a comment thread is pinned in the app's preview. When the
        builder's AI edits the anchored

        file, Base44 moves an open thread's `source_location` to the element's
        new line.
    CommentAnchorPoint:
      properties:
        x:
          type: number
          maximum: 1
          minimum: 0
          title: X
          description: Horizontal position, as a fraction of the element's width.
          example: 0.5
        'y':
          type: number
          maximum: 1
          minimum: 0
          title: 'Y'
          description: Vertical position, as a fraction of the element's height.
          example: 0.5
      type: object
      required:
        - x
        - 'y'
      title: CommentAnchorPoint
      description: Fractions of the anchored element's rect, not of the document.
    CommentAnchorCrop:
      properties:
        x:
          type: number
          title: X
          description: Left edge, in page pixels.
          example: 512
        'y':
          type: number
          title: 'Y'
          description: Top edge, in page pixels, scroll included.
          example: 1340
        width:
          type: number
          exclusiveMinimum: 0
          title: Width
          description: Width, in pixels.
          example: 240
        height:
          type: number
          exclusiveMinimum: 0
          title: Height
          description: Height, in pixels.
          example: 96
      type: object
      required:
        - x
        - 'y'
        - width
        - height
      title: CommentAnchorCrop
      description: >-
        The screenshot's area in page pixels: the visible area plus the page's
        scroll when it was taken.
    CommentAnchorRegion:
      properties:
        x:
          type: number
          maximum: 1
          minimum: 0
          title: X
          description: Left edge, as a fraction of the preview's width.
          example: 0.42
        'y':
          type: number
          maximum: 1
          minimum: 0
          title: 'Y'
          description: Top edge, as a fraction of the preview's height.
          example: 0.18
        width:
          type: number
          maximum: 1
          minimum: 0
          title: Width
          description: Width, as a fraction of the preview's width.
          example: 0.2
        height:
          type: number
          maximum: 1
          minimum: 0
          title: Height
          description: Height, as a fraction of the preview's height.
          example: 0.08
      type: object
      required:
        - x
        - 'y'
        - width
        - height
      title: CommentAnchorRegion
      description: >-
        The screenshot's area as fractions of the visible preview when it was
        taken, so it depends on the scroll.
    CommentAnchorViewportSize:
      properties:
        width:
          type: integer
          minimum: 1
          title: Width
          description: Width of the preview, in pixels.
          example: 1280
        height:
          type: integer
          minimum: 1
          title: Height
          description: Height of the preview, in pixels.
          example: 800
      type: object
      required:
        - width
        - height
      title: CommentAnchorViewportSize
      description: Size of the preview when the screenshot was taken.
  securitySchemes:
    PersonalAccessTokenAuth:
      type: http
      scheme: bearer
      description: 'Personal access token, sent as `Authorization: Bearer <token>`.'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.