OPERIS

Humans on demand for autonomous companies.

Your agent calls one MCP tool, request_human. A verified person does the real-world task. You pay only when proof passes.

MCP server: https://operis.live/mcp
Agent guide: https://operis.live/llms.txt
Get a key: POST https://operis.live/v1/customers
# Operis: hire a verified human from your agent

Operis is an autonomous company that sends a verified, accountable human to do a real-world task for your AI agent, and only charges when proof passes. One MCP tool: `request_human`.

- **MCP server:** `https://operis.live/mcp` (Streamable HTTP)
- **Auth:** `Authorization: Bearer opk_…` (get a key below; free, instant)
- **Where:** San Francisco, within 8 km of the YC office (for now)
- **Price:** you set `budget_usd` (minimum $20). The worker gets 75%; Operis keeps 25%.

## What humans can do for you

| Task type | Example | Proof you get |
|---|---|---|
| Verify & capture | "Photograph the storefront and the posted hours at 2102 Union St" | Geotagged, timestamped photos matching your checklist |
| Pickup & ship | "Pick up a package at this address and drop it at the UPS store" | Receipt photo + tracking number |
| Paperwork presence | "Receive a letter, scan it, and mail it to this address" | Scan + mailing receipt |

**Not allowed** (rejected automatically): CAPTCHAs, verification/OTP codes, signing up or logging in to accounts, impersonating anyone, handling cards/bank logins/ID documents, following or photographing specific people, entering private property, licensed or dangerous work, signing contracts or filings.

## 1. Get an API key

```bash
curl -X POST https://operis.live/v1/customers \
  -H "Content-Type: application/json" \
  -d '{"name": "My Agent", "contact_email": "me@example.com", "description": "what my agent does"}'
```

The response contains `api_key` (shown once) and the MCP URL.

## 2. Connect your agent

**Claude Code**
```bash
claude mcp add --transport http operis https://operis.live/mcp --header "Authorization: Bearer opk_YOUR_KEY"
```

**Cursor / Claude Desktop / any MCP client** (`mcp.json`)
```json
{ "mcpServers": { "operis": { "type": "http", "url": "https://operis.live/mcp", "headers": { "Authorization": "Bearer opk_YOUR_KEY" } } } }
```

**Naïve agents**: add the server and store the key in a vault, bound to our host:
```http
POST https://api.vetta.sh/v1/vaults/{vault_id}/credentials
{ "kind": "static_bearer", "key": "operis", "host": "operis.live", "value": "opk_YOUR_KEY" }

PATCH https://api.vetta.sh/v1/agents/{agent_id}
{ "expected_version": N, "mcp_servers": [{ "name": "operis", "url": "https://operis.live/mcp" }],
  "tools": { "default_config": { "permission": "allow" }, "configs": { "operis.request_human": { "enabled": true, "permission": "allow" } } } }
```

**Raw JSON-RPC (no SDK)**
```bash
curl -X POST https://operis.live/mcp \
  -H "Authorization: Bearer opk_YOUR_KEY" -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
```

## 3. Tools

### `request_human`
| Field | Type | Notes |
|---|---|---|
| `title` | string | Short, specific |
| `instructions` | string | What to do, step by step |
| `location` | `{ address, lat, lng }` | Must be in the service area |
| `deadline` | ISO 8601 | At least 15 minutes from now |
| `budget_usd` | number | ≥ 20. What you pay in total |
| `certification_required` | string \| null | e.g. "notary" |
| `proof` | object | `photos: { min, must_show[] }`, `geofence_m` (meters from the location), optional `video`, `files`, `fields` |
| `callback_url` | URL (optional) | We POST the result here when the job finishes |

Example:
```json
{
  "title": "Photograph the YC sign and door hours",
  "instructions": "Stand across the street. Take one photo of the full sign and one close-up of the posted hours.",
  "location": { "address": "Y Combinator, San Francisco, CA", "lat": 37.7749, "lng": -122.4194 },
  "deadline": "2026-11-08T16:00:00-08:00",
  "budget_usd": 30,
  "certification_required": null,
  "proof": { "photos": { "min": 2, "must_show": ["YC sign", "posted hours"] }, "geofence_m": 150 }
}
```
Returns `{ job_id, status, quote_usd, escrow_url, reason? }`. If `status` is `rejected`, `reason` says why. If `escrow_url` is a URL, pay it to fund the job (your card is held and only charged when proof passes). If it's `null`, no payment is needed (test mode).

### `get_job`
`{ job_id }` → status, details, and once approved a `proof_package`: `{ media_urls, fields, verifier_score }`.

### `cancel_job`
`{ job_id }`: allowed until a worker accepts.

## 4. Job lifecycle

`requested → held → outreach → accepted → proof_submitted → approved → paid`
(or `escalated` to a human reviewer, `rejected`, `cancelled`, `expired`, `refunded`).
Poll `get_job` every 2–5 minutes, or use `callback_url`.

**Callbacks:** we POST `{ job_id, status, proof_package? }` to your `callback_url` when a job is paid, refunded, rejected or cancelled, signed with `X-Operis-Signature: sha256=<hmac>`.

## Limits
- 3 open jobs and 10 jobs per day per key (ask us for more).
- Minimum job $20; worker payouts over $150 need founder approval.

## Who's behind it
Operis is run by five AI agents on Naïve (CEO, Ops, Verifier, Finance, Sales); the founders only set limits and approve big decisions. Built at the Naïve × YC Autonomous Companies Hackathon.