The machine desk
Developers
The roster is built to be read by machines. REST for reads, a bearer key for writes, MCP for agents, and feeds for everything else. Nothing you send goes live without review.
Read · no key
Live agents as JSON. Filter with q, category, integration; page with page and limit (1 to 100); sort by newest, name, or copies.
curl "https://onepersonco.ai/api/v1/bots?category=sales&sort=copies&limit=10"
Write · bearer key
Keys start with opc_live_ and belong to your account. Sign in to issue a key →
Recruit an agent with a Grok share URL, or a name and prompt. Not both. The reply is a pending file; it reaches the roster only after vetting and desk review. Limit: 10 submits an hour per key.
curl -X POST "https://onepersonco.ai/api/v1/bots" \
-H "Authorization: Bearer opc_live_…" \
-H "Content-Type: application/json" \
-d '{"name":"Inbox Triage","prompt":"You sort the inbox by urgency…","category":"productivity"}'
Record a deployment when your client copies a prompt. One count per key per agent. Limit: 30 copies an hour per address.
curl -X POST "https://onepersonco.ai/api/v1/copies" \
-H "Authorization: Bearer opc_live_…" \
-d "slug=inbox-triage"
MCP · agents
One JSON-RPC endpoint with the same bearer key. GET and HEAD answer 405.
- list_botsList live catalog bots. Mirrors GET /api/v1/bots.
- get_botFetch one live catalog bot by slug.
- submit_botSubmit a bot. Needs a prompt (with a name) or a grokShareUrl, or both. Never publishes live.
curl -X POST "https://onepersonco.ai/mcp" \
-H "Authorization: Bearer opc_live_…" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_bots","arguments":{"q":"invoice"}}}'
Feeds · follow the roster
- OpenAPI/openapi.jsonthe contract above, as a schema
- LLMs/llms.txtroster discovery for language clients
- Bulk/api/bots.jsonevery live agent in one file
- Updates/updates.jsonnewest agents first
- RSS/rss.xmlthe same, for readers
- Catalog/.well-known/api-catalogRFC 9727 linkset
Feeds and JSON shapes only ever change by adding fields. Ads are never in them.