Create comment

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Starts a new comment thread on the app with its first comment.

Set page_path to the app page the comment is about. anchor pins the thread to an element of the app's preview. The builder fills it in when you click an element, and source_location must match that element's data-source-location attribute in the preview for a pin to show. Leave anchor out to post a thread with no pin. It still shows in the builder's comments panel.

To attach a screenshot, upload the image with Upload app file and visibility set to private, then pass its file_uri as screenshot_file_uri. Only private files uploaded to this app are accepted.

mentioned_emails records who the comment mentions. Only emails that List mentionable users returns are kept, and the rest are dropped without an error. Mentioning someone sends them no email or notification, and responses never return the list.

Comments don't reach the builder agent on their own. It only works on a thread when someone sends the thread to the builder chat from the builder. Anyone with the app open in the builder sees the change right away.

This is limited to 120 requests per minute per app, shared by every other comments endpoint. 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. Viewers in the app's workspace, read-only tokens, and workspace API keys are refused.</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>

post/api/apps/{app_id}/comments

Path parameters

app_idstring required

ID of the app.

ID of the app.

Request body

contentstring required

Text of the comment, 1 to 5000 characters.

page_pathstring

Path of the app page the comment is about. Defaults to /.

screenshot_file_uristring nullable

file_uri of a screenshot uploaded to this app with Upload app file and visibility set to private. Starts with mp/private/ followed by the app's ID.

mentioned_emailsstring[]

Emails of up to 50 people the comment mentions. Mentions send no notification.

Example request

{
  "content": "Make this button match the header color.",
  "page_path": "/pricing",
  "anchor": {
    "source_location": "pages/Pricing.jsx:42:8",
    "element_tag": "button",
    "point": {
      "x": 0.5,
      "y": 0.5
    },
    "crop": {
      "x": 512,
      "y": 1340,
      "width": 240,
      "height": 96
    },
    "region": {
      "x": 0.42,
      "y": 0.18,
      "width": 0.2,
      "height": 0.08
    },
    "viewport_size": {
      "width": 1280,
      "height": 800
    }
  },
  "screenshot_file_uri": "mp/private/6820f3a4e7b91d003c45a1f2/4b1e9c2a7_shot.png",
  "mentioned_emails": [
    "dana@acme.com"
  ]
}

Response

The new thread with its first comment.

reactor_namesobject required

User ID mapped to name, for the people who reacted anywhere in the thread.

Example response

{
  "thread": {
    "id": "68e2b7c1d4f0a9001c3e5a17",
    "page_path": "/pricing",
    "anchor": {
      "source_location": "pages/Pricing.jsx:42:8",
      "element_tag": "button",
      "point": {
        "x": 0.5,
        "y": 0.5
      },
      "crop": {
        "x": 512,
        "y": 1340,
        "width": 240,
        "height": 96
      },
      "region": {
        "x": 0.42,
        "y": 0.18,
        "width": 0.2,
        "height": 0.08
      },
      "viewport_size": {
        "width": 1280,
        "height": 800
      }
    },
    "screenshot_url": "https://static.base44.com/images/private/6820f3a4e7b91d003c45a1f2/4b1e9c2a7_shot.png?token=eyJhbGciOi",
    "resolved_at": "2026-10-05T09:14:22.512000Z",
    "message_count": 2,
    "last_activity_at": "2026-10-05T09:14:22.512000Z",
    "created_date": "2026-10-05T09:14:22.512000Z",
    "agent_working_since": "2026-10-05T09:14:22.512000Z",
    "unread": true
  },
  "comment": {
    "id": "68e2b7c4d4f0a9001c3e5a1c",
    "content": "Make this button match the header color.",
    "sender_id": "6820f41be7b91d003c45a20a",
    "sender_name": "Dana Levi",
    "sender_avatar_url": "https://lh3.googleusercontent.com/a/ACg8ocJ2",
    "created_date": "2026-10-05T09:14:22.512000Z",
    "edited_at": "2026-10-05T09:14:22.512000Z",
    "reactions": {
      "👍": [
        "6820f41be7b91d003c45a20a"
      ]
    }
  },
  "replies": [
    {
      "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": {
    "6820f41be7b91d003c45a20a": "Dana Levi"
  }
}

Changes

Changed in 1 of the 28 revisions of this API.1

Of the 28 revisions, 1 has no diff computed.