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.
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_type | SMS | Voice | At sign-up |
|---|---|---|---|
mobile | Send | Call | Normal |
fixed_line | Don't send; offer a voice code | Call | Normal for voice-based flows |
fixed_line_or_mobile | Plan doesn't separate them; send and watch delivery reports | Call | Normal; consider another signal |
voip | Sometimes works | Call | A signal for extra verification, not a block |
toll_free | Rarely relevant for consumers | Call | Worth a second look |
premium_rate, shared_cost | Don't send | Avoid | Very unlikely for a genuine sign-up |
personal, uan, pager, voicemail | Don't send | Depends | Worth a second look |
unknown | Keep your default | Keep your default | Treat 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:
| Attribute | Meaning |
|---|---|
line_type | One of the values in the table above |
carrier | Current carrier name, as far as our data shows |
original_carrier | Carrier the range was allocated to; only present when it differs from carrier |
country | ISO 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:
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:
{"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:
{"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:
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):
{"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). Sendmax_age: 0to 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) andcountry, for every country, in real time or bulk. It's in beta because coverage varies. - No data means
unknownwithNO_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
+1countries come backunsupported_countryat no charge.
Sources
- ITU-T E.164: The international public telecommunication numbering plan — International Telecommunication Union, 2026
- ITU-T E.212: The international identification plan for public networks and subscriptions — International Telecommunication Union, 2024
- Wireless Local Number Portability (WLNP) — Federal Communications Commission (archived copy), 2025
- Reassigned Numbers Database — Federal Communications Commission (archived copy), 2026
- libphonenumber — Google, 2026
- 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.
Related services and guides
More from the blog
All articlesGuides
Mobile number portability: why carrier lookups can be wrong
A number's prefix shows the network its range was given to, not the one serving it today. How porting works, where lookups fail and how to handle it.
7 min read
Guides
HLR lookup vs MNP lookup vs number validation: what each one answers
Validation checks the digits, MNP finds the current network, HLR asks the network if the number is live. What each answers, costs and misses.
7 min read
Guides
How to check if a phone number is active (and what "active" really means)
Valid, active, reachable and registered mean different things. The methods for checking each one, what they cost and where every method falls short.
7 min read


