Skip to main content

Carrier Mapping

The PhoneNumberToCarrierMapper identifies the mobile carrier for a phone number. This is useful for displaying carrier information to users or routing calls/messages appropriately.
Carrier mapping works best for mobile numbers and is limited by available data for each country.

Getting Started

1

Get Mapper Instance

use libphonenumber\PhoneNumberToCarrierMapper;

$carrierMapper = PhoneNumberToCarrierMapper::getInstance();
2

Parse a Phone Number

$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();
$number = $phoneUtil->parse('798765432', 'CH');
3

Get Carrier Name

// Get carrier name in English
$carrier = $carrierMapper->getNameForNumber($number, 'en');
echo $carrier; // "Swisscom"

Basic Usage

use libphonenumber\PhoneNumberUtil;
use libphonenumber\PhoneNumberToCarrierMapper;

$phoneUtil = PhoneNumberUtil::getInstance();
$carrierMapper = PhoneNumberToCarrierMapper::getInstance();

// Parse a Swiss mobile number
$swissNumber = $phoneUtil->parse('798765432', 'CH');

// Get carrier name
$carrier = $carrierMapper->getNameForNumber($swissNumber, 'en');
echo $carrier; // Output: Swisscom

Localized Carrier Names

Carrier names can be returned in different languages:
$phoneUtil = PhoneNumberUtil::getInstance();
$carrierMapper = PhoneNumberToCarrierMapper::getInstance();

$mobileNumber = $phoneUtil->parse('798765432', 'CH');

// English
echo $carrierMapper->getNameForNumber($mobileNumber, 'en');
// Output: Swisscom

// German
echo $carrierMapper->getNameForNumber($mobileNumber, 'de');
// Output: Swisscom (same in this case)

// French
echo $carrierMapper->getNameForNumber($mobileNumber, 'fr');
// Output: Swisscom
Use the user’s locale to display carrier names in their preferred language when available.

Working with Valid Numbers

For better performance with pre-validated numbers:
$phoneUtil = PhoneNumberUtil::getInstance();
$carrierMapper = PhoneNumberToCarrierMapper::getInstance();

$number = $phoneUtil->parse('+41 79 876 54 32', null);

// Validate first
if ($phoneUtil->isValidNumber($number)) {
    // More efficient if already validated
    $carrier = $carrierMapper->getNameForValidNumber($number, 'en');
    echo $carrier; // Swisscom
}

Safe Display Names

Get a safe carrier name that handles edge cases:
$carrierMapper = PhoneNumberToCarrierMapper::getInstance();
$phoneUtil = PhoneNumberUtil::getInstance();

$number = $phoneUtil->parse('798765432', 'CH');

// Returns carrier name or empty string (never null)
$carrier = $carrierMapper->getSafeDisplayName($number, 'en');

if (empty($carrier)) {
    echo "Carrier information not available";
} else {
    echo "Carrier: $carrier";
}

Handling Different Number Types

Carrier mapping works primarily for mobile numbers:
$phoneUtil = PhoneNumberUtil::getInstance();
$carrierMapper = PhoneNumberToCarrierMapper::getInstance();

// Mobile number - likely to have carrier data
$mobile = $phoneUtil->parse('07400 123456', 'GB');
$type = $phoneUtil->getNumberType($mobile);

if ($type === \libphonenumber\PhoneNumberType::MOBILE) {
    $carrier = $carrierMapper->getNameForNumber($mobile, 'en');
    echo $carrier ?: 'Unknown carrier';
}

// Landline - typically no carrier data
$landline = $phoneUtil->parse('0117 496 0123', 'GB');
$carrier = $carrierMapper->getNameForNumber($landline, 'en');
echo $carrier; // Likely empty string
Supported number types:
  • Mobile numbers: Usually have carrier data
  • Pager numbers: May have carrier data
  • Fixed-line-or-mobile: May have carrier data
  • Other types (landline, toll-free, etc.): Typically no carrier data

