Short answer: A prefix is a reliable “this is a virtual line” signal only in countries that allocated separate ranges to resellers — mainland China’s 170, 171, 162, 165, 167 being the clearest example. In most of the world no such range exists, and the same prefix carries both real SIMs and VoIP lines.

People look for a prefix list because it promises a shortcut: memorise a handful of numbers and you can spot a virtual line at a glance. That shortcut works in exactly one situation, so it’s worth knowing where the line is.
Where prefixes really do mark virtual lines
| Market | Ranges | What it means |
|---|---|---|
| Mainland China | 170, 171, 162, 165, 167 | Allocated to MVNO resellers |
| Several EU markets | Dedicated M2M / non-geographic blocks | Machine lines, rarely person-owned |
| Many countries | Non-geographic “personal number” ranges | Forwarding services, not handsets |
Numbers in those blocks are usually real, live, on-network lines — they can call and text. They are simply operated by a reseller rather than the host carrier. Because bulk signup farms leaned on them, many consumer apps now refuse the entire block, which is why a perfectly working line gets “this number is not supported”.
Why the trick fails everywhere else
Cross a border and the logic changes:
- Under a single US area code you’ll find AT&T handsets and Twilio VoIP lines side by side.
- UK 07 covers every mobile line, resold or not.
- Whether a number is “virtual” depends on its current type and owner in the carrier database, not on its first three digits.
That’s why platforms query HLR lookups and commercial line-type databases instead of matching prefixes. The detection side is covered in what is a non-VoIP number.
Three checks that work anywhere
- Check the prefix — only meaningful in markets with reseller blocks.
- Run a line-type lookup — you want the answer
mobile, notvoiporfixed. - Watch behaviour — a line that receives bank messages is trusted; one that keeps getting refused already carries a low reputation score.
The practical version of all three is in how to tell if a phone number is virtual.
Why this decides whether your code arrives
Blocking happens in three places, and prefixes only trigger the first:
- The app’s own range blocklist. Nothing is even sent; you just see “cannot deliver”.
- Carrier filtering of bulk A2P traffic — see why carriers filter SMS.
- Number reputation built up from repeated signups — see phone number reputation.
Stack all three and you get the familiar situation where the line is genuine but the code never lands.
What to look at instead
Judge the sourcing, not the prefix. The gap between a real-SIM pool, a dedicated pool, and a public shared inbox is far wider than any range difference — see SMS number sourcing explained. A platform that lets you pick the target service is usually maintaining an internal list of ranges that still pass.
Summary
Prefixes are a local shortcut, not a global rule. Learn your market’s reseller blocks if you have one; everywhere else, spend the effort on a line-type check and on knowing where the number came from.