Back to Blog
Developer ResourcesFebruary 25, 2026Updated October 2, 20267 min read

How to Give Every AI Agent Its Own Phone Number

Each AI agent needs its own number and inbox. Learn how per-number isolation works in AgentCall and why shared numbers fail at scale.

The Identity Problem

When you run one AI agent, sharing your personal phone number works fine. When you run ten, it becomes messy. When you run a hundred, it's impossible. Every agent that interacts with the real world, such as signing up for services, receiving verification codes, or making calls, needs its own phone number.

This is the agent identity problem. Without isolated phone numbers, incoming messages become ambiguous, OTP codes get misrouted, and your agents can't operate independently. The solution is simple: give every agent its own number.

Why Shared Numbers Break at Scale

Developers often start by routing all SMS through a single Twilio or Telnyx number. This works for demos but fails in production for three reasons:

  • Message collision: When two agents trigger OTP verification at the same time, the incoming codes land in the same inbox. Which code belongs to which agent? You'd need a routing layer that parses sender IDs, timestamps, and message content, which is fragile and error-prone.
  • Rate limits: Carriers and services throttle per-number. A single number receiving hundreds of SMS per hour gets flagged or blocked. Per-agent numbers distribute the load naturally.
  • Audit trail: When something goes wrong, you need to know which agent did what. Shared numbers make forensics nearly impossible. Isolated numbers give you a clean audit trail per agent.

AgentCall's Per-Number Isolation Model

AgentCall treats the number as the unit of isolation. Every number has its own inbox, call history, OTP stream, AI voice configuration, and usage records, and you can label it for the agent that uses it. API keys and billing belong to your account.

When an SMS arrives, it lands in that number's inbox, and the event payload carries the number it was sent to. One webhook can route each event to the right agent with a single lookup. This maps directly to how autonomous software works: each agent gets an independent phone identity without you building a routing layer around a shared number.

Step 1: Decide What an Agent Is

In practice, one agent is one number plus the label and prompt you give it. Keep a small map in your own app from agent to number ID, the same way you would map a tenant to a resource in a multi-tenant system.

Step 2: Provision a Number

import AgentCall from 'agentcall';

const client = new AgentCall('ac_live_...');

// Provision a number for this agent
const number = await client.numbers.provision({
  country: 'US',
  type: 'local',
  label: 'support-agent-west-coast',
});

console.log(number.number); // +15551234567

The label field lets you tag numbers for easy identification in your dashboard and logs. Each provisioned number has its own inbox, so one agent's codes never mix with another's.

Step 3: Set Up Webhooks

// One webhook subscription for the account
await client.webhooks.create({
  url: 'https://my-app.com/agentcall/webhook',
  events: ['sms.inbound', 'sms.otp', 'call.status'],
});

// In your handler, route by the number the event was sent to
const agentByNumber: Record<string, string> = {
  [number.number]: 'support-agent-west-coast',
};
// agentByNumber[payload.to] tells you which agent owns the event

Webhooks are account-level, so you subscribe once and route in your own code. Because every event names the number it belongs to, each agent only ever needs to see messages for its own number.

How This Compares to Twilio and Telnyx

Traditional CPaaS platforms like Twilio and Telnyx are powerful, but they're built for human developers building traditional apps, not for fleets of autonomous agents. Here's the difference:

  • Twilio: Numbers belong to an account. You manage routing, isolation, and per-agent billing yourself. There's no native “agent” concept, so you build it from scratch.
  • Telnyx: Similar to Twilio. Great API, but agent-level isolation is your responsibility.
  • AgentCall: Each number is its own inbox with its own call history, voice configuration, and usage records. Provisioning, labels, and OTP extraction are built in, so there is no routing layer for a shared number to build.

Real-World Patterns

Pattern 1: One Agent Per Customer

If you're building a customer support platform, each customer gets their own AI agent with a dedicated phone number. Customers call or text their agent directly. No IVR menus, no hold queues.

Pattern 2: One Agent Per Task

A research agent that signs up for services needs its own number for OTP verification. A sales agent that makes outbound calls needs a different number with a local area code. A monitoring agent that receives SMS alerts needs a third. Each task, each number.

Pattern 3: Dynamic Scaling

// Spin up a number per task, and release it when the task ends
async function createNumberForTask(taskId: string) {
  return client.numbers.provision({
    country: 'US',
    type: 'local',
    label: `task-${taskId}`,
  });
}

// Provision one at a time. After an error, list numbers before
// retrying so a timeout never buys a duplicate number.
for (const id of taskIds) {
  const n = await createNumberForTask(id);
  console.log(id, n.id, n.number);
}

Provisioning is rate-limited (10 numbers per hour and 100 per 24 hours), and each number is billed monthly, so release numbers when a task is done and spread large fleets out over time.

Pricing

New accounts receive a one-time 72-hour live trial with one US/Canada local number, 300 managed inbound AI seconds (five minutes) total, and five SMS send attempts to verified destinations. Card verification is required before number allocation; the clock starts when allocation succeeds. There is no monthly reset or automatic paid subscription. Live OTP extraction and outbound calls require Pro. Existing Free accounts retain their assigned monthly allowances. Read the account's offerVersion, trial and limits rather than assuming every Free account has the same offer. Only describe a monthly reset when the account response supplies a non-null resetsAt. Pro is $19.99/month plus number rental and usage: local/mobile numbers $2/month each, toll-free $2.50/month, outbound SMS $0.015/message, standard outbound voice $0.035/min, managed AI voice $0.40/min, BYOK voice $0.10/min plus your AI provider's charges, or Premium Voice $0.59/min. AI calls round up to whole minutes per call. New-account destination/business verification can still apply after upgrading.


FAQ

How many phone numbers can one agent have?

A new trial account gets one US or Canada local number. Pro has no fixed cap, so you can provision as many numbers as you need, subject to the provisioning rate limits. Each number is independently managed and billed ($2/month local, $2.50/month toll-free).

Can I transfer a number between agents?

Currently, numbers are bound to the agent that provisioned them. To move a number, you'd release it from one agent and re-provision on another. Moving a number between accounts is not supported today.

What number types does AgentCall support?

AgentCall provisions US and Canada local, mobile, and toll-free numbers ($2/month for local and mobile, $2.50/month for toll-free; the trial includes one local number) through licensed VoIP carriers. Numbers handle SMS, inbound and outbound voice, and inbound AI voice answering. We don't guarantee that any provisioned number will pass a third-party platform's carrier-type check, so we don't recommend AgentCall for use cases that depend on bypassing such checks.

Related Reading

Ready to get started?

Give your AI agents their own phone numbers in minutes.

Start Building