Skip to content

Support for your Customers

Every product answers its own Customers: a help centre generated with the docs, help requests on every channel, and a person one step away.

A help request, from asked to solved

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 usesThe request arrives
The portal's form or chatWith the member signed in, its org and its plan
An email to the address on the product's HostMatched to the member by its address
openHelpRequest over MCPFrom 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 requestWho answers it
A question the help centre answersThe agent, citing each article it used
A question it cannot cite an answer forA person, from the agent's handoff packet
Anything about money, a dispute or a complaintA person
An urgent requestA person
"Talk to a person", on any channelA 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.

definition.ts
25 lines
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.

Response
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://filings.apis.dev/help/requests; 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.