# RouteToHuman > RouteToHuman lets an AI agent route to a human — notifications, alerts, and > two-way human-in-the-loop approvals — through one HTTP API and an MCP tool > server, delivered over email and Slack. Durable receipts, idempotent > creates, RFC 9457 errors. A DevPartners (Development Partners Software LLC) > product. ## Endpoints - API base: https://api.routetohuman.com - POST /v1/messages, GET /v1/messages, GET /v1/messages/{id}, POST /v1/messages/{id}/cancel — the message lifecycle. A message is the genus and the thing the meter counts; telling and asking are its two species, and `intent` says which (notify tells; acknowledge, approveReject, choose and guidance ask). (Authorization: Bearer API key; Idempotency-Key required on create; 202 + the stored message; errors are application/problem+json with a stable `code`). The field is `recipient`: an email address, slack:U… for a person's DM, slack:C… for a channel, or `me`. Leave it out and it means `me` — the account owner — which is the only audience Free allows. An optional `channel` ('email' or 'slack') picks which of your own channels when the recipient is yourself; the response echoes what was resolved. - POST /v1/organizations/self/messages — compose a message as yourself from a signed-in console session (ADR 0052); the agent plane above is for keys - POST /v1/email/sends — transactional email - GET|POST /v1/agents, DELETE /v1/agents/{agentId} — the registered agents a key belongs to (a named sender: an agent, a job, a CLI, anything that asks). The plan caps how many exist at once. - OpenAPI: https://api.routetohuman.com/openapi/v1.json - MCP tool server (Streamable HTTP, OAuth): https://mcp.routetohuman.com/mcp — tools cancel_human_message, get_human_message, get_plan_usage, inform_human, list_audience, request_human_acknowledgement, request_human_approval, request_human_choice, request_human_guidance, submit_feedback. The verb and its object are in the tool's name because an MCP name is namespaced by nothing: inform_human tells, and each request_human_* asks for one kind of answer. Client admission is curated, not open dynamic client registration. Follow https://routetohuman.com/docs/#mcp for approved-client prerequisites. - App (sign in, register agents, issue API keys): https://app.routetohuman.com ## Who an agent may email An organization's own address always. On Team, anyone at a company domain the organization has confirmed. ## Agents first, and not only agents Every surface here is built for agents to use directly, and none of it is reserved for them. A cron job, a CI pipeline, or a person typing `rth inform` reaches the same API with the same limits and the same receipts — a named sender is a named sender, whatever is behind it. ## Command line `rth` is one native binary, about 5 MB, with no runtime to install: - macOS, Linux: curl -fsSL https://get.routetohuman.com/install.sh | sh - Windows: irm https://get.routetohuman.com/install.ps1 | iex - Container: ghcr.io/devpartners/route-to-human/rth `rth inform "…"` sends the one-way message Free allows (no recipient means the account owner); `rth status ` reads it back; `rth doctor` walks install, credential and a live call and stops at the first break. `--help` after any verb is that verb's help and sends nothing, and `--json` prints exactly one JSON object on stdout — the message, or an RFC 9457 problem. Exit codes are a contract: 0 done, 1 the API refused, 2 the command line is wrong, 3 the environment is wrong, 4 the API could not be reached (the one worth retrying). The credential is the same `rth_live_` API key the HTTP API takes, in RTH_API_KEY. Checksums: https://get.routetohuman.com/latest/SHA256SUMS ## Running it unattended A job that narrates itself — `rth inform "starting"`, the work, `rth inform "done"` — puts the binary in the image it already has rather than running a second container: install it in the Dockerfile from https://get.routetohuman.com/install.sh with a pinned `--version` and `--dir /usr/local/bin`. Pipe it to `sh`: the installer is POSIX sh, which matters because a Dockerfile's RUN is `/bin/sh -c`, and that is dash on Debian and Ubuntu. `sh: [[: not found` followed by a SHA256SUMS complaint means a copy of the installer from before 2026-09-20, not a bad download. Keep `ca-certificates` in that image; the binary carries its own TLS but not the certificate authorities. Alpine cannot run it at all — the build is glibc, and musl reports the file as `not found`. Begin the job with `rth doctor || exit 1`. The doctor sends nothing, costs no messages, and stops at the first broken link, so a bad credential fails in the first second instead of arriving hours later as a message that never came. Put `|| true` on the informs themselves, so a notification problem never kills the work it is describing. Three things end an unattended job's access, and the doctor can only see the first: the key's scopes (`messages.write` sends, and `messages.read` is what the doctor's own authenticated check needs — issue both), the key's expiry (90 days by default, 365 the maximum, fixed when the key is minted), and the day's allowance, which is per plan and resets at midnight UTC. ## What a plan may send Free sends notifications only. Acknowledgements and approvals begin on Solo; choices and guidance are Team. A plan meters one number — messages a day across every channel — and a refusal is an RFC 9457 problem with a stable code: `plan_intent_unavailable` (403) when the plan does not include the message type, `quota_exceeded` (429) when the day's allowance is spent. ## Browser pricing tools On /pricing/, get_rth_pricing returns the public catalog, including each plan's availability. check_rth_plan_fit accepts an object with optional: - messagesPerDay: a non-negative safe integer, default 0. - intents: a non-empty array of notify, acknowledge, approveReject, choose, or guidance, default ["notify"]. Every requested type must fit. - recipients: "me" for yourself (trimmed and case-insensitive), or another non-empty string for people at your company. Use "others", not an address. - needsAnswers: legacy boolean, default false. True adds acknowledge and approveReject to intents; it does not request choices or guidance. The result includes fits, recommended, availability, availableNow, normalized requirements, and why. No matching published plan returns fits:false, recommended:null, availability:null, and availableNow:false. A matching waitlist plan returns fits:true but availableNow:false: that is a possible future fit, not an available purchase. Invalid input returns {"error":"invalid_input","hint":"..."} rather than a recommendation. The tool checks published plan allowances, not current quota usage or request rate limits; a fitting workload can still receive a rate-limit 429. These read-only tools return plain JSON values, not MCP content envelopes. They register only when a browser or extension exposes a compatible model context; native support is not guaranteed. Both document.modelContext and navigator.modelContext are checked independently, including late contexts for about ten seconds. No polyfill or origin-trial token is supplied. Without that support, use the static pricing page and this file instead. See [Agent guide](https://routetohuman.com/agents/) for examples and the distinction between these pricing tools and the authenticated remote MCP endpoint that sends messages. ## Pages - [Home](https://routetohuman.com/): what RouteToHuman does, the request and response payloads, MCP client config - [Pricing](https://routetohuman.com/pricing/): **Free is the only plan on sale** ($0, 10 messages a day, notifications only, to yourself, 1 registered agent, 7 days of history) and it is complete — every surface, no crippled API. Solo (100 a day, acknowledgements and approvals, 10 agents, 30 days) and Team (10,000 a day, every message type, anyone on a verified company domain, Slack channels, the outbound webhook, 100 agents, 90 days) are **on the waitlist and their published shape is a draft**: no price is announced for either, and the feature sets may change. The page also registers WebMCP tools (get_rth_pricing, check_rth_plan_fit) for an agent reading it in a browser. - [Agent guide](https://routetohuman.com/agents/): browser pricing tool contracts, no-fit results, capability detection, and remote MCP discovery - [Quickstart](https://routetohuman.com/docs/): start with a Free notification - [Privacy](https://routetohuman.com/privacy/): message contents and response evidence are stored; message history is not automatic deletion. Optional delivery services, limited pricing-tool usage counts, operational logs, and direct-origin IP logging are disclosed. - [Terms](https://routetohuman.com/terms/): transactional messages only ## Contact - hello@routetohuman.com (human contact) - security@routetohuman.com (vulnerability reports — see https://routetohuman.com/.well-known/security.txt)