Guides

Carrier and line type lookup, explained

What carrier and line type data is, allocated vs current network, how porting changes it, and how to read every field of a carrier lookup answer.

By Published 8 min read

On this page

A carrier and line type lookup tells you two things about a phone number: what kind of line it is (mobile, landline, VoIP, toll-free and so on) and which network serves it today. The important word is today. A number's prefix only shows the network its range was originally allocated to. After porting, the current network can be different, and so can the line type. This guide explains where that data comes from, how to read each field, and how MobileValidate's carrier lookups answer.

What is carrier and line type data?

It is descriptive data about a number, not about a person or a handset. Two fields do most of the work:

  • Line type says what kind of service the number belongs to. It decides whether an SMS can arrive, what a call costs and which rules apply. The line type glossary entry lists every value.
  • Carrier names the network that serves the number. It decides how messages are routed and priced, and it's a useful signal for fraud and data quality.

Neither field tells you whether the phone is switched on, who owns the number or whether it has been reassigned to a new subscriber. Those are different questions with different checks, as our guide on how to check if a number is active explains.

A cell tower sends signal to a SIM card; the line type is identified as mobile rather than landline or VoIP.A cell tower sends signal to a SIM card; the line type is identified as mobile rather than landline or VoIP.
Carrier lookup returns the line type (mobile, landline or VoIP) and the network behind the number.

Where does carrier and line type information come from?

From three kinds of source, each with a different view of the number.

Numbering plans. The international structure of phone numbers is defined in ITU-T Recommendation E.164, currently in its February 2026 edition (ITU, 2026). Within that structure, each country's regulator allocates blocks of numbers to operators and designates which ranges are mobile, geographic, toll-free, premium rate and so on. Offline libraries such as libphonenumber encode this: its getNumberType distinguishes fixed-line, mobile, toll-free, premium rate, shared cost, VoIP, personal numbers, UAN, pager and voicemail "whenever feasible". That's the range, not today's service.

Network identifiers. Mobile networks are identified by a mobile country code and a mobile network code under ITU-T E.212 (ITU, 2024). Together they form the MCC-MNC, which pins down a specific network rather than a brand name.

Porting records. In countries with number portability, operators keep track of numbers that moved to another network, so calls and messages can still be routed. Those records are what turn "allocated to network A" into "served by network B today".

A carrier lookup combines these views. The result is only as good as the underlying data for that country, which is why coverage varies and why a lookup should say "no data" rather than fall back to a guess based on the prefix.

What is the difference between the allocated carrier and the current one?

The allocated carrier is the network a number's range was originally given to. The current carrier is the one serving the number now. Before portability they were the same. Today they often aren't.

In the US, the FCC's deadline for wireless local number portability was 24 November 2003. The FCC describes wireless LNP as a consumer's ability to change service providers within the same local area and keep the same number, and notes that it also allows moving a number from a wireline phone to a wireless phone in some cases (FCC). So a US number's area code and exchange tell you where it was first assigned, not which carrier or even which kind of line it is on now.

That has two practical effects:

  • Carrier can change without any change to the digits. Routing and pricing by prefix then go wrong.
  • Line type can change too, for example from landline to mobile, or from mobile to a VoIP service.

Our post on why carrier lookups can be wrong after porting covers porting mechanics and failure modes in depth.

What does each line type mean for your decision?

The value matters less than what you do with it. A practical reading:

line_typeSMSVoiceAt sign-up
mobileSendCallNormal
fixed_lineDon't send; offer a voice codeCallNormal for voice-based flows
fixed_line_or_mobilePlan doesn't separate them; send and watch delivery reportsCallNormal; consider another signal
voipSometimes worksCallA signal for extra verification, not a block
toll_freeRarely relevant for consumersCallWorth a second look
premium_rate, shared_costDon't sendAvoidVery unlikely for a genuine sign-up
personal, uan, pager, voicemailDon't sendDependsWorth a second look
unknownKeep your defaultKeep your defaultTreat as missing data

