October 29, 2026 · 7 min read

Yes, your AI will try to dial Cuba — and three ways it gets expensive

Toll fraud, hallucinated numbers, and the premium-rate international destinations that charge €1/min and up. A list of the worst offenders, a worked example of the bill, and the one-click per-number allowlist that caps the whole problem.

securitytoll fraudvoice AIops

There's a specific category of international phone numbers that exists for one reason: to charge the originator a huge per-minute fee, split it with the destination owner, and process-of-elimination the losers are the people whose voice platform let the call through.

These destinations are known. The country codes have been publicly flagged for 20+ years. And yet toll-fraud and AI-dialing-the-wrong-number incidents using them still cost voice-AI deployments five-figure bills every single week. This is how it happens — and the one setting that caps it per number.

The three ways it gets expensive

1. Classic toll fraud

Someone compromises an outbound trunk credential. They point it at a Premium Rate Service (PRS) number that pays them, and dial it in a loop at your expense. The numbers that get used look mostly like normal international DIDs — nothing in the format screams "charge me extra". Examples of destinations where the carrier bill routinely runs €0.50–€4.00 per minute:

  • +53 (Cuba) · mobile destinations
  • +252 (Somalia) · all destinations
  • +881(Global Mobile Satellite) · €1-plus/min with no legitimate reason to call unless you're a maritime operator
  • +882, +883 (International Networks) · same category
  • +683 (Niue), +676 (Tonga), +677 (Solomon Islands), +678 (Vanuatu) · chronic abuse history
  • +850 (North Korea), +963 (Syria) · sanctions-exposed; your carrier may surcharge or refuse
  • +99prefixes (various isolated nations) · spot-check your carrier's rate card

A single leaked trunk credential dialing a Cuban mobile number continuously for an hour at €1.20/min is €72. Six hours before anybody notices on a Saturday night — €432. A weekend — north of €1,700. We've seen worse.

2. Your AI confidently dials a number that doesn't exist in your country

You deployed an AI agent for a UAE sales team. A customer, in natural conversation, says "call me back at Oh-Oh-Three Five Six Seven Eight Nine Oh" — a UK format. Your AI happily picks it up. It's a Birmingham mobile number. It's €0.12/min. The customer is a real customer. No fraud. Just a 40-minute conversation at a 10x your-local rate.

Scale that to a hundred outbound-dial moments per day, each one with the AI possibly picking up an inferred country code from the conversation, and your "platform minutes are cheap" mental model gets destroyed by the carrier side of the bill.

3. The hallucinated number

Large language models invent phone numbers. If a caller asks "what's the number for the complaints department?" and the AI doesn't have one in its context, it may synthesise plausible digits and call them. The number almost never belongs to the business the AI thinks it does. Sometimes it belongs to nobody. Sometimes it belongs to a +882 range. You just paid for the AI's confidence.

The one-click fix: per-number country-code allowlist

Every Voylo-rented or BYO number has a country-code block list on its outbound side. Open any number → scroll to Outbound country blocks. It's a text field that takes E.164 prefixes, comma-separated:

Example: block the usual suspects on an outbound trunk
+53, +252, +850, +882, +883, +881, +676, +677, +678, +683, +963

Longest-prefix matching, so +1242 (Bahamas) blocks the Bahamas without locking out the rest of +1 (NANP). You can block a specific area code within a country without taking down the country.

What happens when a blocked destination gets dialed:

  • The outbound call attempt is rejected before the carrier INVITE goes out. Zero cost.
  • A CDR row is written with outcome = "failed" and rejection reason "destination +XX blocked on this number". You see every blocked attempt in the Calls page so you can tune the list without flying blind.
  • A call.rejected event fires on your webhook — your observability catches it and your AI vendor can learn to retry a different format or back off.

What to allow, what to block

The right posture depends on your business:

  • Local-only service (regional restaurant chain, local professional services, government helpline): allowlist your country code and nothing else. Easiest, lowest risk. Set everything else as blocked by implicitly not permitting it — on Voylo this is a short blocklist of the top 15 PRS destinations above, because the carrier bill already clamps most other geographies to tolerable rates.
  • Serving one region(MENA, EU, APAC): block PRS prefixes AND country codes clearly outside your market. Your AI shouldn't be dialing +229 (Benin) for a Dubai logistics agent even if a customer confusingly says they want a callback there — pin it to the regions you actually trade with.
  • Global service (truly international support desk): block only the PRS list. Keep the rest open. Monitor Calls for country-code outliers weekly.

Three mistakes we see

  1. Only blocking the exotic prefixes. +882 is obvious, but +53 and +252 are the ones that actually drain accounts. The exotic ranges are known and your carrier may already flag them; the un-exotic high-rate country codes are what you'll miss.
  2. Setting it per-trunk and not per-number. On Voylo, outbound country blocks live on the number, not the outbound trunk — because customers often share one AI vendor (trunk) across many customer-facing numbers, each with different business rules. Set the block list on each number; the number's rules travel with it even if you change which AI handles its outbound.
  3. Forgetting about the AI vendor's own number validator.Many AI vendors ship a basic E.164-shape check and nothing else. That's not a toll-fraud defense — it just ensures the number is syntactically dialable. The economic guardrail is yours to configure, on the number.

Why this isn't default-on

Same reason as the per-caller throttle: a defaults-on block list would cause more surprises than it prevents on day one. The first time a Voylo customer books a UAE number, they haven't configured anything, and we assume they want their AI to call anywhere that's syntactically a phone number. The second week in production, when a leaked key or a hallucinated number costs them real money, we'd rather they discover this pagethan a bill they can't appeal.

The two-meter billing we run (platform minutes vs carrier fees) also means a customer never sees runaway carrier charges "included" in a plan they thought was all-you-can-eat. Every outbound carrier minute is wallet-paid and transparent. The country block list is how you make sure those minutes go where you intend.

For an audit of what your platform has been billing you per destination, open /admin/usage as a staff user. Each account shows local vs international minutes split with the carrier $ at your actual per-number rates. Spot a country-code outlier that doesn't belong? Block it on the number before the next call lands.
Try this on Voylo

Free tier covers everything in this post. No credit card.