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

Mobile

Signing in on a phone, and what only a signed-in phone can ask: who am I, notify me, search.


Mark a ticket read

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

Clears the unread dot for the calling agent, and for them alone — a colleague opening the ticket does not clear mine.

Explicit rather than implied by GET /tickets/{number}: a read that happens as a side effect of fetching cannot be retried, prefetched or cached, and a client fetches a ticket for reasons other than a human reading it.

Mark a ticket read › path Parameters

number
​integer · required

The ticket number.

Mark a ticket read › Responses

Marked read.

number
​integer
read_at
​string · date-time
unread
​boolean
POST/tickets/{number}/read
curl 'https://{workspace}.open-helpdesk.com/api/v1/tickets/:number/read' \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "number": 0, "read_at": "2024-08-25T15:00:00Z", "unread": false }
json
application/json

Sign in on a device

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

Exchanges an agent's credentials for a token bound to this phone, revocable on its own. Call it on the workspace's own address ({slug}.$BASE_DOMAIN): the workspace comes from the host, never from the body.

Unauthenticated, so it is limited separately — ten attempts per address and forty per source every five minutes.

Sign in on a device › Request Body

email
​string · email · required
password
​string · password · required
​object

For the session list — a label, never an identity.

Sign in on a device › Responses

Signed in.

The result of signing in on a device. `token` is shown once and cannot be recovered — store it in the platform keychain, not in application storage.
Session
token
​string · required
expires_at
​string · date-time · required

Slides forward on every authenticated call (90 days of inactivity).

​Agent · required
session_id
​string · uuid

This device's session, as it appears in /me.

