A list of numbers collected over ten years is written ten ways. Brackets, dashes, dots, a leading 1 on some rows and not others, extensions after a comma, a few numbers from another country, the same customer entered twice under two spellings. Every phone system and every CRM wants one format, and the awkward part of a migration is not the import: it is knowing which rows the import quietly got wrong.
Clean your list
1. Bring your list
One number per line, or paste a whole spreadsheet including its other columns. Comma-separated and semicolon-separated files are both read.
Your list stays in this tab. It is not uploaded, not stored and not put in the address bar, and nothing about it reaches us.
3. What came back
Paste a list or choose a file, and the results appear here.
None of this says a number is in service
Everything above is about shape: whether the digits are arranged the way the published numbering plan says. A number can be arranged perfectly, belong to a real country, and ring nowhere at all, because it was never issued, was given up years ago, or now belongs to somebody else. Finding that out means dialling it or paying somebody to, and this page does neither.
A number that reads correctly is not a number that rings
This is the thing to take away from the page, and it is worth being blunt about because almost every tool of this kind is vague on it. A numbering plan is a published document saying how the digits of a number in a country are arranged: how many there are, which ones may come first, what is dialled locally and what is not. Checking a number against that plan answers one question, which is whether the digits are arranged the way a number there is arranged.
It answers nothing else. It does not say the number was ever issued. It does not say it is still in service. It does not say who holds it now, or that the person beside it in your spreadsheet still has it. Google's libphonenumber, which is the reference implementation for this kind of work, states the same limit in its own documentation, and it is the reason the results above are labelled format-checked and never valid.
So a clean list is a list that will import. It is not a list that will reach anybody. The only thing that tells you whether a number rings is dialling it, and this page has no way to dial anything: there is no server behind it and no lookup of any kind.
What it covers, and what it does not
Coverage here is deliberately lopsided, and saying so is more useful than a claim of global support that falls apart on the third row.
Numbers already written with a plus are converted everywhere. The country code is split off against the ITU's own published list of assigned country codes, all 217 of them, and the whole number is checked against the 15-digit maximum the standard sets. Outside the two plans below that is the entire claim, and the result says so: the shape is possible and nothing more.
Numbers written the local way need a country. They carry no country code, so there is nothing in the digits that says where they are from, and this tool carries the published numbering plan for two: the North American Numbering Plan, and France. A local-form number from anywhere else is reported rather than converted. The United Kingdom is a named absence rather than an oversight: Ofcom's numbering plan could not be read end to end when this was built, and a rule written from memory is a rule nobody can check.
| Plan | Country code | The rule | Read from |
|---|---|---|---|
| Canada, the United States and the rest of the North American Numbering Plan | +1 | Ten digits, written NXX-NXX-XXXX: the area code and the exchange code both start with a digit from 2 to 9, and 1 in front is the trunk prefix rather than part of the number. | Canadian Numbering Administrator, North American Numbering Plan Read 2026-09-07NANPA, About the North American Numbering Plan Read 2026-09-07 |
| France | +33 | Ten digits beginning with 0 when dialled inside France, which ARCEP writes as EZABPQMCDU. The 0 is the trunk prefix, so the number itself is the nine digits after it and the first of those is 1 to 9. | Arcep, La numérotation Read 2026-09-07 |
Note that a country code does not name a country. +1 covers twenty-five countries and territories, from Canada and the United States to Bermuda and Trinidad and Tobago; +7 is Kazakhstan and the Russian Federation; +39 is Italy and the Vatican. So the tool prints every place the ITU lists for a code rather than picking one, and a +1 441 number is a Bermudian one even in a Canadian spreadsheet.
How it works underneath
Each cell is read in one pass. An extension is taken off the end first, because a number and its extension joined together are an eighteen-digit string that is not a number anywhere. Then the formatting comes off. Then the number is either already in international order, because it starts with a plus or with the digits dialled to get an international line, or it is in local order and needs the country you chose.
Splitting the country code off works because the assigned codes are prefix-free: no assigned two-digit code is the start of an assigned three-digit one. So trying one digit, then two, then three and stopping at the first match is not a heuristic, it is exact, and the check script asserts that property over the whole table so a future edit cannot quietly break it.
Local-order numbers are where a tool is tempted to be clever, and this one deliberately is not. The trunk prefix comes off if the plan has one, the rest is matched against the plan's pattern, and if it does not match the row is not forced. When the digits happen to read as an international number with the plus missing, that reading is shown and not applied, because supplying a missing plus is a decision about somebody else's data.
Repeats are found only among rows that resolved, and compared as their international form so the same number written five ways is one number. Two rows nobody could read are never called duplicates of each other, because there is no way to know that they are.
The export is two files. The list is a table and only a table, because a CRM importer would take a trailing block of prose as a contact. The assumptions, the plans, the sources and the sentence about reachability travel in a second file. Both are guarded against formula injection: a cell beginning with an equals sign, a plus, a minus or an at sign runs as a formula when the receiving spreadsheet opens it, and every number this tool produces begins with a plus, so the guard is not optional.
All of it runs in your browser. There is no endpoint behind this page, and a contact list is the last thing a free tool should be collecting.
Questions
How do I convert a column of phone numbers to E.164?
Paste the column above, say which country the numbers with no country code belong to, and read the result. E.164 is the international format: a plus sign, the country code, then the number with no spaces, brackets or dashes and with the digit dialled only inside the country removed. It is what almost every phone system and CRM asks for when it says international format. The tool shows what each row became and why, and leaves alone every row it cannot read with certainty.
Does a correctly formatted number mean the line works?
No, and nothing on this page will tell you it does. A numbering plan says how the digits of a number in that country are arranged. It says nothing about whether this particular number was ever issued, is still in service, or belongs to the person in your spreadsheet. A number can be arranged perfectly, sit in a real country, and ring nowhere. Finding out means dialling it, or paying a service to check, and this page does neither.
Why does the tool refuse to guess the country of a number?
Because the same ten digits are a different number in different countries, and a wrong guess produces a plausible-looking number that quietly fails to ring later. 514 555 0123 is a Montreal number if the list is Canadian and begins with the country code for Peru if it is not. So the country comes from you, one setting for the whole list, and any row that does not fit it comes back reported rather than converted.
What happens to extensions and to my other columns?
An extension written after a number is separated into a column of its own, so the number stays a number and the extension is not lost. Every other column of your file comes back untouched and in place, because the customer id, the account number and the name are what let you match a cleaned row against the row it came from. A cleaner that hands back one column of numbers has handed back something nobody can reconcile.
Is my contact list uploaded anywhere?
No. The file is read by your browser and the whole job runs in this tab. There is no server behind this page, nothing is stored, and nothing about your list is put in the address bar. That matters more here than on our other tools, because a contact list is personal information about people who never visited this site.
How many countries does this cover?
Two different answers, and both are on this page. A number already written with a plus is converted for every one of the 217 country codes the ITU has assigned. A number written the local way needs a country to be read against, and this tool carries the published numbering plan for the North American Numbering Plan and for France. National-form numbers from anywhere else are reported rather than converted, which is the honest answer rather than the flattering one.
A clean list is the start of the move, not the end
Numbers in one format are what an import needs. They do not decide who answers when one of those people calls back, what a caller hears while everybody is busy, or which of your team takes which kind of call. And a number this tool reads happily is not a number that can be moved to a new provider: porting has its own rules and its own paperwork.
Reading first? There is a worked example in a valid number is not an active line, and the number-moving rules are in porting a business number.