Phone Number Extractor
Paste a mail thread, a scraped page, a CSV dump or a page of notes, and every phone number in it is listed on the right as you type. Two things are done differently here. Each match is kept exactly as it was written, with its digits and its E.164 form in the column beside it, so the list still reads like the text it came from and still pastes into a system that wants one canonical form. And the runs that were passed over are shown too: a date, a long order number and a run too short to be a number are listed under the results with the reason, instead of arriving silently as phone numbers or vanishing without a word. An extension written after ext, x or # is kept in its own column and never joins the digits, repeats of one number fold into a single row with a count, and the whole list copies as one number per line or downloads as a CSV.
Paste text on the left, or .
Nothing pasted yet. Paste text on the left and every phone number in it is listed as written, beside its digits. A run of 7 to 15 digits counts as a candidate: a shorter run, a longer one and a date are listed as skipped, and an extension written after ext, x or # is kept in its own column.
Every match is kept exactly as it was written, and the digits sit beside it, so the list can go back into the sentence it came from. The region only matters for a number written without a country code: with US +1 chosen, a national number is written out in full. A paste of up to 200,000 characters is read in one pass, and nothing you paste leaves this browser.
Common questions
- How does it decide what is a phone number and what is not?
- It reads the punctuation the way a person does. A letter, a comma, a line break or a double space ends a run, and what survives is digits with the separators numbers are written with: plus, spaces, hyphens, dots, slashes and parentheses. A run of 7 to 15 digits is then treated as a candidate, 15 being the most digits E.164 allows including the country code. Longer runs are listed as skipped with their digit count, runs of 5 or 6 digits are listed as skipped as too short, and a run of fewer than 5 digits is passed over in silence, because a house number or a seat row is not a near miss worth reporting. Inside a run, a plus sign starts a new number, an opening bracket after 7 digits starts a new number, and a plain space after 10 digits starts a new one when the number so far already used a hyphen or a dot, or already holds four groups of digits. That last rule is what separates "617-555-0142 2026-09-20" into a number and a date while leaving "+44 20 7946 0958" whole. The one case the rules cannot always split is two numbers written with nothing but a single space between them and no punctuation at all in either.
- Does it keep the number exactly as it was written?
- Yes, and that is the point of the two columns. The left column is the match character for character, brackets, spaces, dots and all, taken straight out of your text. The right column is the same number normalised: E.164 when a numbering plan accepts the digits, plain digits when none does. Nothing is rewritten in place, so a number you pull out of a signature can go back into the sentence it came from, and the person reading the list can still recognise the number they were looking for. Copy writes the normalised column, one number per line, and the CSV carries both.
- What happens to dates, order numbers and reference codes?
- They are named rather than quietly counted as phone numbers. A date written 2026-09-20, 09/20/2026 or 20.09.2026 is recognised by its shape, a four digit year between 1900 and 2099 with a month and a day around it, and it is listed under the results as "skipped: a date". A long identifier such as an 18 digit order number is listed with its own digit count and the note that it is longer than the 15 digits E.164 allows. Anything that survives those checks is still called a candidate rather than a number, because a 10 digit account reference and a 10 digit phone number look identical in plain text. The status on each row says how far the check went: valid means the digits match a published range in that country's numbering plan, possible means the length fits the plan but no published range matches, and candidate means no plan claims the digits or no region was set.
- Can it read international numbers, and what does the region setting do?
- A number written with its country code, such as +44 20 7946 0958, is read on its own and the region setting is ignored for it. The region only matters for a number written the way a local writes it, with no country code: choose US and 617-555-0142 becomes +16175550142, choose GB and 020 7946 0958 becomes +442079460958. Leave the region unset and those numbers are still found and still listed, with their digits alone and no country code invented for them. All 245 country and territory codes that libphonenumber-js carries are in the list, and the validity check and the E.164 form come from that library's bundled numbering plans, version 1.13.12, which is read in this tab like the rest of the tool.
- Are extensions kept?
- Yes, in their own column. An extension written after ext, ext., extension, xt, x or # is read as an extension and never joins the number's digits, so 617-555-0142 ext. 214 gives you +16175550142 with 214 held separately and the text "ext. 214" quoted as you wrote it. Two rows that share digits but carry different extensions stay two rows, since a switchboard number with two extensions is two contacts. The extension digits are also taken out of the scan, so 214 is never listed a second time as a short run of its own.
- Does it remove duplicates?
- It folds them and tells you how many there were. The same number written three ways, (617) 555-0142 and 617.555.0142 and +1 617-555-0142, is one row in the list below the stage, showing the first spelling seen and "seen 3 times". The Found count above stays honest about how many matches are in the text and the Unique count tells you how many distinct numbers that is. Two numbers count as the same when they normalise to the same E.164 form, or when no plan claims them and their digits match, and the extension is part of that comparison.
- Is my text uploaded anywhere, and how much can I paste?
- Nothing is uploaded. The scan runs in your browser, there is no server in this, no account to make and nothing sent or logged, which is also why there is no queue and the list updates as you type. One pass reads up to 200,000 characters and lists up to 5,000 candidate numbers; past either, the tool says what it counted and what the limit is and asks you to split the text, rather than scanning part of it and handing back a list that looks complete. Your draft and your region choice are remembered in this browser alone so they are still there when you come back, a paste over 100,000 characters is read in full but not stored, and the Start over button above the tool forgets both.
- Can I get the numbers into a spreadsheet?
- Download writes a CSV with one row per unique number and the columns original, digits, e164, extension, status, note and occurrences, quoted to RFC 4180 so a note containing a comma stays in its own field. The Export switch changes what the Copy button writes: Numbers gives the normalised list, one per line, ready to paste into a column, and CSV puts the same rows on the clipboard. Both always write every row, including the ones past the sixty the preview spells out.
Finds candidates in the text you paste and shows each one exactly as it was written beside its digits. It is a text search, not a check that a number exists or is in service, and it reads only what you give it.