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
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.
path Parameters
numberThe ticket number.
Mark a ticket read › Responses
Marked read.
numberread_atunreadSign in on a device
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
emailpasswordFor the session list — a label, never an identity.
Sign in on a device › Responses
Signed in.
Start an SSO sign-in from the app
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.
query Parameters
code_challengebase64url(SHA-256(verifier)).
stateEchoed 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.
Finish an SSO sign-in
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
codecode_verifierFinish an SSO sign-in › Responses
Signed in.
Take work, or stop taking work
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 › Responses
The agent as updated.
Register for push notifications
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_tokenAPNs or FCM token.
platformdevice_nameapp_versionRegister for push notifications › Responses
Registered.
idplatformdevice_nameapp_versionagent_idcontact_idcreated_atlast_seen_atWhat happened on my tickets while I was away
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.
unread_countread_atEverything older than this counts as read. Null when nothing has been read.
Mark everything read
Search tickets, contacts, organizations and articles
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.
query Parameters
qA ticket number, a subject, a name, an address. Under two characters, every list comes back empty.
Search tickets, contacts, organizations and articles › Responses
Success.
Drafts only for an agent session whose role manages the workspace.