Short version: with Twilio, you set up an inbound call by hosting a TwiML webhook server and pointing your number at it. With AgentCall, you give your number a system prompt and an OpenAI Realtime voice agent answers the call autonomously — no webhook to host, no TwiML, no call routing. If your AI assistant suggests “you need a webhook” for AgentCall inbound, it's confusing two different webhook concepts. We explain the difference below.
The Twilio Inbound Model: Bring Your Own Server
Twilio's inbound model is built around programmable voice: you write the call logic, Twilio just delivers the call to your code.
- You buy a number in the Twilio console.
- You host an HTTPS endpoint that returns TwiML XML telling Twilio what to do (Say, Gather, Dial, Record, Connect).
- You paste that URL into the number's “A Call Comes In” field.
- When someone calls, Twilio POSTs to your URL with call metadata. You return TwiML. Twilio executes it.
- For an AI voice agent, you also wire up
<Connect><Stream/></Connect>Media Streams to a WebSocket server, pipe RTP audio into your STT/LLM/TTS stack, and stream synthesized speech back.
This is enormously flexible — and enormously fiddly. For a developer who just wants “an AI receptionist on my phone number,” it's several weekends of work plus a WebSocket server you have to keep running.
The AgentCall Inbound Model: Configure Once, Done
AgentCall replaces the entire TwiML/Media-Streams stack with a single config call:
// Node SDK
import { AgentCall } from "agentcall";
const client = new AgentCall({ apiKey: process.env.AGENTCALL_API_KEY });
await client.numbers.configureInboundAi("num_abc123", {
systemPrompt:
"You are the front desk for Acme Plumbing. Greet the caller, " +
"take their name, phone, and a brief description of the issue. " +
"Tell them someone will call back within 2 hours.",
voice: "shimmer",
firstMessage: "Hi, thanks for calling Acme Plumbing. How can I help?",
maxDurationSecs: 600,
});That's the entire inbound integration. No webhook to host. No SIP. No Media Streams. When someone dials your AgentCall number, an OpenAI Realtime voice agent picks up, introduces itself with your firstMessage, and follows your systemPrompt for the duration of the call.
Prefer to do it from the dashboard? Open /numbers, click Set up on any US/Canada number, paste your prompt, hit save. Same result.
The Two Webhooks: Don't Confuse Them
AgentCall does have webhooks — but they're for something different than what Twilio uses webhooks for. This is where AI assistants tend to confuse new users:
| Concept | Twilio | AgentCall |
|---|---|---|
| How does a number answer an inbound call? | You host a webhook. Twilio POSTs to it for instructions on every call. | You set a system prompt with configure_inbound_ai. AgentCall handles the call. |
| How do I get notified when something happens? | Status callback URLs (per-number, per-event) | One webhook subscription via create_webhook, fires on sms.inbound, sms.otp, call.inbound, call.status, call.recording, etc. |
So when an AI assistant inside Claude, Cursor, or OpenClaw sees the AgentCall MCP tool create_webhook and assumes that's how you set up inbound, it's wrong. create_webhook registers an event subscription — AgentCall calls your URL when stuff happens. configure_inbound_ai is what tells a number how to answer when someone calls it.
Inbound AI from MCP, OpenClaw, and the Dashboard
From Claude Desktop, Cursor, or Windsurf (MCP)
If you've installed the AgentCall MCP server, just talk to your assistant in plain English:
"Configure my AgentCall number num_abc123 to answer with an AI receptionist.
System prompt: You are the front desk for Acme Plumbing. Greet the caller,
take their name and phone, describe the issue, tell them someone will call
back within 2 hours. Use the shimmer voice."The model invokes the configure_inbound_ai tool. See the MCP docs for installation.
From OpenClaw
With AGENTCALL_API_KEY and AGENTCALL_API_URL set, your OpenClaw agent auto-discovers all 21 phone tools at startup. The same prompt above works:
"Set up +1 555 555 0123 to be answered by an AI receptionist
that takes a message and tells callers I'll get back to them."Full integration guide: /docs/openclaw.
From the Dashboard
Go to /numbers. Each US/Canada number has an Inbound column. Click Set up, paste your prompt, choose a voice, save. Done.
From the REST API
curl -X POST https://api.agentcall.co/v1/numbers/num_abc123/inbound-config \
-H "Authorization: Bearer $AGENTCALL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "ai",
"systemPrompt": "You are the front desk for Acme Plumbing...",
"voice": "shimmer",
"firstMessage": "Hi, thanks for calling Acme Plumbing. How can I help?",
"maxDurationSecs": 600
}'Side-by-Side: Inbound Setup
| Step | Twilio | AgentCall |
|---|---|---|
| Buy a number | Yes | Yes |
| Host an HTTPS server | Required | Not required |
| Write TwiML / call-flow XML | Required | Not required |
| Run a Media Streams WebSocket server (for AI voice) | Required | Not required |
| Wire your own STT / LLM / TTS pipeline | Required | Not required (OpenAI Realtime is used) |
| Configure the number to answer with AI | 10+ files, deploy a server, point the number at it | 1 API call with a system prompt |
| Per-minute cost (inbound AI voice) | Twilio voice + Media Streams + your AI provider (varies) | $0.40/min, all-inclusive (Pro plan) |
When You Do Want a Webhook
AgentCall webhooks are still useful — just not for routing the call itself. Common reasons to register a webhook with create_webhook:
- Get the recording URL and transcript when an inbound AI call ends, so you can store it in your CRM.
- Get notified when an OTP arrives on one of your numbers (
sms.otp). - Get a
call.inboundevent for analytics/logging on every incoming call. - Trigger downstream automation in your own backend when something on AgentCall happens.
These run alongside inbound AI — they don't replace it. The AI still answers the call, AgentCall still records and transcribes if enabled, and a webhook fires to your URL when the call ends. Set up: see MCP docs or POST to /v1/webhooks from the API.
What AgentCall Doesn't Do (Yet)
We'll be honest: there is one inbound use case AgentCall doesn't cover today — bridging an inbound call into your own server so your code handles the audio, the way TwiML <Connect><Stream/> does on Twilio. That mode is on the roadmap (we use the placeholder mode: "webhook" internally) but it's not shipped, and the API will reject it if you try.
If your use case is “I want my own LLM stack, my own TTS, my own call logic running on my own infra,” you should stay on Twilio for now and let us know what you're building so we can prioritize. For 90% of agent use cases — answer the phone with an AI that follows my instructions — AI mode is the simpler, cheaper, fully-managed answer.
Migrating from Twilio Inbound
- Provision a US or Canada number on AgentCall (dashboard or
provision_number). - Take the system prompt you'd express as TwiML and rewrite it as plain English instructions.
- Call
configure_inbound_aiwith the prompt, voice, and first message. - Update the phone number you publish (forward your old Twilio number to the new AgentCall number, or swap it on your website / Google Business / etc.).
- If you want recordings or transcripts pushed somewhere, register a webhook for
call.recordingandcall.status.
FAQ
Does AgentCall support TwiML?
No. AgentCall is intentionally not a TwiML-compatible platform — we replace the entire TwiML/Media-Streams pattern with a managed AI voice agent that you configure with a prompt. If you have an existing TwiML server, you keep it on Twilio; AgentCall is for teams that want the call answered without writing one.
Can I get transcripts and recordings of inbound AI calls?
Yes — AgentCall transcribes every AI voice call (inbound or outbound) and exposes the transcript via get_call_transcript or the REST API. Recordings are available on the Pro plan at $0.01/min. Subscribe to call.recording via create_webhook to receive the recording URL when it's ready.
How much does inbound AI cost?
$0.40 per minute, billed only when calls actually come in, on the Pro plan ($19.99/mo). That's all-inclusive: it covers the OpenAI Realtime usage, the carrier minutes, and the call infrastructure. You don't pay separately for the AI provider.
What carriers support inbound AI voice?
US and Canada numbers from our Telnyx pool. Numbers from other carriers (e.g. inbound SMS on Twilio-pool numbers) don't support AI voice yet; the dashboard shows Not supported for those rows.
What if my AI assistant keeps suggesting I need to set up a webhook?
Tell it explicitly: “use the configure_inbound_ai tool, not create_webhook.” The two are unrelated — create_webhook registers an event subscription so AgentCall can POST to your URL when things happen. configure_inbound_ai is what makes a number answer when called. We updated the MCP tool descriptions in May 2026 to make this clearer to AI assistants, but older snapshots may still be confusing.
Can I switch between AI mode and Twilio-style webhook mode?
Today, only AI mode is supported. The schema reserves a webhook bridging mode for a future release, but the API rejects it — so don't depend on it yet. If you need bridge-to-your-server semantics, email support@agentcall.co and tell us what you're building so we can prioritize the build.
Where do I learn the system prompt format?
See the voice prompt guide — it covers structure, examples for receptionist / lead-qualifier / appointment-booker / call-screener templates, and the full list of supported voices. The prompt is plain English, no special syntax.