curl --request POST \
--url https://www.chatbase.co/api/v2/agents/{agentId}/helpdesk/tickets/{ticketNumber}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "reply",
"content": "Thanks for reaching out. This is **fixed** now.",
"authorId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorEmail": "sam@example.com"
}
'import requests
url = "https://www.chatbase.co/api/v2/agents/{agentId}/helpdesk/tickets/{ticketNumber}/messages"
payload = {
"type": "reply",
"content": "Thanks for reaching out. This is **fixed** now.",
"authorId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorEmail": "sam@example.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({
type: 'reply',
content: 'Thanks for reaching out. This is **fixed** now.',
authorId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
authorEmail: 'sam@example.com'
})
};
fetch('https://www.chatbase.co/api/v2/agents/{agentId}/helpdesk/tickets/{ticketNumber}/messages', 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://www.chatbase.co/api/v2/agents/{agentId}/helpdesk/tickets/{ticketNumber}/messages",
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([
'type' => 'reply',
'content' => 'Thanks for reaching out. This is **fixed** now.',
'authorId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'authorEmail' => 'sam@example.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://www.chatbase.co/api/v2/agents/{agentId}/helpdesk/tickets/{ticketNumber}/messages"
payload := strings.NewReader("{\n \"type\": \"reply\",\n \"content\": \"Thanks for reaching out. This is **fixed** now.\",\n \"authorId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorEmail\": \"sam@example.com\"\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://www.chatbase.co/api/v2/agents/{agentId}/helpdesk/tickets/{ticketNumber}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"reply\",\n \"content\": \"Thanks for reaching out. This is **fixed** now.\",\n \"authorId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorEmail\": \"sam@example.com\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.chatbase.co/api/v2/agents/{agentId}/helpdesk/tickets/{ticketNumber}/messages")
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 \"type\": \"reply\",\n \"content\": \"Thanks for reaching out. This is **fixed** now.\",\n \"authorId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorEmail\": \"sam@example.com\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"type": "reply",
"sender": {
"type": "customer",
"id": "<string>",
"name": "<string>",
"email": "<string>"
},
"content": "<string>",
"contentText": "<string>",
"createdAt": "2026-07-29T09:00:00.000Z"
}{
"error": {
"code": "VALIDATION_INVALID_BODY",
"message": "Invalid request"
}
}{
"error": {
"code": "AUTH_MISSING_API_KEY",
"message": "Authentication required"
}
}{
"error": {
"code": "SUBSCRIPTION_API_RESTRICTED_PLAN",
"message": "A Standard plan or higher is required to access the API"
}
}{
"error": {
"code": "TICKET_NOT_FOUND",
"message": "The requested ticket could not be found"
}
}{
"error": {
"code": "CONVERSATION_NOT_TAKEN_OVER",
"message": "The linked conversation is not taken over"
}
}{
"error": {
"code": "TEAM_MEMBER_NOT_FOUND",
"message": "No team member matches the provided author"
}
}{
"error": {
"code": "RATE_LIMIT_TOO_MANY_REQUESTS",
"message": "Too many requests, please try again later"
}
}{
"error": {
"code": "INTERNAL_SERVER_ERROR",
"message": "Something went wrong, please try again"
}
}{
"error": {
"code": "SERVICE_UNDER_MAINTENANCE",
"message": "The API is temporarily unavailable for scheduled maintenance, please try again later"
}
}Add a message to a ticket
Posts an agent reply to a ticket on behalf of a team member. Delivery to the customer is asynchronous; a 201 confirms the reply was recorded, not delivered. Posting a reply may transition the ticket status, matching dashboard behavior.
curl --request POST \
--url https://www.chatbase.co/api/v2/agents/{agentId}/helpdesk/tickets/{ticketNumber}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "reply",
"content": "Thanks for reaching out. This is **fixed** now.",
"authorId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorEmail": "sam@example.com"
}
'import requests
url = "https://www.chatbase.co/api/v2/agents/{agentId}/helpdesk/tickets/{ticketNumber}/messages"
payload = {
"type": "reply",
"content": "Thanks for reaching out. This is **fixed** now.",
"authorId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorEmail": "sam@example.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({
type: 'reply',
content: 'Thanks for reaching out. This is **fixed** now.',
authorId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
authorEmail: 'sam@example.com'
})
};
fetch('https://www.chatbase.co/api/v2/agents/{agentId}/helpdesk/tickets/{ticketNumber}/messages', 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://www.chatbase.co/api/v2/agents/{agentId}/helpdesk/tickets/{ticketNumber}/messages",
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([
'type' => 'reply',
'content' => 'Thanks for reaching out. This is **fixed** now.',
'authorId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'authorEmail' => 'sam@example.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://www.chatbase.co/api/v2/agents/{agentId}/helpdesk/tickets/{ticketNumber}/messages"
payload := strings.NewReader("{\n \"type\": \"reply\",\n \"content\": \"Thanks for reaching out. This is **fixed** now.\",\n \"authorId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorEmail\": \"sam@example.com\"\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://www.chatbase.co/api/v2/agents/{agentId}/helpdesk/tickets/{ticketNumber}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"reply\",\n \"content\": \"Thanks for reaching out. This is **fixed** now.\",\n \"authorId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorEmail\": \"sam@example.com\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.chatbase.co/api/v2/agents/{agentId}/helpdesk/tickets/{ticketNumber}/messages")
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 \"type\": \"reply\",\n \"content\": \"Thanks for reaching out. This is **fixed** now.\",\n \"authorId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorEmail\": \"sam@example.com\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"type": "reply",
"sender": {
"type": "customer",
"id": "<string>",
"name": "<string>",
"email": "<string>"
},
"content": "<string>",
"contentText": "<string>",
"createdAt": "2026-07-29T09:00:00.000Z"
}{
"error": {
"code": "VALIDATION_INVALID_BODY",
"message": "Invalid request"
}
}{
"error": {
"code": "AUTH_MISSING_API_KEY",
"message": "Authentication required"
}
}{
"error": {
"code": "SUBSCRIPTION_API_RESTRICTED_PLAN",
"message": "A Standard plan or higher is required to access the API"
}
}{
"error": {
"code": "TICKET_NOT_FOUND",
"message": "The requested ticket could not be found"
}
}{
"error": {
"code": "CONVERSATION_NOT_TAKEN_OVER",
"message": "The linked conversation is not taken over"
}
}{
"error": {
"code": "TEAM_MEMBER_NOT_FOUND",
"message": "No team member matches the provided author"
}
}{
"error": {
"code": "RATE_LIMIT_TOO_MANY_REQUESTS",
"message": "Too many requests, please try again later"
}
}{
"error": {
"code": "INTERNAL_SERVER_ERROR",
"message": "Something went wrong, please try again"
}
}{
"error": {
"code": "SERVICE_UNDER_MAINTENANCE",
"message": "The API is temporarily unavailable for scheduled maintenance, please try again later"
}
}Authorizations
API key from your account settings
Path Parameters
The agent ID
1"5QHA6VB-DIAbBhxwqxfdi"
The ticket number
x <= 2147483647123
Body
Message type. Only reply (customer-visible, delivered to the customer) is supported.
reply "reply"
Message body as GitHub-flavored Markdown. Plain text is valid markdown; single newlines are kept as line breaks. Raw inline HTML is stripped. Limited to 10,000 characters after trimming.
1 - 10000"Thanks for reaching out. This is **fixed** now."
Platform user id of the team member the reply is attributed to. Provide exactly one of authorId / authorEmail.
Email of the team member the reply is attributed to (case-insensitive). Provide exactly one of authorId / authorEmail.
"sam@example.com"
Response
The created message
Message id
Message type
reply "reply"
The team member the reply is attributed to
Show child attributes
Show child attributes
Rendered, sanitized HTML body
The raw markdown body as submitted
ISO 8601 creation timestamp
"2026-07-29T09:00:00.000Z"
