Open HelpDesk API
Run in Postman
  • Getting started
  • Assistants
  • API reference
Information
Tickets
    List ticketsgetCreate a ticketpostRead a ticketgetUpdate a ticketpatchList a ticket's messagesgetAdd a reply or an internal notepostList every file on a ticketget
Contacts
    List contactsgetCreate a contactpostRead a contactgetDelete a contact (GDPR erasure)deleteUpdate a contactpatch
Organizations
    List organizationsgetCreate an organizationpostRead an organizationgetDelete an organizationdeleteUpdate an organizationpatch
Knowledge base
    List categoriesgetList articlesgetCreate an articlepostRead an articlegetDelete an articledeleteUpdate an articlepatch
Attachments
    Download a fileget
Workspace
    List agentsgetList teamsgetList macrosgetList SLA policiesgetList saved viewsgetList custom ticket fieldsgetList tags in usegetList satisfaction responsesget
Mobile
    Mark a ticket readpostSign in on a devicepostStart an SSO sign-in from the appgetFinish an SSO sign-inpostSign this device outpostThe agent this device is signed in asgetTake work, or stop taking workpatchRegister for push notificationspostStop notifying this devicedeleteWhat happened on my tickets while I was awaygetMark everything readpostSearch tickets, contacts, organizations and articlesget
Customer app
    Email a customer their sign-in linkpostHand an emailed sign-in over to the appgetFinish a customer sign-inpostSign this device outpostThe customer this device is signed in asgetThe requests a customer may seegetSubmit a requestpostRead a request and its conversationgetAnswer on your own requestpostRegister for push notificationspostStop notifying this devicedeleteNews about my requestsgetMark everything readpost
Schemas
powered by Zudoku
Open HelpDesk API
Open HelpDesk API

Tickets

Requests, their conversations and their files.


List tickets

GET
https://{workspace}.open-helpdesk.com/api/v1
/tickets

List tickets › query Parameters

limit
​integer · min: 1 · max: 100

Rows per page.

Default: 25
cursor
​string

The next_cursor of the previous page.

status
​string

Comma-separated statuses.

priority
​string

Comma-separated priorities.

assignee_id
​string · uuid
organization_id
​string · uuid
requester_id
​string · uuid
tag
​string
updated_since
​string · date-time

Only tickets touched since this instant — the basis of an incremental sync.

List tickets › Responses

List tickets

​Ticket[] · required
next_cursor
​string · required

Pass back as cursor for the next page. Null on the last page.

GET/tickets
curl 'https://{workspace}.open-helpdesk.com/api/v1/tickets' \ --header 'Authorization: Bearer <token>'
Example Responses
{ "data": [ { "number": 4821, "subject": "Cannot export invoices as PDF", "status": "open", "priority": "high", "channel": "email", "type": "type", "requester": { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "email": "test@example.com", "name": "name" }, "assignee_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "organization_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "sla": { "first_reply_due_at": "2024-08-25T15:00:00Z", "next_reply_due_at": "2024-08-25T15:00:00Z", "resolve_due_at": "2024-08-25T15:00:00Z", "first_replied_at": "2024-08-25T15:00:00Z", "warned_at": "2024-08-25T15:00:00Z", "breached_at": "2024-08-25T15:00:00Z" }, "created_at": "2024-08-25T15:00:00Z", "updated_at": "2024-08-25T15:00:00Z", "unread": true } ], "next_cursor": "next_cursor" }
json
application/json

Create a ticket

POST
https://{workspace}.open-helpdesk.com/api/v1
/tickets

Goes through the same path as an inbound email: the requester is found or created, rules and SLA policies run, and outbound webhooks fire.

Create a ticket › Request Body

requester_email
​string · email · required
subject
​string · maxLength: 500 · required
message
​string · required
requester_name
​string
priority
​string · enum
Enum values:
low
normal
high
urgent
Default: normal
organization_id
​string · uuid
tags
​string[] · maxItems: 30
​object

Create a ticket › Responses

The ticket as created, with the files stored.

Ticket
number
​integer

Per-workspace ticket number, the one agents see.

Example: 4821
subject
​string
status
​string · enum
Enum values:
new
open
waiting
on_hold
resolved
closed
Example: open
priority
​string · enum
Enum values:
low
normal
high
urgent
Example: high
channel
​string · enum
Enum values:
email
portal
widget
api
Example: email
type
​string
​object
assignee_id
​string · uuid
organization_id
​string · uuid
​object

The clock on this ticket. Instants, not remaining durations: a client that has been asleep would otherwise show an hour-old countdown as current. warned_at and breached_at are stamped by the workspace itself, so they say what it has already acted on.

created_at
​string · date-time
updated_at
​string · date-time
unread
​boolean

Is there a message this agent has not seen — one they did not write themselves, newer than the last time they marked the ticket read (POST /tickets/{number}/read). Present only for an agent session: a workspace API key has no "I" to answer for, so the field is absent rather than guessed.

