Agent
Support app update check (public): `update` is none, available (below APP_<PLATFORM>_LATEST) or required (below APP_<PLATFORM>_MIN). Apps send `X-Hatang-App: <platform>/<version>` on /agent/* requests; a build below the minimum gets 426 upgrade_required
Support app update check (public): `update` is none, available (below APP_<PLATFORM>_LATEST) or required (below APP_<PLATFORM>_MIN). Apps send `X-Hatang-App: <platform>/<version>` on /agent/* requests; a build below the minimum gets 426 upgrade_required
Register the support app on this phone or Mac (Bearer mobile agent token); upserts by device_id. Phones send `expo_push_token`; the Mac app (platform macos) sends `apns_token` and `apns_env`
Register the support app on this phone or Mac (Bearer mobile agent token); upserts by device_id. Phones send `expo_push_token`; the Mac app (platform macos) sends `apns_token` and `apns_env`
Forget this phone (sign-out)
Forget this phone (sign-out)
This phone's notification preferences
This phone's notification preferences
Change mute, event kinds, quiet hours or time zone for this phone
Change mute, event kinds, quiet hours or time zone for this phone
Canned responses: the agent's own (private) ones first, then the team's
Canned responses: the agent's own (private) ones first, then the team's
Add a canned response: the agent's own, or the team's with `shared` (chat:manage). An empty shortcut is made from the title
Add a canned response: the agent's own, or the team's with `shared` (chat:manage). An empty shortcut is made from the title
The conversation's scheduled messages (waiting or failed), soonest first
The conversation's scheduled messages (waiting or failed), soonest first
Schedule a reply: sent at `send_at` as this agent's message. At least a minute ahead, within 30 days and before the channel's reply window closes (chat:reply)
Schedule a reply: sent at `send_at` as this agent's message. At least a minute ahead, within 30 days and before the channel's reply window closes (chat:reply)
Change the text or the time of a scheduled (or failed) message
Change the text or the time of a scheduled (or failed) message
Cancel a scheduled message
Cancel a scheduled message
Send a scheduled message now
Send a scheduled message now
Edit one of the agent's own responses (the team's need chat:manage); fields are optional
Edit one of the agent's own responses (the team's need chat:manage); fields are optional
Delete one of the agent's own responses (the team's need chat:manage)
Delete one of the agent's own responses (the team's need chat:manage)
The business's profile links: URL templates (https, {{user_id}} = verified identify() id else the claimed one marked unverified, {{email}}, {{phone}}, {{name}}, {{customer_id}}, {{conversation_id}}, {{site_id}}, {{field.<key>}}, {{data.<key>}}) the client fills per conversation; links with a missing value are hidden
The business's profile links: URL templates (https, {{user_id}} = verified identify() id else the claimed one marked unverified, {{email}}, {{phone}}, {{name}}, {{customer_id}}, {{conversation_id}}, {{site_id}}, {{field.<key>}}, {{data.<key>}}) the client fills per conversation; links with a missing value are hidden
Home summary for the signed-in employee: chat, orders, tickets, payments and employees sections by role and switched-on module, plus an attention list
Home summary for the signed-in employee: chat, orders, tickets, payments and employees sections by role and switched-on module, plus an attention list
The signed-in agent's open reminders (create and complete them over the socket)
The signed-in agent's open reminders (create and complete them over the socket)
Employees who can pick up conversations (assign picker)
Employees who can pick up conversations (assign picker)
Inbox snapshot: `status` open (default; includes pending) | pending | resolved | closed | all, `scope` mine | unassigned | all, `q`, `after` cursor, `unanswered=1`, `flag`, `limit` ≤ 100
Inbox snapshot: `status` open (default; includes pending) | pending | resolved | closed | all, `scope` mine | unassigned | all, `q`, `after` cursor, `unanswered=1`, `flag`, `limit` ≤ 100
One conversation with the latest 100 timeline items (messages carry signed attachment links)
One conversation with the latest 100 timeline items (messages carry signed attachment links)
Email side of a conversation: subject, CC participants, first-answer deadline and how each emailed reply landed (null when the conversation never used email)
Email side of a conversation: subject, CC participants, first-answer deadline and how each emailed reply landed (null when the conversation never used email)
Ask the customer for a rating now (whether or not automatic CSAT is on); result 'rated' when they already did
Ask the customer for a rating now (whether or not automatic CSAT is on); result 'rated' when they already did
Block the conversation's customer: this and their later conversations go to Spam
Block the conversation's customer: this and their later conversations go to Spam
Mute (body { muted: true }) or unmute the conversation for the signed-in agent
Mute (body { muted: true }) or unmute the conversation for the signed-in agent
Pause (body { paused: true }) or resume the AI assistant in the conversation
Pause (body { paused: true }) or resume the AI assistant in the conversation
Teach the AI from one of our public replies: the AI reads the exchange, the closest knowledge and the AI instructions and drafts a Q/A and/or one instruction line (nothing is saved). Needs chat:reply; 429 ai_budget_exhausted, 503 ai_not_configured / ai_unavailable
Teach the AI from one of our public replies: the AI reads the exchange, the closest knowledge and the AI instructions and drafts a Q/A and/or one instruction line (nothing is saved). Needs chat:reply; 429 ai_budget_exhausted, 503 ai_not_configured / ai_unavailable
Save the confirmed draft: the Q/A joins the 'Câu hỏi từ khách' FAQ (skipped when the same question is there; a matching open knowledge gap is answered), the instruction is appended as '- …' (409 instructions_full past 4000 characters). The reply is then re-sent as a message frame with metadata.learned
Save the confirmed draft: the Q/A joins the 'Câu hỏi từ khách' FAQ (skipped when the same question is there; a matching open knowledge gap is answered), the instruction is appended as '- …' (409 instructions_full past 4000 characters). The reply is then re-sent as a message frame with metadata.learned
Recall a message we sent (web chat; personal Zalo on Zalo too); the customer keeps a recalled marker, the team a private note
Recall a message we sent (web chat; personal Zalo on Zalo too); the customer keeps a recalled marker, the team a private note
The customer card: record, latest notes and the business's custom fields (CRM on and readable)
The customer card: record, latest notes and the business's custom fields (CRM on and readable)
Edit any of name, email, phone, owner_id, stage, labels, fields
Edit any of name, email, phone, owner_id, stage, labels, fields
Add a note about the customer (body { body })
Add a note about the customer (body { body })
Delete one of your own notes
Delete one of your own notes
Insert or discard the AI assistant's suggested reply
Insert or discard the AI assistant's suggested reply