curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/comments/threads/{thread_id}/replies \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"content": "Done, thanks!",
"mentioned_emails": [
"dana@acme.com"
]
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/comments/threads/{thread_id}/replies"
payload = {
"content": "Done, thanks!",
"mentioned_emails": ["dana@acme.com"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({content: 'Done, thanks!', mentioned_emails: ['dana@acme.com']})
};
fetch('https://app.base44.com/api/apps/{app_id}/comments/threads/{thread_id}/replies', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.base44.com/api/apps/{app_id}/comments/threads/{thread_id}/replies",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'content' => 'Done, thanks!',
'mentioned_emails' => [
'dana@acme.com'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/comments/threads/{thread_id}/replies"
payload := strings.NewReader("{\n \"content\": \"Done, thanks!\",\n \"mentioned_emails\": [\n \"dana@acme.com\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.base44.com/api/apps/{app_id}/comments/threads/{thread_id}/replies")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"content\": \"Done, thanks!\",\n \"mentioned_emails\": [\n \"dana@acme.com\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/comments/threads/{thread_id}/replies")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"content\": \"Done, thanks!\",\n \"mentioned_emails\": [\n \"dana@acme.com\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"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"
]
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Reply to comment
Adds a reply to a comment thread. Replying to a resolved thread doesn’t reopen it.
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.
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.
curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/comments/threads/{thread_id}/replies \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"content": "Done, thanks!",
"mentioned_emails": [
"dana@acme.com"
]
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/comments/threads/{thread_id}/replies"
payload = {
"content": "Done, thanks!",
"mentioned_emails": ["dana@acme.com"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({content: 'Done, thanks!', mentioned_emails: ['dana@acme.com']})
};
fetch('https://app.base44.com/api/apps/{app_id}/comments/threads/{thread_id}/replies', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.base44.com/api/apps/{app_id}/comments/threads/{thread_id}/replies",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'content' => 'Done, thanks!',
'mentioned_emails' => [
'dana@acme.com'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/comments/threads/{thread_id}/replies"
payload := strings.NewReader("{\n \"content\": \"Done, thanks!\",\n \"mentioned_emails\": [\n \"dana@acme.com\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.base44.com/api/apps/{app_id}/comments/threads/{thread_id}/replies")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"content\": \"Done, thanks!\",\n \"mentioned_emails\": [\n \"dana@acme.com\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/comments/threads/{thread_id}/replies")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"content\": \"Done, thanks!\",\n \"mentioned_emails\": [\n \"dana@acme.com\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"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"
]
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Body
Response
The new reply.
One comment: the first comment of a thread or a reply.
ID of the comment.
"68e2b7c4d4f0a9001c3e5a1c"
Text of the comment.
"Make this button match the header color."
ID of the Base44 user who wrote it, or base44 for a reply from the builder agent.
"6820f41be7b91d003c45a20a"
Name of the author when they wrote it, or their email when they had no name. Base44 for the builder agent.
"Dana Levi"
URL of the author's profile image, or null when they have none.
"https://lh3.googleusercontent.com/a/ACg8ocJ2"
When the comment was posted, in UTC.
"2026-10-05T09:14:22.512000Z"
When the comment was last edited, in UTC, or null when it never was.
"2026-10-05T09:14:22.512000Z"
Each emoji reacted with, mapped to the IDs of the users who reacted with it.
Show child attributes
Show child attributes
{ "👍": ["6820f41be7b91d003c45a20a"] }
Was this page helpful?