POST/tickets
curl 'https://{workspace}.open-helpdesk.com/api/v1/tickets' \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "requester_email": "julien.lambert@nordfil.fr", "requester_name": "Julien Lambert", "subject": "Cannot export invoices as PDF", "message": "Hello, the PDF export has been failing since this morning.", "priority": "normal", "organization_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "tags": [ "string" ], "custom_fields": {} }'
Example Request Body
{ "requester_email": "julien.lambert@nordfil.fr", "requester_name": "Julien Lambert", "subject": "Cannot export invoices as PDF", "message": "Hello, the PDF export has been failing since this morning.", "priority": "normal", "organization_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "tags": [ "string" ], "custom_fields": {} }
json
Example Responses
{ "number": 4821, "subject": "Cannot export invoices as PDF", "status": "open", "priority": "high", "channel": "email", "type": "type", "requester": { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "email": "test@example.com", "name": "name" }, "assignee_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "organization_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "sla": { "first_reply_due_at": "2024-08-25T15:00:00Z", "next_reply_due_at": "2024-08-25T15:00:00Z", "resolve_due_at": "2024-08-25T15:00:00Z", "first_replied_at": "2024-08-25T15:00:00Z", "warned_at": "2024-08-25T15:00:00Z", "breached_at": "2024-08-25T15:00:00Z" }, "created_at": "2024-08-25T15:00:00Z", "updated_at": "2024-08-25T15:00:00Z", "unread": true }
json
application/json

Read a ticket

GET
https://{workspace}.open-helpdesk.com/api/v1
/tickets/{number}

Read a ticket › path Parameters

number
​integer · required

The ticket number agents see.

Read a ticket › Responses

Success.

Ticket
number
​integer

Per-workspace ticket number, the one agents see.

Example: 4821
subject
​string
status
​string · enum
Enum values:
new
open
waiting
on_hold
resolved
closed
Example: open
priority
​string · enum
Enum values:
low
normal
high
urgent
Example: high
channel
​string · enum
Enum values:
email
portal
widget
api
Example: email
type
​string
​object
assignee_id
​string · uuid
organization_id
​string · uuid
​object

The clock on this ticket. Instants, not remaining durations: a client that has been asleep would otherwise show an hour-old countdown as current. warned_at and breached_at are stamped by the workspace itself, so they say what it has already acted on.

created_at
​string · date-time
updated_at
​string · date-time
unread
​boolean

Is there a message this agent has not seen — one they did not write themselves, newer than the last time they marked the ticket read (POST /tickets/{number}/read). Present only for an agent session: a workspace API key has no "I" to answer for, so the field is absent rather than guessed.

GET/tickets/{number}
curl 'https://{workspace}.open-helpdesk.com/api/v1/tickets/:number' \ --header 'Authorization: Bearer <token>'
Example Responses
{ "number": 4821, "subject": "Cannot export invoices as PDF", "status": "open", "priority": "high", "channel": "email", "type": "type", "requester": { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "email": "test@example.com", "name": "name" }, "assignee_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "organization_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "sla": { "first_reply_due_at": "2024-08-25T15:00:00Z", "next_reply_due_at": "2024-08-25T15:00:00Z", "resolve_due_at": "2024-08-25T15:00:00Z", "first_replied_at": "2024-08-25T15:00:00Z", "warned_at": "2024-08-25T15:00:00Z", "breached_at": "2024-08-25T15:00:00Z" }, "created_at": "2024-08-25T15:00:00Z", "updated_at": "2024-08-25T15:00:00Z", "unread": true }
json
application/json

Update a ticket

PATCH
https://{workspace}.open-helpdesk.com/api/v1
/tickets/{number}

custom_fields is merged, not replaced: omitting a key leaves it alone.

Update a ticket › path Parameters

number
​integer · required

The ticket number agents see.

Update a ticket › Request Body

status
​string · enum
Enum values:
new
open
waiting
on_hold
resolved
closed
priority
​string · enum
Enum values:
low
normal
high
urgent
assignee_id
​string · uuid
organization_id
​string · uuid
subject
​string · maxLength: 500
type
​string
tags
​string[] · maxItems: 30
​object

Update a ticket › Responses

Success.

Ticket
number
​integer

Per-workspace ticket number, the one agents see.

Example: 4821
subject
​string
status
​string · enum
Enum values:
new
open
waiting
on_hold
resolved
closed
Example: open
priority
​string · enum
Enum values:
low
normal
high
urgent
Example: high
channel
​string · enum
Enum values:
email
portal
widget
api
Example: email
type
​string
​object
assignee_id
​string · uuid
organization_id
​string · uuid
​object

The clock on this ticket. Instants, not remaining durations: a client that has been asleep would otherwise show an hour-old countdown as current. warned_at and breached_at are stamped by the workspace itself, so they say what it has already acted on.

created_at
​string · date-time
updated_at
​string · date-time
unread
​boolean

Is there a message this agent has not seen — one they did not write themselves, newer than the last time they marked the ticket read (POST /tickets/{number}/read). Present only for an agent session: a workspace API key has no "I" to answer for, so the field is absent rather than guessed.

PATCH/tickets/{number}
curl 'https://{workspace}.open-helpdesk.com/api/v1/tickets/:number' \ --request PATCH \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "status": "new", "priority": "low", "assignee_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "organization_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "subject": "subject", "type": "type", "tags": [ "string" ], "custom_fields": {} }'
Example Request Body
{ "status": "new", "priority": "low", "assignee_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "organization_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "subject": "subject", "type": "type", "tags": [ "string" ], "custom_fields": {} }
json
Example Responses
{ "number": 4821, "subject": "Cannot export invoices as PDF", "status": "open", "priority": "high", "channel": "email", "type": "type", "requester": { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "email": "test@example.com", "name": "name" }, "assignee_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "organization_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "sla": { "first_reply_due_at": "2024-08-25T15:00:00Z", "next_reply_due_at": "2024-08-25T15:00:00Z", "resolve_due_at": "2024-08-25T15:00:00Z", "first_replied_at": "2024-08-25T15:00:00Z", "warned_at": "2024-08-25T15:00:00Z", "breached_at": "2024-08-25T15:00:00Z" }, "created_at": "2024-08-25T15:00:00Z", "updated_at": "2024-08-25T15:00:00Z", "unread": true }
json
application/json

