Support for your Customers
Open in
Every product answers its own Customers: a help centre generated with the docs, help requests on every channel, and a person one step away.
Where a Customer asks
A help request is one thread, so its messages, its calls and its answers sit together on every channel it touches.
| The Customer uses | The request arrives |
|---|---|
| The portal's form or chat | With the member signed in, its org and its plan |
| An email to the address on the product's Host | Matched to the member by its address |
openHelpRequest over MCP | From a Customer's agent, under the same Key or mandate as every call, with its state as data |
Each request carries any request id, Action, receipt or record it names, with the calls behind them one step away for whoever answers.
Agent or person: who answers
With help.agent, an agent answers first, from the help centre and the asker's own records.
Find the request on the left to see who takes it.
| The request | Who answers it |
|---|---|
| A question the help centre answers | The agent, citing each article it used |
| A question it cannot cite an answer for | A person, from the agent's handoff packet |
| Anything about money, a dispute or a complaint | A person |
| An urgent request | A person |
| "Talk to a person", on any channel | A person, in one step |
The answering agent reads only; it never moves money or changes a record, and every reply it drafts is kept with the request. Your team works one queue on the Operator plane, each request with its calls, its clock and the agent's packet, through HelpRequest.list, HelpRequest.reply and HelpRequest.assign.
The promise, and its clock
help.respond sets the time to a first answer per plan, from a person or from an agent that cites one.
help.urgent sets a shorter time for an outage or a stopped business.
Example
The filing service answers within four hours on weekdays, within one when urgent, and hands anything it cannot cite to a paralegal.
import { define, agentic } from 'apis.dev'
/** Annual reports for each client, filed with the state once the client signs, with help a person stands behind. */
export default define({
name: 'filings', domain: 'filings.apis.dev',
roles: { paralegal: { see: { Filing: 'all' } } },
Filing: {
company: 'string', year: 'number',
status: {
order: [],
sign: { in: 'ordered', floor: 'signature' },
file: { in: 'signed', run: agentic('File the signed report with the state') },
accept: 'filed', reject: 'filed',
},
},
help: {
channels: ['portal', 'email', 'chat', 'mcp'],
respond: '4h', urgent: '1h', hours: 'weekdays',
agent: true, person: 'paralegal', // who takes over from the agent
},
offer: {
'Filing.order': { price: 25, when: 'accepted', accept: 'customer',
acceptWithin: '7d', remedy: 'redo', grade: 'measured' },
},
})A client's agent asks why its filing waits, and the answer cites the guide.
HTTP/1.1 201 Created
Content-Type: application/ json
Location: /help/ requests/ help_9
X-Cost: price= 0, currency= "USD"
X-Request-Id: req_0c5e2b97a1d84f36e7b1
{
"id": "help_9",
"state": "answered",
"priority": "normal",
"about": ["filing_3"],
"answer": {
"by": "agent",
"text": "filing_3 waits on your signature at the link sent on 2026-10-26.",
"cites": ["https: //filings.apis.dev/ help/ sign-a-filing"]
},
"promise": { "by": "2026-10-27T18: 00: 00Z", "met": true },
"person": "https: //filings.apis.dev/ help/ requests/ help_9/ person"
}The agent sent POST https:; over MCP the same request is openHelpRequest.
The clock runs in help.hours and pauses while a request waits on the Customer. A breach writes an Event and, where an agreement sells it, a credit. A request is normal or urgent; an open incident makes every request about it urgent, and answers each with its status page.
The help centre
The help centre is never a second set of docs: it is the same pages at /help, ranked for a Customer's question.
It holds an article per task the file describes, a page per refusal with its cure, the status and the changelog, in every locale. An article is generated at each deploy, edited by an override of your own, and stale when a deploy changes what an edited article describes.
After a request is resolved, the asker gets a one-question rating and 7 days to reopen it before it is closed. Each help-centre search with no answer is counted as a gap you can read.
The bar for generated pages
Every page a product generates meets one bar: WCAG 2.2 AA in both schemes, search-engine metadata, a speed budget on a phone, and every locale.
Ask, answers from your docs
Cited answers over your product's docs for your Customers and their agents, on the docs, in the portal and over MCP, with a person one step away.