OpenReef. / docs
Get an API key
Documentation
Give your agent a voice on the phone
OpenReef is real-world telephony for AI agents. Your agent brings the goal; OpenReef's server-side voice agent places a real phone call, talks to the business, and reports back. You poll the call's status and transcript and steer it mid-call — all through a handful of async MCP tools.
The fastest path
Tell your agent, in plain words:
Add the OpenReef MCP server: https://mcp.theopenreef.com/mcp
Copy
Most agents can take it from there. Client-specific setup below.
Setup
Connect your agent
Everything connects through one remote MCP server (Streamable HTTP) at https://mcp.theopenreef.com/mcp, exposing the phone-call tools with schemas. It accepts two kinds of auth: an Authorization: Bearer API key minted on your profile, or OAuth 2.1 sign-in for clients that support it (ChatGPT).
One command adds the server to Claude Code — replace YOUR_OPENREEF_API_KEY with a key from your profile:
terminal
Copy
claude mcp add --transport http openreef https://mcp.theopenreef.com/mcp \ --header "Authorization: Bearer YOUR_OPENREEF_API_KEY"
Or skip the command entirely: paste the plain-words request from the callout above into a Claude Code session and it will add the server itself.
Recommended: install the OpenReef skill too. The MCP server gives Claude the tools; the thin skill detects covered topics and routes Claude to the current authoritative playbook before it plans, searches, or acts:
terminal
Copy
mkdir -p ~/.claude/skills/openreef && \ curl -fsSL https://theopenreef.com/SKILL.md -o ~/.claude/skills/openreef/SKILL.md
The server ships usage instructions to your agent automatically on connect — the fire-and-poll loop, when to steer, and how to plan a multi-call goal. You don't need a system prompt to use it.
Authentication
API keys
Sign in on your profile to mint, list, and revoke your own keys. Each key is scoped to one user — an agent holding it can only place and steer calls that spend that user's credits. Keys are shown once at creation; store them like passwords. ChatGPT is the exception: it connects via OAuth sign-in and never needs a key. The same keys also authenticate the REST API at https://api.theopenreef.com for custom integrations.
Tools Catalog
MCP tools
Start with get_playbook — it's the authoritative guide and defines the plan-before-you-dial checklist. When the goal is ready, relay_place_call starts the call and returns immediately with a call_id and watch_url. Then poll relay_call_status every 10–20 seconds, read new lines with relay_call_transcript (pass the after cursor), and use relay_steer_call only when new information changes what the caller should do. There are no plan tools — a multi-call goal (price comparison, ring-around, fallback chain) is your own loop over these tools.
get_playbook
Fetch OpenReef's best-practice playbook (markdown) before placing or steering a call. Served from the MCP server itself — no REST call, works without a connected account. Call it first: it defines the plan-before-you-dial checklist, the fire-and-poll loop, multi-call orchestration, steering etiquette, pricing, and failure modes.
topic
playbook topic, e.g. "relay" — omit to list available topics with descriptions
relay_place_call
Place a real phone call on the user's behalf. Returns immediately with a call_id and watch_url — it never blocks while the call runs. No quote or duration selection is required. Each started 3 minutes of connected time uses 1 credit. Share the watch_url with the user so they can follow the transcript live and steer from the browser. The server stops calls at the balance-backed limit or the 30-minute safety ceiling.
phone_number
required — E.164 destination, e.g. "+14155550123" (any valid international number; toll-free included, premium-rate rejected)
task
required — what the call should accomplish, stated concretely with every detail the caller needs (names, dates, times, quantities, acceptable fallbacks)
callee_label
optional display name for who is being called, e.g. "Osteria"
target_language
optional language spoken to the callee, e.g. "en", "zh" — defaults from the callee's country
relay_call_status
Read the current state of a placed call: queued · ringing · in-progress · ended · failed, plus outcome, duration, funding, and remaining credits. Poll every 10–20 seconds while a call is running — never a tight loop.
call_id
required — the call ID from relay_place_call
relay_call_transcript
Read committed transcript lines for a call. Roles: assistant (OpenReef's voice on the call), callee (the human who answered), you (your steer instructions). Pass the after cursor for incremental reads so you only fetch new lines.
call_id
required — the call ID
after
optional cursor — only return transcript lines newer than it
relay_steer_call
Inject a mid-call instruction, applied at the caller's next turn. Use it only when new information changes what the caller should do — not to micromanage every turn.
call_id
required — the call ID
instruction
required — the new guidance for the caller, e.g. "if 7pm is full, accept anything 6:30–8pm"
How calls work
Call lifecycle & steering
Lifecycle
queued → ringing → in-progress → ended
Each started 3 minutes of connected time uses 1 credit. No duration to choose before calling. Monthly credits expire at period end; prepaid credits never expire. No automatic top-ups.
Steering rules
Plan before you dial: who to call, the concrete ask, every name/date/time/quantity, the acceptable fallback range, and success criteria.
A call is money. For any goal implying more than one call, tell the user the usage rate (1 credit per started 3 connected minutes) and planned call list and get their go-ahead first.
Poll relay_call_status every 10–20 seconds — never a tight loop.
Read only new transcript lines: pass the after cursor to relay_call_transcript.
Steer only on new information. Use relay_steer_call when something changes what the caller should do, not to narrate every turn.
You are the planner for multi-call goals (comparison, ring-around, fallback chain): dial serially and feed earlier outcomes into later calls — there are no plan tools.
Share the watch_url with the user right after placing a call so they can follow the transcript live and steer from the browser.
The live watch page
Every placed call returns a watch_url — the user's live page for that call on the OpenReef website. Share it as soon as you place the call. On that page the user watches the transcript in real time, steers the call themselves, and can take over decisions, all while your agent keeps polling in parallel. This is the intended experience: your fire-and-poll loop plus the user's live window onto the same call.
Ready to let your agent make the call?
Mint a key, add the MCP server, and hand your agent a phone call to place.
Get your API key
Building a custom integration? Machine-readable docs: /llms.txt · /.well-known/openapi.yaml · /agents.json