AgentPhone
pilotctl appstore install io.pilot.agentphone About AgentPhone
AgentPhone gives your agent its own real US/Canada phone number: place and receive voice calls, send and receive SMS & iMessage, and hold threaded conversations with real people — all over plain REST. This is the managed Pilot front door: you bring nothing (no signup, no API key). Pilot holds one AgentPhone master key behind the broker and gives each Pilot user a $5 budget; calls and texts debit against it, and once it's spent the paid endpoints return 402 Payment Required (reads stay free).
What you can do
- Call people.
agentphone.place_callwith asystemPromptruns an autonomous voice call — the phone rings in ~1–2s and the AI holds the conversation. Book a reservation, chase a shipment, return a missed call, or call another agent. - Text people.
agentphone.send_messagedelivers over iMessage when both sides support it (unlocking threaded replies, tapback reactions, send effects, typing indicators, group chats) and transparently falls back to SMS/MMS otherwise — same call either way. - Answer & follow up. Poll
agentphone.list_number_messages/agentphone.list_conversation_messagesfor inbound texts andagentphone.get_callfor call transcripts — no websockets required. - Manage your setup. Buy/release numbers, create and tune agents (voice, model tier, system prompt, ambience), keep an address book of contacts, and attach numbers to agents.
First run: agentphone.setup (no signup, no agent)
Because this is the managed app there is no signup — but there is also no agent or number: the AgentPhone account is shared behind the broker and every Pilot user starts empty. So the first thing to do is call agentphone.setup once. It creates your agent and attaches a phone number (buying one costs $3/mo — setup asks you to confirm with confirm_spend:true before spending). After that, agentphone.send_message / agentphone.place_call work from the agent_id it returned. agentphone.status tells you at any time whether you're ready. Just call the /v1 methods below; the broker authenticates you as your Pilot identity, injects the master key, meters your spend, and forwards to https://api.agentphone.ai.
Your data is yours (per-user isolation)
Even though every Pilot user shares one AgentPhone account, the broker isolates you completely: you only ever see and act on your own agents, numbers, messages, calls, conversations, and contacts — never another user's, whatever the method. References to a resource you don't own return 404, and list methods return only your own rows (and your own counts). Billing is per-user at the broker, not AgentPhone: your remaining budget rides on the X-Pilot-Credits-Remaining header of every metered response (account-wide usage aggregates are deliberately not exposed).
Async, poll-based (no streaming): 1. agentphone.place_call → returns a call id immediately; the call runs in the background. 2. Poll agentphone.get_call every few seconds until status is completed or failed, then read transcripts[] (or agentphone.get_transcript). 3. For inbound SMS, poll agentphone.list_number_messages with the after cursor and filter direction == "inbound".
Critical gotchas (read once)
- You cannot call 911, N11 numbers, or crisis lines — they're blocked. If your human has an emergency, tell them to dial directly.
- Released numbers are gone forever — no refund for the unused month. Confirm before
agentphone.release_number. - Always use E.164:
+14155551234✓ — never(415) 555-1234or415-555-1234. Assume+1for a bare US number and confirm if it matters. - Inbound calls need hosted mode OR a webhook. Create agents with
voiceMode: "hosted"explicitly (the backend defaults towebhook, which fails inbound if no webhook is set). - iMessage-only features (reactions, send effects, typing, backgrounds, contact cards) are silently ignored on SMS — check the response
channel. - Don't spam. Unsolicited bulk calls/texts are illegal and get the account suspended.
Cost & the $5 budget
Reads are free. Spending operations debit your per-user $5 Pilot budget: buying a number ($3.00/mo), placing a call (per-minute), and sending a text (~$0.01–0.02). When a call would overdraw, the broker returns 402 before anything is charged, and every response carries your remaining balance in the X-Pilot-Credits-Remaining header (micro-dollars).
Every method's parameters, kind, and latency class are discoverable at runtime via agentphone.help.
Methods · 53
agentphone.setup example{"confirm_spend": true} agentphone.status agentphone.usage agentphone.usage_by_number agentphone.usage_by_agent agentphone.list_voices agentphone.list_agents agentphone.create_agent agentphone.get_agent agentphone.update_agent agentphone.delete_agent agentphone.attach_number agentphone.detach_number agentphone.list_agent_conversations agentphone.list_agent_calls agentphone.list_numbers agentphone.buy_number agentphone.get_number agentphone.release_number agentphone.list_number_messages agentphone.list_number_calls agentphone.get_contact_card agentphone.set_contact_card agentphone.delete_contact_card agentphone.send_message agentphone.react agentphone.list_calls agentphone.place_call agentphone.get_call agentphone.end_call agentphone.get_transcript agentphone.list_conversations agentphone.get_conversation agentphone.update_conversation agentphone.list_conversation_messages agentphone.typing agentphone.set_background agentphone.clear_background agentphone.list_contacts agentphone.create_contact agentphone.get_contact agentphone.update_contact agentphone.delete_contact agentphone.get_webhook agentphone.set_webhook agentphone.delete_webhook agentphone.list_webhook_deliveries agentphone.webhook_delivery_stats agentphone.test_webhook agentphone.get_agent_webhook agentphone.set_agent_webhook agentphone.delete_agent_webhook agentphone.mynumber Full usage demo
When your agent needs to place a real phone call or send an SMS/iMessage to a person — bookings, reminders, follow-ups, chasing a shipment or a missed call.
pilotctl appstore call io.pilot.agentphone agentphone.usage '{}' {"plan":"managed","numbers":{"used":0,"limit":1},"stats":{...}}Worked examples
pilotctl appstore call io.pilot.agentphone agentphone.list_agents '{}' {"data":[{"id":"agent_...","name":"Assistant","voiceMode":"hosted"}]}pilotctl appstore call io.pilot.agentphone agentphone.place_call '{"agentId":"agent_123","toNumber":"+14155551234","systemPrompt":"Confirm the 7pm reservation for two under Alex."}' {"id":"call_...","status":"queued"}Returns immediately; poll agentphone.get_call for the transcript.
pilotctl appstore call io.pilot.agentphone agentphone.get_call '{"call_id":"call_..."}' {"status":"completed","durationSeconds":42,"transcripts":[...]}pilotctl appstore call io.pilot.agentphone agentphone.send_message '{"agent_id":"agent_123","to_number":"+14155551234","body":"On my way, 5 min out."}' {"id":"msg_...","channel":"imessage"}What it costs
| Operation | Price | Notes |
|---|---|---|
agentphone.place_call | $0.10 | per call (per-minute, ~$0.05+ for a short call) |
agentphone.send_message | $0.02 | per SMS/iMessage |
agentphone.buy_number | $3.00 | per month; released numbers are gone forever, no refund |
agentphone.usage / list_* / get_call / get_transcript | $0.00 | all reads are free |
This demo spends $0.12 of your $5.00 budget (1 call + 1 text; the two reads are free).
pilotctl appstore call io.pilot.agentphone agentphone.usage '{}' Good to know
- Always use E.164 numbers (+14155551234) — never (415) 555-1234.
- You cannot dial 911, N11, or crisis lines — they are blocked.
- 402 Payment Required means your $5.00 budget is spent — reads still work.
- place_call/send_message need an agent with a number attached — list_agents / list_numbers first.
- Calls are async: place_call returns a call id, then poll get_call until status is completed/failed.
- iMessage-only extras (reactions, send effects) are silently ignored on SMS — check the response channel.
Next
io.pilot.agentphone agentphone.help '{}'
What’s New
- Add agentphone.setup / agentphone.status: one-call onboarding for the managed model (no signup, no agent) — creates your agent and attaches a number; send_message/place_call point you to setup on a cold start.
- Per-user isolation: drop /v1/usage/daily and /v1/usage/monthly (shared-account aggregates that leaked other users' activity). Per-user budget is the broker ledger (X-Pilot-Credits-Remaining).
- Managed Pilot front door — no signup, no API key: the broker holds one master key and gives each user a $5 budget (402 on overdraw; reads free).
- Full non-streaming REST surface (53 methods): numbers, agents, voice calls, SMS/iMessage, threaded conversations, contacts, and usage.
- Local recall: agentphone.buy_number captures the number to ~/.pilot/.agentphone; agentphone.mynumber reads it back with no backend call.