VoIP deserves a note. It is a legitimate service used by many real people, and NIST's current authentication guidance removed its earlier prohibition on VoIP numbers for out-of-band authentication (NIST, 2025). Our VoIP detection guide explains how to use it proportionately.

How does the MobileValidate carrier lookup respond?

The carrier lookup (network.carrier, alias carrier) works for numbers in every country, in real time and in bulk jobs. It is labelled beta because coverage varies by country. It returns data in attributes:

AttributeMeaning
line_typeOne of the values in the table above
carrierCurrent carrier name, as far as our data shows
original_carrierCarrier the range was allocated to; only present when it differs from carrier
countryISO 3166-1 alpha-2 country of the number

An answer is conclusive only when carrier is present. Attributes we don't hold are left out rather than guessed. Here is a real test-mode request with four numbers:

Shell
curl https://api.mobilevalidate.com/v1/lookup \
  -H "Authorization: Bearer $MOBILEVALIDATE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"numbers": ["+447700900001", "+447700900002", "+447700900003", "+14155552671"],
       "checks": ["carrier"], "wait": 5}'

The four network.carrier results, trimmed:

JSON
{"status": "completed", "registered": true, "attributes": {"line_type": "mobile", "carrier": "Test Carrier", "country": "GB"}, "billed": false, "reason": null}
{"status": "unknown",   "registered": null, "attributes": null, "billed": false, "reason": "NO_DATA"}
{"status": "unknown",   "registered": null, "attributes": null, "billed": false, "reason": "UPSTREAM_TIMEOUT"}
{"status": "completed", "registered": true, "attributes": {"line_type": "mobile", "carrier": "Test Carrier", "country": "US"}, "billed": false, "reason": null}

Three things to notice. A conclusive data answer has registered: true, which here means "data found", not "registered on an app". A number we hold nothing for comes back unknown with reason: "NO_DATA", and a slow source gives UPSTREAM_TIMEOUT. You're not charged for inconclusive results (unknown, unsupported country, timeout, invalid, duplicate). Test data never includes a port, so original_carrier doesn't appear here. In live answers it appears when the number has moved.

How should you read carrier names?

As labels, not as keys. Carrier names come with some traps:

  • Virtual operators. Many retail brands run on another company's network. The lookup can return the network operator's name, which differs from the brand on the customer's bill.
  • Mergers and rebrands. Operator names change over time. Two spellings can refer to the same network.
  • Resellers of VoIP numbers. The name may be a wholesale provider rather than the app the person uses.

So avoid hard-coding exact string matches in routing or fraud rules. Group names into your own normalized list, review unknown names regularly, and rely on line_type for decisions about what kind of line it is. The HLR lookup, coming soon, will add the current network's mcc_mnc, which is a stable code rather than a name.

When should you use the US/CA premium lookup?

When most of your numbers are in the United States or Canada and you work with lists. There, porting between landline, wireless and VoIP services is common, and the US and Canada carrier lookup (network.carrier_us) is the more specific option. It returns line_type and the current carrier, and runs in bulk jobs only.

A real-time request is refused. This is the real test-mode error:

JSON
{"error": {"code": "service_disabled", "status": 403, "param": "checks[0]",
  "message": "The check 'network.carrier_us' is available in bulk jobs only (POST /v1/jobs)."}}

As a job, with a US number, a Canadian number, a Dominican Republic number (also +1) and a test number with no data:

Shell
curl https://api.mobilevalidate.com/v1/jobs \
  -H "Authorization: Bearer $MOBILEVALIDATE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: carrier-us-demo-001" \
  -d '{"numbers": ["+12025550143", "+14165550123", "+18095550100", "+447700900002"],
       "checks": ["network.carrier_us"]}'

Rows from GET /v1/jobs/{id}/results (real test-mode output, trimmed):

