An E.164 phone number is the full international form of a phone number: a country code plus the national number, at most 15 digits, with no spaces or domestic prefixes. APIs usually write it after a plus sign, with the digits run together. A US number becomes +1 followed by its ten digits, a UK number drops its leading 0 after +44, and an Indian mobile becomes +91 followed by its ten digits.
This guide covers what the February 2026 edition of the standard says, how numbers from different countries convert, where national habits break conversion, which checks you need, and where the format breaks inside a real stack.
Note: Key takeaways
- E.164 has a 15-digit ceiling. It counts the country code and national number, and it excludes the plus sign and every dialling prefix.
- The plus is a marker. ITU-T treats it as a symbol, while most APIs require it, so you need one stored convention.
- Every country has its own traps. A national number can begin with the same digits as a country code, and a local landline number can't be converted without its area code.
- Valid format isn't permission. A correctly formatted number can still be unallocated, or be the wrong series for your call under local rules.
- Normalise in one place. Do it once on the way in, and again on webhooks (callbacks) that return digits in a different form.
What is an E.164 phone number?
E.164 is an ITU-T recommendation titled "The international public telecommunication numbering plan". The edition in force is dated February 2026. The first issue dates from 1984, and the older E.163 plan was merged into it in 1991.
The name is a document number, not an acronym. Developers use it as shorthand for one thing the plan makes possible: a single spelling of a number that reads the same from any country.
The standard covers more than ordinary phone lines. Its current edition defines eight categories, including Geographic Areas, Global Services, Networks, and IoT and M2M services. Almost everything you dial sits in the geographic category, which is what the rest of this guide describes.
How is an E.164 number structured?
A geographic E.164 number has two fields. The country code runs from 1 to 3 digits, and the national (significant) number can use up to 15 minus that length. Countries may divide the national part further, usually into a national destination code and subscriber number, and that split is their own decision.
The chart shows why a shared length rule is safer than a per-country guess. Universal Freephone numbers have a fixed 11 digits, and India's everyday numbers leave three digits spare, yet TRAI describes toll-free formats of up to 13 digits and a 13-digit series for SIM-based M2M devices. Add the two digits of +91 and both land exactly on the limit, so test your schema against them.
Some things travel with a number without being part of it. A quicker test is to ask what each one depends on:
| Depends on | Item | Why it stays out |
|---|---|---|
| Where the caller is | International prefix, such as 00 in India or 010 in Japan | Prefixes aren't part of the international number, under E.164 clause 7.3 |
| The destination's domestic plan | Trunk prefix | The national (significant) number excludes it, under clause 7.3.2 |
| How the number is written | The plus sign | ITU-T recommends "+" to indicate that an international prefix is required, under clause 15 and E.123 |
| A private or national system | Extensions and short codes | Emergency and service codes can't take global form, and PBX extensions belong to a private system |
The plus deserves a clear answer, because sources seem to disagree. The ITU text treats it as a symbol. Many telephony APIs list it as a requirement, and RFC 3966 builds it into its global-number syntax. Both views hold: the digits are the number, and the plus is the convention software uses to mark them as complete.
How do you write a number in E.164?
Start from the country, because the conversion isn't the same everywhere. These examples use masked digits, and the UK row sits in a range Ofcom sets aside for drama.
| Country | Written locally | E.164 | What changed |
|---|---|---|---|
| United States | (212) 555-01XX | +121255501XX | Added country code, removed punctuation |
| United Kingdom | 020 7946 0XXX | +442079460XXX | Dropped the trunk 0 |
| India, mobile | 098XXX XXXXX | +9198XXXXXXXX | Dropped the trunk 0 |
| India, fixed line | 080 XXXX XXXX | +9180XXXXXXXX | Dropped the trunk 0, kept the STD code |
| Italy | 06 XXXXXXXX | +3906XXXXXXXX | Kept the leading 0 |
| Argentina, mobile | 02982 15 XXXXXX | +5492982XXXXXX | Dropped 0 and 15, added 9 |
The last two rows are why "delete the first zero" is a bug. libphonenumber's list of false assumptions records that Italy fixed its zero into numbers in 1998, and that Argentine mobiles change digits in the middle between national and international form. We confirmed the Italian rule by parsing a synthetic number with the library's Python port.
Worked example: where do national habits break conversion?
The country code is the easy part. Ambiguity comes from everything people type around it, and each country adds its own habits. Run your normaliser only when you already know the country, such as a form with a country selected. Three mistakes cost the most:
- Length decides, not the first digits. A national number can start with the same digits as a country code. In India, for example, a ten-digit mobile can start with 91, so code that sees 91 and assumes a country code produces a number that's two digits short.
- A trunk 0 can come from anywhere. UK numbers carry one domestically, and India has required a 0 before mobile numbers on fixed-line calls since January 2021. PBX logs and old CRMs can therefore hold extra-long strings that still convert the same way.
- A local landline number isn't enough. A US seven-digit local number needs its area code, and TRAI describes Indian fixed-line numbers as an SDCA code plus a subscriber number, with 6, 7, or 8 digits dialled locally. Without the code, you can't know the city.
Special series behave differently in libraries, too. When we ran synthetic Indian numbers through phonenumbers 9.0.42, a Python port of libphonenumber, on November 3, 2026, toll-free numbers came back valid but not internationally diallable, and 13-digit M2M SIM numbers came back possible but not valid. Treat any library result as one version's behaviour, not a regulation, and re-run your own checks after upgrades.
How do you validate an E.164 number?
Validation isn't one check. Each layer answers a different question, and passing one tells you nothing about the next. These four layers give you checks you can run.
Shape is the regular expression most guides stop at: a plus, a first digit from 1 to 9, and up to 14 more digits. The first digit can't be 0 because no country code begins with it. A pattern can't prove a number is real. In our test, a +91 number one digit short passed this layer without trouble.
Numbering plan needs country metadata. libphonenumber offers isPossibleNumber, a quick length-based guess, and isValidNumber, which checks against the country's ranges. It's also used by the Android framework. In our test, isPossibleNumber accepted several strings that isValidNumber rejected, so don't treat the two as equal.
Network tells you what's true today. Numbers get disconnected, recycled, and reassigned, so that same list advises against storing validity or line type. Re-check them when you need them.
Permission sits outside numbering entirely. Some regulators reserve series by call type. In India, for example, TRAI assigns 1600xx to service and transaction calls by BFSI and government entities, and 140xx to promotional calls. A flawless E.164 string on the wrong series is still the wrong call. Check the Indian calling regulations and take legal advice for your own case.
Which checks do you need?
| Situation | Run these | Why |
|---|---|---|
| Sign-up form | Shape and plan, then a confirmation message or call if identity matters | Rejects typos without blocking foreign users |
| CRM or spreadsheet import | Plan, plus a review queue for failures | Old data holds local forms you shouldn't guess at |
| Outbound campaign | All four | Bad numbers waste attempts, and permission failures carry legal risk |
| Inbound webhook | Normalise only | The caller already reached you, so log oddities rather than reject them |
| Caller ID setup | Shape, then confirm that your account holds the number | A correct string proves nothing about who holds it |
Testing has its own rule: never put a stranger's number in fixtures. Use reserved ranges such as the Ofcom block above, and masked placeholders in documentation.
Where does E.164 break in a real stack?
Keep one canonical form, normalised once at the boundary. The harder part is knowing where the boundaries are. Most failures happen when a system re-encodes the number or receives it from someone with a different convention.
| Boundary | What goes wrong | What to do |
|---|---|---|
| Database column | Numeric types lose leading zeros and the plus | Use text, and keep the raw input beside it |
| URL path or query | Form decoding turns a raw + in a query into a space, and some APIs want it encoded in paths too | Percent-encode it as %2B |
| Form-encoded webhook | The same decoding can leave a leading space and no plus | Trim, then run your normaliser |
| SIP request | The digits look like a username | Follow RFC 3261, which says user set to phone should be present for a telephone number |
| tel: URI | Separators break naive comparison | RFC 3966 excludes separators from comparison, so strip them first |
| Caller ID | Inbound numbers can arrive without a plus | Expect it: E.164 Annex A says international calling line identity should carry no prefixes or symbols |
That last row explains a puzzle many developers hit. Digits-only values aren't always a bug. They can reflect what networks and some messaging platforms carry, so your code needs to add the plus back before it compares two numbers.
Length deserves similar care. A text column of 16 characters holds the plus and 15 digits. However, libphonenumber reports German numbers beyond 15 digits, and ITU-T says numbers over the limit aren't international E.164 numbers. Keep the normalised column tight and the raw column generous.
E.164 vs other number formats
These names cover different jobs, so choose by what will read the value next. The table sorts them by job, using one UK number.
| Job | Form | Masked example | Note |
|---|---|---|---|
| Store, send to APIs, match records | E.164 | +442079460XXX | The canonical number |
| Show to local users | National | 020 7946 0XXX | Only works inside one country |
| Show on websites and letterheads | International display (E.123) | +44 20 7946 0XXX | Readable, with spaces |
| Link from HTML for click-to-call | tel: URI (RFC 3966) | tel:+44-20-7946-0XXX | Separators are allowed |
| Signal over a trunk | SIP URI (RFC 3261) | sip:+442079460XXX@host;user=phone | A number as a SIP address |
| Nothing: never store it | Dialled string | 00 44 20 7946 0XXX | It depends on where the caller is |
Don't confuse any of these with the E.212 identity a mobile network uses for a subscription. It's also a long digit string attached to a SIM, but it's a separate identifier.
A number also tells you little about whoever holds it. One number can be shared, and a country code doesn't reveal where someone lives. Think of it as an address, and be careful using it as an identity key.
How Vobiz handles E.164
Vobiz uses E.164 across its phone number, voice, messaging, and call record APIs. Here's where the format appears and what to send.
- Numbers. Number objects carry the number in E.164, and you buy a number by passing it in that form. A JSON body keeps the literal +.
- URL paths. Endpoints such as the numbers endpoint, keyed by the E.164 number need the plus encoded as %2B, as the Release a Phone Number reference specifies.
- Inventory filters. When you browse inventory, search matches a substring of the E.164 number. exclude takes prefixes with the country code, and the leading + is optional there.
- VobizXML. Numbers inside a dial instruction and its caller ID both use E.164, and the docs show them with a plus.
- Make Call API. The Make Call reference shows the caller and destination as digits with the country code. The destination can also be a SIP URI.
- SMS and WhatsApp. SMS sender and recipient numbers use E.164. WhatsApp sends use a plus on the recipient, while WhatsApp webhooks (callbacks) show wa_id and the sender as digits only.
- Integrations. Each guide states its form. Dograh takes your number without the plus, and ElevenLabs takes it with the plus.
- Records. Call detail records report the caller ID number in E.164, which helps when you join calls to your own contacts.
Because these surfaces show both spellings, keep one form in your database and adapt at each edge. Normalise values from answer URL requests and webhooks before you compare them.
When a number fails on a call, the hangup causes reference tells you which layer to fix:
| Signal | Layer | First step |
|---|---|---|
| Code 2000, Invalid Destination Address, or INVALID_NUMBER | Shape or plan | Re-check the E.164 form and the number |
| Code 3050 or UNALLOCATED_NUMBER | Network | Confirm the number with its owner |
| Code 2030, Destination Country Barred | Permission | Review geo permissions in the console |
| Code 2040, Destination Number Barred | Permission | Review high-risk permissions |
| From number not owned by account | Permission | Match the sender number to your own number list, in the same form |
For Indian commercial traffic, the 140 and 160 series guide covers how to get these numbers, and Indian calling regulations cover their use..
Calls, messages, and number purchases can bill your account or reach real people. Run them only with your own Auth ID and Auth Token, after confirming the exact numbers.
Frequently asked questions
What does E.164 stand for?
It stands for nothing. E.164 is how ITU-T numbers one of its recommendations, whose title is The international public telecommunication numbering plan. The current edition was approved in February 2026. People use the name for the international number format that the plan defines.
Do I keep the leading 0 when converting to E.164?
Usually not. In most countries, such as the UK and India, the leading 0 is a trunk prefix, so 020 7946 0XXX becomes +442079460XXX. Italy is the main exception, because it keeps the 0. Fixed-line numbers also need their area code, so a local six- to eight-digit number can't be converted alone.
Does an E.164 number include the plus sign?
Strictly, no. ITU-T treats the plus as a symbol showing that an international prefix is needed, and it doesn't count towards the 15 digits. Many APIs and the tel URI standard still require it, so include it unless the reference for your endpoint shows otherwise.
What is the maximum length of an E.164 number?
ITU-T recommends a maximum of 15 digits, including the country code and excluding any prefix. A one-digit country code leaves 14 digits for the national number, and a three-digit code leaves 12. In practice most numbers are shorter, such as 11 digits for a US number or 12 for a UK or Indian one.
How do I convert a phone number to E.164?
Know the country first. Remove separators and any international prefix, drop the trunk prefix where the country treats it as a prefix, then add the plus and country code. Use a metadata-driven library, because rules differ by country. Italy, for example, keeps its leading zero.
Can a regex validate an E.164 number?
Only partly. A pattern confirms the shape: a plus, a non-zero first digit, and at most 15 digits. A string can pass with a country code nobody holds, a wrong length for its country, or a dead line. Add a numbering plan library, then use live signals when reachability matters.
Further reading on Vobiz
- What is a DID number? · Toll-free vs local vs mobile numbers · What is caller ID and CNAM?
- What is a Voice API? · What is SIP trunking? · Call API overview
- Phone numbers API · Hangup causes · Dialing a phone number
Sources
Standards
- ITU-T, Recommendation E.164: The international public telecommunication numbering plan, edition page, and full text, February 2026.
- ITU-T, Recommendation E.123: Notation for national and international telephone numbers, February 2001.
- IETF, RFC 3966: The tel URI for Telephone Numbers, December 2004.
- IETF, RFC 3261: SIP: Session Initiation Protocol, June 2002.
- IETF, RFC 6116: The E.164 to URI DDDS Application (ENUM), March 2011.
- WHATWG, URL Standard, form-urlencoded parsing section.
Regulators
- TRAI, Recommendations on Revision of National Numbering Plan, 6 February 2025.
- TRAI, Press release 91/2026 on the 1600 and 140 series, 10 July 2026.
- DoT, Corrigendum on 1600 series allocation, 21 January 2026.
- Ofcom, Numbers for use in TV and radio drama.
- tele.net, DoT's 0 prefix regime for landline to mobile calls, January 2021. Secondary report of the DoT circular.
Software and guides
- Google, libphonenumber README, Falsehoods programmers believe about phone numbers, and numbering metadata.
- David Drysdale, python-phonenumbers, version 9.0.42 used in our test.
If those numbers feed a voice AI agent's dialler, Vobiz provides the SIP trunks and numbers to place the calls.



Top comments (0)