A thin, consistent REST surface. WebSockets when you need streams. And first-class MCP — so Claude, ChatGPT, Cursor, or any agent can place and receive phone calls as a tool.
# Make an outbound call. That's it. curl https://api.hertz.ai/v1/calls \ -H "Authorization: Bearer $HERTZ_KEY" \ -H "Content-Type: application/json" \ -d '{ "agent": "agent_clinic_intake", "to": "+14155550119", "from": "+14155550100", "voice": "nova_v2", "tools": ["lookup_calendar", "book_slot", "send_sms"], "webhook": "https://acme.co/hook", "metadata": { "patient_id": "pat_8821" } }' # → returns { id, status: "dialing", ... }
Expose Hertz as an MCP server and any agent — Claude, Cursor, ChatGPT, your own — gets place_call, join_room, and query_transcript as first-class tools. No glue. No proxies.
"mcpServers": { "hertz": { "command": "npx", "args": ["-y", "@hertz/mcp"], "env": { "HERTZ_KEY": "sk_live_..." } } } // Tools now available in Claude: // place_call · join_room · query_transcript // list_agents · send_sms · schedule_callback
Place an outbound call or schedule one. The call is created in dialing state, transitions to ringing, connected, and finally ended. Subscribe to state transitions via webhook or WebSocket.
| Param | Type | Required | Description |
|---|---|---|---|
| agent | string | required | Agent id or inline definition. |
| to | string | required | E.164 destination number. |
| from | string | optional | Caller ID · defaults to primary number. |
| voice | string | optional | Voice id. Overrides agent voice. |
| tools | string[] | optional | Tool ids callable by the agent. |
| metadata | object | optional | Passthrough — returned on every event. |
| webhook | url | optional | Events POSTed with HMAC signature. |
| amd | enum | optional | off · detect · detect_or_drop |
| recording | enum | optional | off · full · consent_required |
| scheduled_for | iso8601 | optional | Queue for future delivery. |