Agent → human · pre-launch
The API your agent calls when it needs a human.
Agents are good until the moment that matters. RouteToHuman turns “route this to a person” into one HTTP call — a notification or alert today, a two-way approval on the same rails next. Durable delivery over email now; Slack is the next channel.
Pre-launch: API keys are provisioned by the operator. Write to hello@routetohuman.com for access.
curl --fail-with-body --request POST \
https://api.routetohuman.com/v1/email/sends \
--header "Authorization: Bearer $ROUTE_TO_HUMAN_API_KEY" \
--header "Idempotency-Key: $IDEMPOTENCY_KEY" \
--header "Content-Type: application/json" \
--data '{
"emailAddress":"[email protected]",
"subject":"Review requested",
"body":"Please review the deployment."
}' {
"id": "f8f00ad9aee84e77ad569dc88f9d38c5",
"status": "accepted",
"senderAddress": "[email protected]",
"providerOperationId": "provider-operation-id",
"createdAt": "2026-07-24T12:00:00Z",
"updatedAt": "2026-07-24T12:00:01Z",
"caveat": null
} Accepted · receipt persisted
How it works
One call. A durable path to a person.
-
01
Call
Your agent — or the server it runs on — POSTs /v1/email/sends with an organization-scoped API key and a required Idempotency-Key. Keys begin rth_live_; we store only their SHA-256 hashes.
-
02
Deliver
RouteToHuman queues the message durably and sends it from robot@routetohuman.com via Azure Communication Services. Retry safely: the same idempotency key never sends twice — a replay returns the original receipt with Idempotency-Replayed: true.
-
03
Prove
Every accepted send returns 202, a Location header, and a durable receipt you can read back any time. Receipts are organization-isolated: another org’s key gets 404, not your data.
The API
Small surface, exact contract.
One public operation today: POST /v1/email/sends at api.routetohuman.com. The contract below is the real one — limits included, no asterisks.
- Sender
- robot@routetohuman.com — fixed, cannot be overridden
- Auth
- Organization-scoped API key, single email.send scope, revocable, stored as a SHA-256 hash
- Idempotency
- Idempotency-Key required on every send; reuse with a different payload returns 409 Conflict
- Errors
- RFC 9457 Problem Details (application/problem+json) with a stable code field
- Limits
- Subject 1–200 chars · body 1–10,000 chars · 30 sends/org/minute (429 + Retry-After: 60)
- Telemetry
- Recipient addresses, subjects, and bodies never enter application telemetry; receipts store hashes and provider operation IDs
curl --fail-with-body --request POST \
https://api.routetohuman.com/v1/email/sends \
--header "Authorization: Bearer $ROUTE_TO_HUMAN_API_KEY" \
--header "Idempotency-Key: $IDEMPOTENCY_KEY" \
--header "Content-Type: application/json" \
--data '{
"emailAddress":"[email protected]",
"subject":"Review requested",
"body":"Please review the deployment."
}' Transactional messages only — the API is for routing moments to people, not newsletters. accepted means the provider took the operation; it is not proof of inbox delivery, and we say so in the receipt.
MCP-native
Your agent doesn’t need glue code.
The same capability is exposed as an MCP tool server over Streamable HTTP at mcp.routetohuman.com/mcp. Point an MCP-capable agent at it and “route to a human” becomes a tool the agent can call — same keys, same idempotency, same receipts as the HTTP API.
{
"mcpServers": {
"routetohuman": {
"type": "http",
"url": "https://mcp.routetohuman.com/mcp"
}
}
} Where this is
Shipping in the open, honestly.
Today
- One-way sends: notifications and alerts by email, delivered via Azure Communication Services
- Durable receipts with required idempotency — a retried call never double-sends
- MCP tool server for MCP-capable agents
Next
- Slack as a delivery channel
- Two-way human-in-the-loop approvals — the human’s reply routes back to the agent on the same rails
- Provider delivery events updating receipt status beyond accepted
No testimonials yet — nobody has used it long enough to give one. No pricing page yet — we haven’t set pricing. When those exist, they’ll be real.