What you’ll build
- A pool of three or four numbers, set to 60 calls an hour each.
- A campaign that calls from the pool, with a capacity line that tells you whether the pool can keep up.
- A webhook that tells your backend when a number rests or the pool runs short.
- A routine for what to do when a number rests, cools or gets retired.
How it works
The pool counts attempts and answers on each number, in India time, across every campaign and API call that uses it. A number that has been answered less than half as often as the pool’s average, after at least 25 attempts, rests for 45 minutes and the pool keeps calling from the others. See Phone numbers and pools for every rule.Step 1: Get your numbers
You can rent numbers through Mirai or import numbers you own. Both need a few minutes in the console and are covered in Receive inbound phone calls. For this recipe you do not assign an agent to answer, unless you also want the numbers to take incoming calls.- Open Phone numbers → Numbers.
- Click Add a number to rent one, or Import a number for one you own.
- Repeat until you have the numbers you want. A pool of three or four is a good start.
- cURL
- Python
- Node.js
state: "ready" on a verified connection, inside their
rental term, can join a pool.
Step 2: Make a pool
In the console
- Open Phone numbers → Pools and click New pool.
- Give it a name and a purpose. Outreach and Reminders start at 60 an hour. Support starts at 40.
- Tick the numbers. Each shows its status word and its 7 day answer rate. Retired numbers cannot join.
- Set the pace. The line under the control reads like
3 numbers × 60 = 180 attempts an hour. Above 60 it warns that a number is more likely to be flagged as spam and answered less. Above 120 it tells you most sales desks never run this fast and numbers will rest often. - Open Advanced if you want to change retries from the same number, automatic resting, the smallest number of healthy numbers the pool wants, or whether this is the default pool for new campaigns.
- Click Create.
With the API
- cURL
- Python
- Node.js
201 with the pool, its members and their health. Keep the
id. A pool needs at least one member that can call now. If you get
invalid_request, error.message names the number to fix.
Step 3: Point a campaign at the pool
In the console
In the campaign form, open Calls come from. The list shows your pools first, then your numbers with how each is doing, and last the Mirai shared line. Pick the pool. When you choose nothing, the campaign uses its agent’s choice, then your workspace’s default pool, then the shared line, and the form says which one it used. Under the picker, read the capacity line. It compares what the campaign will try with what the pool can carry. If Calls at once is higher than the pool can keep up with, it suggests a lower number.With the API
Sendpool_id when you create the campaign. See
Campaigns for the other fields.
- cURL
- Python
- Node.js
pool_id and a calls_from object:
POST /v2/campaigns/{id}/start.
A campaign calls from one source at a time. Sending pool_id together with
phone_number_id or caller_ids answers 400 invalid_request.
With max_concurrent: 2 and calls that last about 40 seconds, the campaign tries
at most 180 times an hour, and three numbers at 60 can carry exactly that. Raise
max_concurrent to 4 and the campaign would try 360, double what the pool can
carry. The pool then holds contacts back for the next free number, so the
campaign takes longer rather than calling faster.
Step 4: Watch health
In the console
Phone numbers → Numbers shows each number with a status word, its attempts this hour against its pace, and a 7 day answer rate with seven small bars. A day without calls is a gap. Phone numbers → Pools shows each pool with its size, how many numbers are healthy and resting, its pace and its answer rate. Open a pool to see its health first, with a 30 day chart and each number below it. The status words are Live, Warming up, Resting, Cooling and Retired. They are explained in Phone numbers and pools.With the API
- cURL
- Python
- Node.js
GET /v2/phone-numbers/{id}/health.
Be told when something changes
The campaign’swebhook_url receives phone_number.rested,
phone_number.cooling, phone_number.alert, phone_number.resumed and
phone_pool.degraded, signed like every other webhook. Each one
carries the full number or pool and a reason written for people. Only
campaigns that are running or paused and use the pool, or a number in it, get
them. A pool that no campaign uses does not send events.
A small handler is enough to start. Verify the signature first, as described in
Webhooks.
When a number rests
A resting number is the pool working as intended. It rested because people were answering it far less than the pool’s other numbers.- Check the other numbers. If the pool is healthy, do nothing. The number comes back by itself in 45 minutes.
- Look at the number’s 7 day answer rate. If it was already falling before it rested, the number is probably being flagged. Lower the pool’s pace or add numbers, and retire this number if its rate keeps falling.
- If the number rested three times in a day, it is Cooling for 7 hours and stays out until you resume it. Let it cool. Resume it early only when you have a reason, such as a list that looked cold rather than a number that looked burnt.
- A pool with fewer healthy numbers than its
min_healthyis degraded. Add a number to it, or resume one.
Test it
Use a short list and a low pace so every behaviour shows within a few minutes.- Make a pool of two numbers with
max_per_hour: 6,max_per_day: 400, andmin_healthy: 2. - Create a campaign on it with a list of 20 numbers you can reach, then start it.
- Open Phone numbers → Numbers. Each number’s attempts this hour should stop at 6, and the campaign should wait for the next hour. A number added in the last 7 days is warming up and stops at half the pace, so expect 3.
- Rest one number for an hour. Calls continue from the other, and the rested number shows Resting with the time it is back.
- Resume it, then check that
phone_pool.degradedreached your webhook while it was resting, because the pool wanted two healthy numbers and had one.
Privacy and compliance
Calling lists carry people’s phone numbers and often their names. Keep contact lists, transcripts and recordings behind your own access controls, and apply your retention rules. Follow the calling rules for your market, such as the do-not-call registry in India and consent requirements. Keep your do-not-call list up to date. The pace of a pool changes how many calls go out, and it does not change what you are allowed to call. A pool does not make a campaign compliant. Tell people they are speaking with an AI voice agent, and give recording notices where they apply. Each person sees the number they are called from, so use numbers that you can answer when they call back, and point those numbers at an agent.Production checklist
- Each number you rely on is
ready, and its rental is in term. - The pool’s pace is at or below 60 an hour unless you have chosen otherwise, and the capacity line shows it can carry the campaign’s calls at once.
min_healthymatches the number of numbers you need to run.- The campaign’s
webhook_urlverifies signatures, dedupes onid, and tells a person when a pool is degraded. - Someone knows what to do when a number cools, and who can resume or retire it.
- You have a default pool or an agent
calls_from, so a campaign never falls to the shared line by accident.
Related
Phone numbers and pools
Every field, health state, event and error code.
Campaigns
Calling windows, retries, budget and the report.
Webhooks
Verify signatures and handle retries.
Receive inbound phone calls
Rent or import a number and make it answer.