curl --request PUT \
--url https://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id} \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"email": "john@example.com",
"subject": "How to resolve the pending payments",
"description": "I need your help in resolving the pending payments.",
"ticket_fields": {
"Country": "USA"
},
"attachments": [
"eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=="
],
"status": "closed",
"priority": "urgent",
"category": "Problem",
"sub_category_one": "Billing",
"sub_category_two": "Refund",
"group": "sales",
"assignee_email": "oliver@example.com",
"tags": [
"refund",
"urgent"
],
"add_tags": [
"billing"
],
"remove_tags": [
"urgent"
],
"resolution_due_date": "2025-12-31T23:59:59Z"
}
'const options = {
method: 'PUT',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: 'john@example.com',
subject: 'How to resolve the pending payments',
description: 'I need your help in resolving the pending payments.',
ticket_fields: {Country: 'USA'},
attachments: ['eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=='],
status: 'closed',
priority: 'urgent',
category: 'Problem',
sub_category_one: 'Billing',
sub_category_two: 'Refund',
group: 'sales',
assignee_email: 'oliver@example.com',
tags: ['refund', 'urgent'],
add_tags: ['billing'],
remove_tags: ['urgent'],
resolution_due_date: '2025-12-31T23:59:59Z'
})
};
fetch('https://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}"
payload = {
"email": "john@example.com",
"subject": "How to resolve the pending payments",
"description": "I need your help in resolving the pending payments.",
"ticket_fields": { "Country": "USA" },
"attachments": ["eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=="],
"status": "closed",
"priority": "urgent",
"category": "Problem",
"sub_category_one": "Billing",
"sub_category_two": "Refund",
"group": "sales",
"assignee_email": "oliver@example.com",
"tags": ["refund", "urgent"],
"add_tags": ["billing"],
"remove_tags": ["urgent"],
"resolution_due_date": "2025-12-31T23:59:59Z"
}
headers = {
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text){
"ticket": {
"id": "aaaabbbb-cccc-dddd-eeee-ffff00003333",
"number": 33,
"subject": "How to resolve the pending payments",
"description": "I need your help in resolving the pending payments.",
"priority": "low",
"status": "open",
"created_at": "2025-12-01T10:15:00Z",
"updated_at": "2025-12-05T14:30:00Z",
"external_id": "CP-1234",
"source": "concierge_plus",
"category": "Problem",
"sub_category_one": "Billing",
"sub_category_two": "Refund",
"group": "Sales",
"tags": [
"refund",
"urgent"
],
"assignee": {
"id": "aaaabbbb-cccc-dddd-eeee-ffff00001111",
"name": "Oliver Smith",
"email": "oliver@example.com"
},
"customer": {
"id": "aaaabbbb-cccc-dddd-eeee-ffff00002222",
"name": "John Luther",
"email": "john@example.com",
"phone_numbers": [
"+1234567890"
]
},
"fields": [
{
"field_name": "Country",
"field_value": "USA"
}
]
}
}Update ticket
Updates a ticket. Setting status to moved is refused. tags replaces every tag on the ticket, so use add_tags and remove_tags to change tags without losing the others; tags cannot be combined with either of them.
curl --request PUT \
--url https://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id} \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"email": "john@example.com",
"subject": "How to resolve the pending payments",
"description": "I need your help in resolving the pending payments.",
"ticket_fields": {
"Country": "USA"
},
"attachments": [
"eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=="
],
"status": "closed",
"priority": "urgent",
"category": "Problem",
"sub_category_one": "Billing",
"sub_category_two": "Refund",
"group": "sales",
"assignee_email": "oliver@example.com",
"tags": [
"refund",
"urgent"
],
"add_tags": [
"billing"
],
"remove_tags": [
"urgent"
],
"resolution_due_date": "2025-12-31T23:59:59Z"
}
'const options = {
method: 'PUT',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: 'john@example.com',
subject: 'How to resolve the pending payments',
description: 'I need your help in resolving the pending payments.',
ticket_fields: {Country: 'USA'},
attachments: ['eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=='],
status: 'closed',
priority: 'urgent',
category: 'Problem',
sub_category_one: 'Billing',
sub_category_two: 'Refund',
group: 'sales',
assignee_email: 'oliver@example.com',
tags: ['refund', 'urgent'],
add_tags: ['billing'],
remove_tags: ['urgent'],
resolution_due_date: '2025-12-31T23:59:59Z'
})
};
fetch('https://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{your-subdomain}.neetodesk.com/api/external/v2/tickets/{ticket_id}"
payload = {
"email": "john@example.com",
"subject": "How to resolve the pending payments",
"description": "I need your help in resolving the pending payments.",
"ticket_fields": { "Country": "USA" },
"attachments": ["eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=="],
"status": "closed",
"priority": "urgent",
"category": "Problem",
"sub_category_one": "Billing",
"sub_category_two": "Refund",
"group": "sales",
"assignee_email": "oliver@example.com",
"tags": ["refund", "urgent"],
"add_tags": ["billing"],
"remove_tags": ["urgent"],
"resolution_due_date": "2025-12-31T23:59:59Z"
}
headers = {
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text){
"ticket": {
"id": "aaaabbbb-cccc-dddd-eeee-ffff00003333",
"number": 33,
"subject": "How to resolve the pending payments",
"description": "I need your help in resolving the pending payments.",
"priority": "low",
"status": "open",
"created_at": "2025-12-01T10:15:00Z",
"updated_at": "2025-12-05T14:30:00Z",
"external_id": "CP-1234",
"source": "concierge_plus",
"category": "Problem",
"sub_category_one": "Billing",
"sub_category_two": "Refund",
"group": "Sales",
"tags": [
"refund",
"urgent"
],
"assignee": {
"id": "aaaabbbb-cccc-dddd-eeee-ffff00001111",
"name": "Oliver Smith",
"email": "oliver@example.com"
},
"customer": {
"id": "aaaabbbb-cccc-dddd-eeee-ffff00002222",
"name": "John Luther",
"email": "john@example.com",
"phone_numbers": [
"+1234567890"
]
},
"fields": [
{
"field_name": "Country",
"field_value": "USA"
}
]
}
}{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 of the customer.
"john@example.com"
Subject for the ticket.
"How to resolve the pending payments"
Description for the ticket.
"I need your help in resolving the pending payments."
Custom ticket fields. Refer to the ticket fields article for more details.
{ "Country": "USA" }
Signed ids returned by Upload attachment or Reserve an attachment upload. The files are added to the ticket's opening message, alongside whatever it already carries. A signed id minted in another workspace is rejected, and so is one whose file was reserved but never sent. Attachments are all-or-nothing: if any id in the array is unknown, malformed, unsent or from another workspace, the whole request fails and nothing is attached. A ticket with no opening message cannot take attachments this way; add the file with a comment instead. Attaching applies the workspace attachment limit, 10 MB by default, which is smaller than the 50 MB upload limit.
["eyJfcmFpbHMiOnsiZGF0YSI6IjEyMyJ9fQ=="]
Status for the ticket. Default statuses include new, open, on_hold, waiting_on_customer, closed, spam, trash. Custom statuses are also supported.
"closed"
Priority for the ticket.
low, medium, high, urgent "urgent"
Category for the ticket. Default categories include None, Questions, Incident, Problem, Feature request, Refund. Custom categories are also supported.
"Problem"
Sub-category for the ticket.
"Billing"
Second-level sub-category for the ticket.
"Refund"
Name of an existing group. An unknown name is rejected.
"sales"
Email address belonging to a team member who can be assigned tickets. An unknown email is rejected.
"oliver@example.com"
Tags to assign to the ticket. Replaces every tag the ticket has. Cannot be combined with add_tags or remove_tags.
["refund", "urgent"]
Tags to add, keeping the ticket's existing tags.
["billing"]
Tags to remove, keeping the ticket's other tags. Matched without regard to case.
["urgent"]
Resolution due date for the ticket.
"2025-12-31T23:59:59Z"
Response
OK - Request succeeded
Hide child attributes
Hide child attributes
"aaaabbbb-cccc-dddd-eeee-ffff00003333"
33
"How to resolve the pending payments"
HTML content of the ticket description.
"I need your help in resolving the pending payments."
"low"
"open"
Timestamp when the ticket was created.
"2025-12-01T10:15:00Z"
Timestamp when the ticket was last updated.
"2025-12-05T14:30:00Z"
Identifier for this ticket in the system it was imported from, if one was supplied.
"CP-1234"
Name of the system external_id refers to.
"concierge_plus"
"Problem"
"Billing"
"Refund"
Name of the assigned group.
"Sales"
["refund", "urgent"]