Example: 3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83
​object
POST/auth/login
curl 'https://{workspace}.open-helpdesk.com/api/v1/auth/login' \ --request POST \ --header 'Content-Type: application/json' \ --data '{ "email": "sarah@acme.fr", "password": "********", "device": { "name": "Sarah'\''s iPhone", "platform": "ios", "app_version": "1.0.0 (42)" } }'
Example Request Body
{ "email": "sarah@acme.fr", "password": "********", "device": { "name": "Sarah's iPhone", "platform": "ios", "app_version": "1.0.0 (42)" } }
json
Example Responses
{ "token": "ohd_app_2f1c…", "session_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "expires_at": "2024-08-25T15:00:00Z", "agent": { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "email": "test@example.com", "name": "name", "role": "owner", "status": "active", "available": true, "created_at": "2024-08-25T15:00:00Z" }, "workspace": { "slug": "slug", "name": "name" } }
json
application/json

Start an SSO sign-in from the app

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

The browser leg of a single sign-on. Open the workspace's login page in a system browser with ?next=/api/v1/auth/authorize?code_challenge=…; once the identity provider has signed the agent in, this route redirects to the app's URL scheme carrying a one-time code, which the app spends on /auth/exchange.

The destination is the scheme configured on the instance — there is no redirect_uri parameter, by design. PKCE S256 is required: a custom scheme is not exclusive to one installed app.

Start an SSO sign-in from the app › query Parameters

code_challenge
​string · minLength: 43 · maxLength: 43 · required

base64url(SHA-256(verifier)).

state
​string · maxLength: 128

Echoed back untouched.

Start an SSO sign-in from the app › Responses

Redirect to openhelpdesk://auth?code=…, or to the login page when the browser has no session yet.

No data returned
GET/auth/authorize
curl 'https://{workspace}.open-helpdesk.com/api/v1/auth/authorize?code_challenge=<string>'
Example Responses
No example specified for this content type

Finish an SSO sign-in

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

Trades the one-time code for a device session. Single use, two minutes, and worthless without the verifier the app kept.

Finish an SSO sign-in › Request Body

code
​string · required
code_verifier
​string · minLength: 43 · maxLength: 128 · required
​object

Finish an SSO sign-in › Responses

Signed in.

The result of signing in on a device. `token` is shown once and cannot be recovered — store it in the platform keychain, not in application storage.
Session
token
​string · required
expires_at
​string · date-time · required

Slides forward on every authenticated call (90 days of inactivity).

​Agent · required
session_id
​string · uuid

This device's session, as it appears in /me.

Example: 3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83
​object
POST/auth/exchange
curl 'https://{workspace}.open-helpdesk.com/api/v1/auth/exchange' \ --request POST \ --header 'Content-Type: application/json' \ --data '{ "code": "code", "code_verifier": "code_verifieraaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "device": { "name": "name", "platform": "ios", "app_version": "app_version" } }'
Example Request Body
{ "code": "code", "code_verifier": "code_verifieraaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "device": { "name": "name", "platform": "ios", "app_version": "app_version" } }
json
Example Responses
{ "token": "ohd_app_2f1c…", "session_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "expires_at": "2024-08-25T15:00:00Z", "agent": { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "email": "test@example.com", "name": "name", "role": "owner", "status": "active", "available": true, "created_at": "2024-08-25T15:00:00Z" }, "workspace": { "slug": "slug", "name": "name" } }
json
application/json

Sign this device out

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

Revokes the session the call is made with, and its push registrations. Other devices and browser sessions are untouched.

Sign this device out › Responses

Signed out.

No data returned
POST/auth/logout
curl 'https://{workspace}.open-helpdesk.com/api/v1/auth/logout' \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
No example specified for this content type

The agent this device is signed in as

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

Identity, role and teams — what "my tickets" and the view switcher are built from. Needs an agent session: a workspace API key has nobody behind it and gets 403 agent_required.

The agent this device is signed in as › Responses

Success.

Me
​Agent
​Team[]
​object
​object
GET/me
curl 'https://{workspace}.open-helpdesk.com/api/v1/me' \ --header 'Authorization: Bearer <token>'
Example Responses
{ "agent": { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "email": "test@example.com", "name": "name", "role": "owner", "status": "active", "available": true, "created_at": "2024-08-25T15:00:00Z" }, "teams": [ { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "name": "name", "created_at": "2024-08-25T15:00:00Z" } ], "workspace": { "slug": "slug", "name": "name", "locale": "locale", "timezone": "timezone" }, "session": { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83" } }
json
application/json

Take work, or stop taking work

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

available is the only writable field, and it is not cosmetic: round-robin assignment only ever picks an available agent, so turning it off on the way into a meeting is how a queue stops filling up for somebody who cannot answer.

A name, an email or a role are the workspace's business. An endpoint called /me that could change a role would be a privilege escalation with a friendly name.

Take work, or stop taking work › Request Body

available
​boolean · required

Take work, or stop taking work › Responses

The agent as updated.

​Agent
PATCH/me
curl 'https://{workspace}.open-helpdesk.com/api/v1/me' \ --request PATCH \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "available": true }'
Example Request Body
{ "available": true }
json
Example Responses
{ "agent": { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "email": "test@example.com", "name": "name", "role": "owner", "status": "active", "available": true, "created_at": "2024-08-25T15:00:00Z" } }
json
application/json

Register for push notifications

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

Upsert on the token: the operating system rotates and reissues it, so re-registering updates the row instead of leaving a trail of them.

Register for push notifications › Request Body

push_token
​string · maxLength: 512 · required

APNs or FCM token.

platform
​string · enum · required
Enum values:
ios
android
device_name
​string
app_version
​string

Register for push notifications › Responses

Registered.

A push registration. The APNs/FCM token itself is never returned.
PushDevice
id
​string · uuid
platform
​string · enum
Enum values:
ios
android
device_name
​string
app_version
​string
agent_id
​string · uuid
contact_id
​string · uuid
created_at
​string · date-time
last_seen_at
​string · date-time
POST/devices
curl 'https://{workspace}.open-helpdesk.com/api/v1/devices' \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "push_token": "push_token", "platform": "ios", "device_name": "device_name", "app_version": "app_version" }'
Example Request Body
{ "push_token": "push_token", "platform": "ios", "device_name": "device_name", "app_version": "app_version" }
json
Example Responses
{ "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "platform": "ios", "device_name": "device_name", "app_version": "app_version", "agent_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "contact_id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "created_at": "2024-08-25T15:00:00Z", "last_seen_at": "2024-08-25T15:00:00Z" }
json
application/json

Stop notifying this device

DELETE
https://{workspace}.open-helpdesk.com/api/v1
/devices/{id}

An agent revokes their own registrations; a device is not workspace furniture.

Stop notifying this device › path Parameters

id
​string · uuid · required

The registration id.

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

Stop notifying this device › Responses

Revoked.

No data returned
DELETE/devices/{id}
curl 'https://{workspace}.open-helpdesk.com/api/v1/devices/:id' \ --request DELETE \ --header 'Authorization: Bearer <token>'
Example Responses
No example specified for this content type

What happened on my tickets while I was away

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

The same feed the web topbar shows, as data rather than as sentences — a phone writes its own wording, in the language of the phone.

read is not per item and cannot be: the feed is derived from tickets and messages, so there is no row to mark. It is a waterline (see POST /notifications/read).

What happened on my tickets while I was away › Responses

Success.

Derived from tickets and messages, never stored — which is why `read` is a waterline and not a per-item flag.
NotificationFeed
​Notification[] · required
unread_count
​integer · required
read_at
​string · date-time · required

Everything older than this counts as read. Null when nothing has been read.

GET/notifications
curl 'https://{workspace}.open-helpdesk.com/api/v1/notifications' \ --header 'Authorization: Bearer <token>'
Example Responses
{ "data": [ { "id": "id", "kind": "sla_breached", "ticket_number": 0, "ticket_subject": "ticket_subject", "actor_name": "actor_name", "at": "2024-08-25T15:00:00Z", "read": true } ], "unread_count": 0, "read_at": "2024-08-25T15:00:00Z" }
json
application/json

Mark everything read

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

Moves the waterline to now. Shared with the web topbar's own button, so clearing the badge on a phone clears it in the browser too.

Mark everything read › Responses

Success.

ReadReceipt
read_at
​string · date-time
unread_count
​integer
POST/notifications/read
curl 'https://{workspace}.open-helpdesk.com/api/v1/notifications/read' \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "read_at": "2024-08-25T15:00:00Z", "unread_count": 0 }
json
application/json

Search tickets, contacts, organizations and articles

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

One query across four collections, as the search box offers it. A few top matches per kind, no pagination — page /tickets with real filters to walk a set.

Search tickets, contacts, organizations and articles › query Parameters

q
​string · minLength: 2 · required

A ticket number, a subject, a name, an address. Under two characters, every list comes back empty.

Search tickets, contacts, organizations and articles › Responses

Success.

A few top matches per kind — this answers "take me to it", not "list them all".
SearchResults
​object[]
​object[]
​object[]
​object[]

Drafts only for an agent session whose role manages the workspace.

GET/search
curl 'https://{workspace}.open-helpdesk.com/api/v1/search?q=<string>' \ --header 'Authorization: Bearer <token>'
Example Responses
{ "tickets": [ { "number": 0, "subject": "subject", "status": "status" } ], "contacts": [ { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "name": "name", "email": "test@example.com", "organization_name": "organization_name" } ], "organizations": [ { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "name": "name" } ], "articles": [ { "id": "3f2a1c94-8e5b-4d17-9f60-2c7b1a0d5e83", "title": "title", "status": "status", "view_count": 0 } ] }
json
application/json

WorkspaceCustomer app