List a ticket's messages

GET
https://{workspace}.open-helpdesk.com/api/v1
/tickets/{number}/messages

Oldest first — the order a human reads the thread in.

List a ticket's messages › path Parameters

number
​integer · required

The ticket number.

List a ticket's messages › query Parameters

limit
​integer · min: 1 · max: 100

Rows per page.

Default: 25
cursor
​string

The next_cursor of the previous page.

List a ticket's messages › Responses

The conversation.

​Message[] · required
next_cursor
​string · required

Pass back as cursor for the next page. Null on the last page.

GET/tickets/{number}/messages
curl 'https://{workspace}.open-helpdesk.com/api/v1/tickets/:number/messages' \ --header 'Authorization: Bearer <token>'
Example Responses
{ "data": [ { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "kind": "public_reply", "author_type": "agent", "author_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "body_text": "Hello, the PDF export fails since this morning.", "body_html": "body_html", "source": "source", "created_at": "2024-08-25T15:00:00Z", "attachments": [ { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "message_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "filename": "filename", "content_type": "content_type", "size_bytes": 0, "download_url": "download_url", "created_at": "2024-08-25T15:00:00Z" } ] } ], "next_cursor": "next_cursor" }
json
application/json

Add a reply or an internal note

POST
https://{workspace}.open-helpdesk.com/api/v1
/tickets/{number}/messages

A public reply reaches the customer and fires the same rules the product does; an internal note stays inside the workspace.

Add a reply or an internal note › path Parameters

number
​integer · required

The ticket number.

Add a reply or an internal note › Request Body

body
​string · required
internal
​boolean
Default: false
agent_id
​string · uuid

The agent the message is attributed to.

Example: 3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83

Add a reply or an internal note › Responses

The message, and the files stored with it.

What a POST to a thread answers: the message, and what became of its files.
WrittenMessage
id
​string · uuid
ticket_number
​integer
internal
​boolean
created_at
​string · date-time
​object[]
skipped_files
​string[]

Present only when storage refused a file — it names which.

POST/tickets/{number}/messages
curl 'https://{workspace}.open-helpdesk.com/api/v1/tickets/:number/messages' \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "body": "We have shipped a fix — could you try again?", "internal": false, "agent_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83" }'
Example Request Body
{ "body": "We have shipped a fix — could you try again?", "internal": false, "agent_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83" }
json
Example Responses
{ "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "ticket_number": 0, "internal": true, "created_at": "2024-08-25T15:00:00Z", "attachments": [ { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "filename": "filename", "content_type": "content_type", "size_bytes": 0, "download_url": "download_url" } ], "skipped_files": [ "string" ] }
json
application/json

List every file on a ticket

GET
https://{workspace}.open-helpdesk.com/api/v1
/tickets/{number}/attachments

List every file on a ticket › path Parameters

number
​integer · required

The ticket number.

List every file on a ticket › Responses

Files across the whole thread.

​Attachment[] · required
next_cursor
​string · required

Pass back as cursor for the next page. Null on the last page.

GET/tickets/{number}/attachments
curl 'https://{workspace}.open-helpdesk.com/api/v1/tickets/:number/attachments' \ --header 'Authorization: Bearer <token>'
Example Responses
{ "data": [ { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "message_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "filename": "filename", "content_type": "content_type", "size_bytes": 0, "download_url": "download_url", "created_at": "2024-08-25T15:00:00Z" } ], "next_cursor": "next_cursor" }
json
application/json

Contacts