Skip to content
Google's common Java, C++ and JavaScript library for parsing, formatting, and validating international phone numbers.
C++ Java JavaScript CMake C HTML
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
cpp Metadata updates for release 8.11.4 (#2435) Feb 12, 2020
debian Update URL for libphonenumber on GitHub. (#2362) Jul 18, 2019
java Rnidhi maven update (#2436) Feb 12, 2020
javascript Metadata updates for release 8.11.4 (#2435) Feb 12, 2020
resources Metadata updates for release 8.11.4 (#2435) Feb 12, 2020
tools Metadata updates for release 8.11.4 (#2435) Feb 12, 2020
.travis.yml Check whether non-test JS files are ASCII-safe during CI (#2249) Sep 5, 2018
AUTHORS CPP: Fixing crash when AsYouTypeFormatter tries to handle countries w… Dec 3, 2014 Update URL for libphonenumber on GitHub. (#2362) Jul 18, 2019
CONTRIBUTORS Update CONTRIBUTORS. (#2130) Feb 19, 2018 Update (#2353) Jun 6, 2019 Update URL for libphonenumber on GitHub. (#2362) Jul 18, 2019
LICENSE PROJECT: Checking in AUTHORS and LICENSE files. Dec 3, 2014
LICENSE.Chromium Add missing Chromium license text. Dec 3, 2014 Update (#2437) Feb 12, 2020
codereview.settings Update URL for libphonenumber on GitHub. (#2362) Jul 18, 2019 Update URL for libphonenumber on GitHub. (#2362) Jul 18, 2019
pending_code_changes.txt Metadata updates for release 8.10.8 (#2332) Mar 20, 2019
pom.xml Build the tools and libraries all at once with Maven. Dec 3, 2014
release_notes.txt Metadata updates for release 8.11.4 (#2435) Feb 12, 2020 Update URL for libphonenumber on GitHub. (#2362) Jul 18, 2019

What is it?

Google's common Java, C++ and JavaScript library for parsing, formatting, and validating international phone numbers. The Java version is optimized for running on smartphones, and is used by the Android framework since 4.0 (Ice Cream Sandwich).

Quick links

Highlights of functionality

  • Parsing, formatting, and validating phone numbers for all countries/regions of the world.
  • getNumberType - gets the type of the number based on the number itself; able to distinguish Fixed-line, Mobile, Toll-free, Premium Rate, Shared Cost, VoIP, Personal Numbers, UAN, Pager, and Voicemail (whenever feasible).
  • isNumberMatch - gets a confidence level on whether two numbers could be the same.
  • getExampleNumber and getExampleNumberForType - provide valid example numbers for all countries/regions, with the option of specifying which type of example phone number is needed.
  • isPossibleNumber - quickly guesses whether a number is a possible phone number by using only the length information, much faster than a full validation.
  • isValidNumber - full validation of a phone number for a region using length and prefix information.
  • AsYouTypeFormatter - formats phone numbers on-the-fly when users enter each digit.
  • findNumbers - finds numbers in text.
  • PhoneNumberOfflineGeocoder - provides geographical information related to a phone number.
  • PhoneNumberToCarrierMapper - provides carrier information related to a phone number.
  • PhoneNumberToTimeZonesMapper - provides timezone information related to a phone number.



The Java demo is updated with a slight delay after the GitHub release.

Last demo update: v8.11.4.

If this number is lower than the latest release's version number, we are between releases and the demo may be at either version.


The JavaScript demo may be run at various tags; this link will take you to master.

Java code

To include the Java code in your application, either integrate with Maven (see wiki) or download the latest jars from the Maven repository.


Javadoc is automatically updated to reflect the latest release at

Versioning and Announcements

We generally choose the release number following these guidelines.

If any of the changes pushed to master since the last release are incompatible with the intent / specification of an existing libphonenumber API or may cause libphonenumber (Java, C++, or JS) clients to have to change their code to keep building, we publish a major release. For example, if the last release were 7.7.3, the new one would be 8.0.0.

If any of those changes enable clients to update their code to take advantage of new functionality, and if clients would have to roll-back these changes in the event that the release was marked as "bad", we publish a minor release. For example, we'd go from 7.7.3 to 7.8.0.

Otherwise, including when a release contains only metadata changes, we publish a sub-minor release, e.g. 7.7.3 to 7.7.4.

Sometimes we make internal changes to the code or metadata that, while not affecting compatibility for clients, could affect compatibility for porters of the library. For such changes we make announcements to libphonenumber-discuss. Such changes are not reflected in the version number, and we would publish a sub-minor release if there were no other changes.

Want to get notified of new releases? During most of the year, excepting holidays and extenuating circumstances, we release fortnightly. We update release tags and document detailed release notes. We also send an announcement to libphonenumber-discuss for every release.

Quick Examples

Let's say you have a string representing a phone number from Switzerland. This is how you parse/normalize it into a PhoneNumber object:

String swissNumberStr = "044 668 18 00";
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
try {
  PhoneNumber swissNumberProto = phoneUtil.parse(swissNumberStr, "CH");
} catch (NumberParseException e) {
  System.err.println("NumberParseException was thrown: " + e.toString());

At this point, swissNumberProto contains:

  "country_code": 41,
  "national_number": 446681800

PhoneNumber is a class that was originally auto-generated from phonenumber.proto with necessary modifications for efficiency. For details on the meaning of each field, refer to resources/phonenumber.proto.

Now let us validate whether the number is valid:

boolean isValid = phoneUtil.isValidNumber(swissNumberProto); // returns true

There are a few formats supported by the formatting method, as illustrated below:

// Produces "+41 44 668 18 00"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.INTERNATIONAL));
// Produces "044 668 18 00"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.NATIONAL));
// Produces "+41446681800"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.E164));

You could also choose to format the number in the way it is dialed from another country:

// Produces "011 41 44 668 1800", the number when it is dialed in the United States.
System.out.println(phoneUtil.formatOutOfCountryCallingNumber(swissNumberProto, "US"));

Formatting Phone Numbers 'as you type'

PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
System.out.println(formatter.inputDigit('6'));  // Outputs "6"
...  // Input more digits
System.out.println(formatter.inputDigit('3'));  // Now outputs "650 253"

Geocoding Phone Numbers

PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder.getInstance();
// Outputs "Zurich"
System.out.println(geocoder.getDescriptionForNumber(swissNumberProto, Locale.ENGLISH));
// Outputs "Zürich"
System.out.println(geocoder.getDescriptionForNumber(swissNumberProto, Locale.GERMAN));
// Outputs "Zurigo"
System.out.println(geocoder.getDescriptionForNumber(swissNumberProto, Locale.ITALIAN));

Mapping Phone Numbers to original carriers

Caveat: We do not provide data about the current carrier of a phone number, only the original carrier who is assigned the corresponding range. Read about number portability.

PhoneNumber swissMobileNumber =
    new PhoneNumber().setCountryCode(41).setNationalNumber(798765432L);
PhoneNumberToCarrierMapper carrierMapper = PhoneNumberToCarrierMapper.getInstance();
// Outputs "Swisscom"
System.out.println(carrierMapper.getNameForNumber(swissMobileNumber, Locale.ENGLISH));

More examples on how to use the library can be found in the unit tests.

Third-party Ports

Several third-party ports of the phone number library are known to us. We share them here in case they're useful for developers.

However, we emphasize that these ports are by developers outside the libphonenumber project. We do not evaluate their quality or influence their maintenance processes.

Alternatives to our own versions:

  • Android-optimized: Our Java version loads the metadata from Class#getResourcesAsStream and asks that Android apps follow the Android loading best practices of repackaging the metadata and loading from AssetManager#open() themselves (FAQ). If you don't want to do this, check out the port at, which does repackage the metadata and use AssetManager#open(), and may be depended on without needing those specific loading optimizations from clients.
  • Javascript: If you don't want to use our version, which depends on Closure, there are several other options, including - a stripped-down rewrite, about 110 KB in size - and - a browserify-compatible wrapper around the original unmodified library installable via npm, which packs the Google Closure library, about 420 KB in size.
You can’t perform that action at this time.