curl --request POST \
--url https://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}/comments \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"author_email": "lenor@example.com",
"content": "We are looking into the issue.",
"author_type": "customer",
"comment_type": "note",
"created_at": "2021-06-09T12:00:00Z",
"message_id": "cp-worklog-9912@example.com",
"attachments": [
"eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=="
],
"mentions": [
{
"email": "daniel.kuhlman@example.com"
}
]
}
'import requests
url = "https://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}/comments"
payload = {
"author_email": "lenor@example.com",
"content": "We are looking into the issue.",
"author_type": "customer",
"comment_type": "note",
"created_at": "2021-06-09T12:00:00Z",
"message_id": "cp-worklog-9912@example.com",
"attachments": ["eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=="],
"mentions": [{ "email": "daniel.kuhlman@example.com" }]
}
headers = {
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
author_email: 'lenor@example.com',
content: 'We are looking into the issue.',
author_type: 'customer',
comment_type: 'note',
created_at: '2021-06-09T12:00:00Z',
message_id: 'cp-worklog-9912@example.com',
attachments: ['eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=='],
mentions: [{email: 'daniel.kuhlman@example.com'}]
})
};
fetch('https://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}/comments', 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://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}/comments",
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([
'author_email' => 'lenor@example.com',
'content' => 'We are looking into the issue.',
'author_type' => 'customer',
'comment_type' => 'note',
'created_at' => '2021-06-09T12:00:00Z',
'message_id' => 'cp-worklog-9912@example.com',
'attachments' => [
'eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=='
],
'mentions' => [
[
'email' => 'daniel.kuhlman@example.com'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <x-api-key>"
],
]);
$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://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}/comments"
payload := strings.NewReader("{\n \"author_email\": \"lenor@example.com\",\n \"content\": \"We are looking into the issue.\",\n \"author_type\": \"customer\",\n \"comment_type\": \"note\",\n \"created_at\": \"2021-06-09T12:00:00Z\",\n \"message_id\": \"cp-worklog-9912@example.com\",\n \"attachments\": [\n \"eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ==\"\n ],\n \"mentions\": [\n {\n \"email\": \"daniel.kuhlman@example.com\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<x-api-key>")
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://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}/comments")
.header("X-Api-Key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"author_email\": \"lenor@example.com\",\n \"content\": \"We are looking into the issue.\",\n \"author_type\": \"customer\",\n \"comment_type\": \"note\",\n \"created_at\": \"2021-06-09T12:00:00Z\",\n \"message_id\": \"cp-worklog-9912@example.com\",\n \"attachments\": [\n \"eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ==\"\n ],\n \"mentions\": [\n {\n \"email\": \"daniel.kuhlman@example.com\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}/comments")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"author_email\": \"lenor@example.com\",\n \"content\": \"We are looking into the issue.\",\n \"author_type\": \"customer\",\n \"comment_type\": \"note\",\n \"created_at\": \"2021-06-09T12:00:00Z\",\n \"message_id\": \"cp-worklog-9912@example.com\",\n \"attachments\": [\n \"eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ==\"\n ],\n \"mentions\": [\n {\n \"email\": \"daniel.kuhlman@example.com\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"comment": {
"id": "aaaabbbb-cccc-dddd-eeee-ffff00002222",
"created_at": "2023-11-07T05:31:56Z",
"comment_type": "reply",
"content": "We are looking into the issue and will update you shortly.",
"author": {
"id": "aaaabbbb-cccc-dddd-eeee-ffff00001111",
"name": "Oliver Smith",
"email": "oliver@example.com",
"type": "user"
},
"attachments": [
{
"id": "aaaabbbb-cccc-dddd-eeee-ffff00003333",
"url": "https://example.com/attachments/screenshot.png",
"filename": "screenshot.png"
}
],
"mentions": [
{
"id": "aaaabbbb-cccc-dddd-eeee-ffff00005555",
"name": "Daniel Kuhlman",
"email": "daniel.kuhlman@example.com"
}
]
}
}Create comment
Creates a comment for a specific ticket.
curl --request POST \
--url https://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}/comments \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"author_email": "lenor@example.com",
"content": "We are looking into the issue.",
"author_type": "customer",
"comment_type": "note",
"created_at": "2021-06-09T12:00:00Z",
"message_id": "cp-worklog-9912@example.com",
"attachments": [
"eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=="
],
"mentions": [
{
"email": "daniel.kuhlman@example.com"
}
]
}
'import requests
url = "https://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}/comments"
payload = {
"author_email": "lenor@example.com",
"content": "We are looking into the issue.",
"author_type": "customer",
"comment_type": "note",
"created_at": "2021-06-09T12:00:00Z",
"message_id": "cp-worklog-9912@example.com",
"attachments": ["eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=="],
"mentions": [{ "email": "daniel.kuhlman@example.com" }]
}
headers = {
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
author_email: 'lenor@example.com',
content: 'We are looking into the issue.',
author_type: 'customer',
comment_type: 'note',
created_at: '2021-06-09T12:00:00Z',
message_id: 'cp-worklog-9912@example.com',
attachments: ['eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=='],
mentions: [{email: 'daniel.kuhlman@example.com'}]
})
};
fetch('https://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}/comments', 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://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}/comments",
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([
'author_email' => 'lenor@example.com',
'content' => 'We are looking into the issue.',
'author_type' => 'customer',
'comment_type' => 'note',
'created_at' => '2021-06-09T12:00:00Z',
'message_id' => 'cp-worklog-9912@example.com',
'attachments' => [
'eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=='
],
'mentions' => [
[
'email' => 'daniel.kuhlman@example.com'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <x-api-key>"
],
]);
$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://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}/comments"
payload := strings.NewReader("{\n \"author_email\": \"lenor@example.com\",\n \"content\": \"We are looking into the issue.\",\n \"author_type\": \"customer\",\n \"comment_type\": \"note\",\n \"created_at\": \"2021-06-09T12:00:00Z\",\n \"message_id\": \"cp-worklog-9912@example.com\",\n \"attachments\": [\n \"eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ==\"\n ],\n \"mentions\": [\n {\n \"email\": \"daniel.kuhlman@example.com\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<x-api-key>")
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://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}/comments")
.header("X-Api-Key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"author_email\": \"lenor@example.com\",\n \"content\": \"We are looking into the issue.\",\n \"author_type\": \"customer\",\n \"comment_type\": \"note\",\n \"created_at\": \"2021-06-09T12:00:00Z\",\n \"message_id\": \"cp-worklog-9912@example.com\",\n \"attachments\": [\n \"eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ==\"\n ],\n \"mentions\": [\n {\n \"email\": \"daniel.kuhlman@example.com\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}/comments")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"author_email\": \"lenor@example.com\",\n \"content\": \"We are looking into the issue.\",\n \"author_type\": \"customer\",\n \"comment_type\": \"note\",\n \"created_at\": \"2021-06-09T12:00:00Z\",\n \"message_id\": \"cp-worklog-9912@example.com\",\n \"attachments\": [\n \"eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ==\"\n ],\n \"mentions\": [\n {\n \"email\": \"daniel.kuhlman@example.com\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"comment": {
"id": "aaaabbbb-cccc-dddd-eeee-ffff00002222",
"created_at": "2023-11-07T05:31:56Z",
"comment_type": "reply",
"content": "We are looking into the issue and will update you shortly.",
"author": {
"id": "aaaabbbb-cccc-dddd-eeee-ffff00001111",
"name": "Oliver Smith",
"email": "oliver@example.com",
"type": "user"
},
"attachments": [
{
"id": "aaaabbbb-cccc-dddd-eeee-ffff00003333",
"url": "https://example.com/attachments/screenshot.png",
"filename": "screenshot.png"
}
],
"mentions": [
{
"id": "aaaabbbb-cccc-dddd-eeee-ffff00005555",
"name": "Daniel Kuhlman",
"email": "daniel.kuhlman@example.com"
}
]
}
}{your-subdomain} with your workspace’s subdomain. Learn how to find your subdomain in Workspace subdomain.
Headers
Use the X-Api-Key header to provide your workspace API key. Refer to Authentication for more information.
Path Parameters
ID of the ticket. You can use either the ticket ID (UUID) or ticket number (sequential number) interchangeably. Refer to Getting Ticket ID section for detailed instructions.
Body
Email address to attribute the comment to. Matching is case-insensitive.
How it resolves depends on author_type:
agent— matches an existing team member only. A team member is never created, because that would mean a seat, an invitation and a billing change. An unknown address is rejected.customer— matches an existing customer, and creates one if there is none. This is what an import uses, since a historical thread is full of people who have since left.- omitted — matches an existing team member, then an existing customer, and creates nothing. An unknown address is rejected.
"lenor@example.com"
Content for the comment.
"We are looking into the issue."
Which kind of author author_email refers to, for addresses that could be
either. Also the switch that allows a customer to be created on demand; see
author_email.
agent, customer "customer"
The type of the comment. Defaults to reply.
reply, note "note"
Original time the comment was written, for importing a historical thread.
ISO 8601. The ticket's updated_at becomes the later of its current value and
this date, so posting a thread in order leaves the ticket dated by its newest
comment and posting one out of order never drags it backwards. A value that
cannot be parsed is rejected.
"2021-06-09T12:00:00Z"
Caller-supplied identifier, unique per ticket. Posting the same message_id
twice returns the comment already created rather than a duplicate, which makes
an interrupted import safe to re-run. The repeat also answers 201, so a
re-run cannot be told apart from a first write by status code alone.
"cp-worklog-9912@example.com"
Signed ids returned by Upload attachment. A signed id minted in another workspace is rejected. Attachments are all-or-nothing: if any id in the array is unknown, malformed or from another workspace, the whole request fails and no comment is created.
["eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=="]
Optional list of users to mention in the comment. Mentions are only supported when comment_type is note. For inline placement, include @Full Name for each mentioned user in content.
Hide child attributes
Hide child attributes
Email address of the user to mention. The user must be active in the same organization.
"daniel.kuhlman@example.com"
Response
Created - Comment created successfully
Hide child attributes
Hide child attributes
"aaaabbbb-cccc-dddd-eeee-ffff00002222"
"reply"
"We are looking into the issue and will update you shortly."