JSON
{"input": "+12025****43", "country": "US", "status": "completed", "attributes": {"line_type": "mobile", "carrier": "Test Carrier"}, "billed": false}
{"input": "+14165****23", "country": "CA", "status": "completed", "attributes": {"line_type": "mobile", "carrier": "Test Carrier"}, "billed": false}
{"input": "+18095****00", "country": "DO", "status": "unsupported_country", "reason": "UNSUPPORTED_COUNTRY", "billed": false}
{"input": "+44770*****02", "country": "GB", "status": "unknown", "reason": "NO_DATA", "billed": false}

The Dominican Republic number shares the +1 country code but isn't covered, so it's unsupported_country and free. Identifiers in job results are masked. Run the free POST /v1/jobs/estimate first to see the maximum cost. See bulk jobs.

How fresh does carrier data need to be?

Fresh enough for the decision you're making. Every conclusive answer has checked_at. Keep it next to the stored carrier.

  • Before a campaign or a routing change, re-check lists older than a few months. Numbers port continuously.
  • Before a sensitive action, such as a password reset or a payout to a new number, check again and compare with the stored carrier. A change of carrier or line type shortly before such an action deserves a step-up.
  • Repeat checks inside the freshness window can be served from your account's cache for free (cached: true, billed: false). Send max_age: 0 to force a fresh, billed check.

One limit is worth repeating. Carrier data doesn't tell you whether a number now belongs to a different person. In the US, the FCC's Reassigned Numbers Database exists for that question, so callers can avoid calling a consumer who received a number previously held by someone else.

What are the key takeaways?

  • Carrier and line type data describes the number: what kind of line it is and which network serves it now. It says nothing about the person or whether the phone is on.
  • The prefix shows the allocated network. After porting, the current carrier and even the line type can differ.
  • MobileValidate's carrier lookup returns line_type, carrier, original_carrier (only when it differs) and country, for every country, in real time or bulk. It's in beta because coverage varies.
  • No data means unknown with NO_DATA, and it's free. Don't treat it as a fake number.
  • Use carrier names as labels, not keys, and base line decisions on line_type.
  • For US and Canadian lists, use the bulk-only US/CA carrier lookup. Other +1 countries come back unsupported_country at no charge.

Sources

  1. ITU-T E.164: The international public telecommunication numbering plan — International Telecommunication Union, 2026
  2. ITU-T E.212: The international identification plan for public networks and subscriptions — International Telecommunication Union, 2024
  3. Wireless Local Number Portability (WLNP) — Federal Communications Commission (archived copy), 2025
  4. Reassigned Numbers Database — Federal Communications Commission (archived copy), 2026
  5. libphonenumber — Google, 2026
  6. NIST SP 800-63B-4: Digital Identity Guidelines — Authentication and Authenticator Management — NIST, 2025

Frequently asked questions

What is the difference between a carrier lookup and an HLR lookup?

A carrier lookup describes the number: its line type and the network that serves it according to numbering and porting data. An HLR lookup asks the home mobile network live whether the subscriber is reachable right now. MobileValidate's HLR lookup is coming soon.

Why does the lookup return original_carrier for some numbers and not others?

original_carrier is the network the number's range was allocated to. It is only returned when it differs from the current carrier, which usually means the number was ported.

What happens when there is no carrier data for a number?

The check returns status unknown with reason NO_DATA and registered null, and you are not charged. Treat it as missing data, not as a sign that the number is fake.

Why is the carrier name different from the brand on the customer's bill?

Many brands are virtual operators that run on another company's network, and operators merge and rebrand. The lookup returns the network name as held in our data, which can differ from the retail brand.

Can I run the US/CA carrier lookup in real time?

No. network.carrier_us runs in bulk jobs only. A real-time request is refused with 403 service_disabled. For real-time answers on any country, use the general carrier lookup.

All articles

Know before you send.

Tell us about your use case. We review every request and set you up with test and live keys.