Mobile Number Portability

Carrier information may be inaccurate in countries with mobile number portability (MNP), where users can keep their number when switching carriers.
// Example: User may have moved from original carrier
$phoneUtil = PhoneNumberUtil::getInstance();
$carrierMapper = PhoneNumberToCarrierMapper::getInstance();

$number = $phoneUtil->parse('+1 415 555 0123', 'US');
$carrier = $carrierMapper->getNameForNumber($number, 'en');

// This returns the original carrier based on number prefix
// May not reflect current carrier if number was ported
echo "Original carrier: $carrier";
Don’t rely on carrier information for routing decisions in countries with active MNP programs. The data represents the original allocation, not necessarily the current carrier.

Practical Examples

function enrichContactInfo(
    string $name,
    string $phoneNumber,
    string $locale = 'en'
): array {
    $phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();
    $carrierMapper = \libphonenumber\PhoneNumberToCarrierMapper::getInstance();
    
    try {
        $number = $phoneUtil->parse($phoneNumber, null);
        
        $type = $phoneUtil->getNumberType($number);
        $carrier = null;
        
        // Only get carrier for mobile numbers
        if ($type === \libphonenumber\PhoneNumberType::MOBILE) {
            $carrier = $carrierMapper->getNameForNumber(
                $number,
                $locale
            );
        }
        
        return [
            'name' => $name,
            'phone' => $phoneUtil->format(
                $number,
                \libphonenumber\PhoneNumberFormat::INTERNATIONAL
            ),
            'type' => $this->getTypeLabel($type),
            'carrier' => $carrier ?: null,
            'region' => $phoneUtil->getRegionCodeForNumber($number)
        ];
        
    } catch (\libphonenumber\NumberParseException $e) {
        return [
            'name' => $name,
            'phone' => $phoneNumber,
            'error' => $e->getMessage()
        ];
    }
}

private function getTypeLabel(int $type): string
{
    return match($type) {
        \libphonenumber\PhoneNumberType::MOBILE => 'Mobile',
        \libphonenumber\PhoneNumberType::FIXED_LINE => 'Landline',
        \libphonenumber\PhoneNumberType::FIXED_LINE_OR_MOBILE => 'Phone',
        default => 'Other'
    };
}

// Usage
$contact = enrichContactInfo('Jane Doe', '+41 79 876 54 32', 'en');
/*
Result:
[
    'name' => 'Jane Doe',
    'phone' => '+41 79 876 54 32',
    'type' => 'Mobile',
    'carrier' => 'Swisscom',
    'region' => 'CH'
]
*/

Data Availability

Carrier data availability varies by country:
  • Switzerland (CH)
  • United States (US)
  • United Kingdom (GB)
  • Germany (DE)
  • Many other major markets
  • Some smaller countries
  • Countries where carrier data isn’t publicly available
  • Recently assigned number ranges
$carrier = $carrierMapper->getNameForNumber($number, 'en');

if (empty($carrier)) {
    // No carrier data available
    // Could be:
    // - Not a mobile number
    // - No data for this country
    // - Recently assigned range
}

Best Practices

Check Number Type First

Verify it’s a mobile number before attempting carrier lookup

Handle Empty Results

Always check for empty strings - not all mobile numbers have carrier data

Beware of Number Portability

Don’t use for routing in MNP countries - data may be outdated

Use for Display Only

Best used for showing information to users, not for system logic

Limitations

What carrier mapping cannot do:
  • Guarantee accuracy in countries with mobile number portability
  • Provide real-time carrier information
  • Work reliably with non-mobile numbers
  • Detect MVNOs (Mobile Virtual Network Operators) in all cases

Next Steps

Geocoding

Get geographic location information

Timezone Mapping

Determine timezone information from numbers

Carrier Mapper API

Complete API reference for carrier mapping

Number Types

Understanding phone number types

Build docs developers (and LLMs) love