Customer app
What a customer may do with their own requests. A namespace of its own, not the agent routes with a narrower credential.
Email a customer their sign-in link
Customers have no password — the portal signs them in by emailed link, and the app
uses the same one. The link lands in a browser, which hands the session to the app
through /portal/auth/handoff, so generate a PKCE verifier first and pass its
challenge here: it is what the handover code will be bound to.
Always 202. An address with no account, a blocked one and a real one are indistinguishable in the answer — anything else would turn this into a directory of a workspace's customers.
Email a customer their sign-in link › Request Body
emailcode_challengebase64url(SHA-256(verifier)).
Email a customer their sign-in link › Responses
The link is on its way, if that address can receive one.
sentemailHand an emailed sign-in over to the app
Where the magic link ends up. With the portal cookie the browser just received, it redirects to the app's URL scheme carrying a one-time code. Not called by the app itself — the app waits for the deep link.
query Parameters
code_challengeThe challenge the link was built with.
stateHand an emailed sign-in over to the app › Responses
Redirect to openhelpdesk://portal-auth?code=….
Finish a customer sign-in
Trades the handover code for a session bound to this phone. Single use, two minutes.
Finish a customer sign-in › Request Body
codecode_verifierFinish a customer sign-in › Responses
Signed in.
tokenexpires_atA customer, as they may see themselves — never the notes a workspace keeps about them.
session_idThe customer this device is signed in as
Identity and organization (MC-05). workspace.locale is the language to render in: the product runs one language per workspace, so there is deliberately no per-customer language to write.
The customer this device is signed in as › Responses
Success.
A customer, as they may see themselves — never the notes a workspace keeps about them.
The requests a customer may see
scope=mine is theirs; scope=organization is their company's, and only where that company has ticket sharing turned on. The fifty most recently updated, unpaginated — next_cursor is always null.
query Parameters
scopeThe requests a customer may see › Responses
The customer's requests.
next_cursorPass back as cursor for the next page. Null on the last page.
Submit a request
Files the request on the portal channel and runs the same rules, SLA policies and notifications as the web portal — a request typed on a phone is not a second kind of request.
Submit a request › Request Body
subjectbodyurgencyThe customer's own word for it. It stops at high: a field on which anyone can declare their request the most urgent teaches agents to ignore it.
Submit a request › Responses
The request as filed.
numbersubjectstatustypecreated_atupdated_atresolved_atclosed_atRead a request and its conversation
Public replies only — internal notes are excluded by the query itself. A request that is not the customer's answers 404, never 403: otherwise the numbers become a way to count a workspace's tickets.
path Parameters
numberThe request number.
Read a request and its conversation › Responses
Success.
numbersubjectstatustypecreated_atupdated_atresolved_atclosed_atAnswer on your own request
Only the requester may write; a colleague who can read the company's requests cannot answer in their thread. A reply reopens what was waiting, on hold or resolved.
path Parameters
numberThe request number.
Answer on your own request › Responses
The message as written.
idauthor_typeauthor_namebody_textbody_htmlcreated_atRegister for push notifications
Upsert on the token, like the agents' registrations.
Register for push notifications › Request Body
push_tokenplatformdevice_nameapp_versionRegister for push notifications › Responses
Registered.
idplatformdevice_nameapp_versionagent_idcontact_idcreated_atlast_seen_atNews about my requests
Somebody answered, or a request was resolved (MC-04). Nothing about a colleague's request: belonging to an organization that shares its tickets lets someone read them, which is not being notified about them.
News about my requests › Responses
Success.
unread_countread_at