# 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.

Canonical: https://mobilevalidate.com/blog/carrier-and-line-type-lookup-explained · Last updated: 2026-09-25

![Cover: Carrier and line type lookup, explained](https://mobilevalidate.com/og/blog/carrier-and-line-type-lookup-explained.png)


By MobileValidate team (https://mobilevalidate.com/about) · Published: 2026-09-25 · Category: Guides · Tags: Carrier lookup, Line type, Mobile number portability, SMS routing, Data quality

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](/glossary/line-type) 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](/blog/how-to-check-if-a-phone-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](https://www.itu.int/rec/T-REC-E.164)). 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](https://github.com/google/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](https://www.itu.int/rec/T-REC-E.212)). Together they form the [MCC-MNC](/glossary/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](http://web.archive.org/web/20251124041815/https://www.fcc.gov/general/wireless-local-number-portability-wlnp)). 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](/blog/mobile-number-portability-why-carrier-lookups-can-be-wrong) 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](https://pages.nist.gov/800-63-4/sp800-63b.html)). Our [VoIP detection guide](/blog/voip-number-detection-for-signups) explains how to use it proportionately.

## How does the MobileValidate carrier lookup respond?

The [carrier lookup](/services/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:

```bash
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](/services/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](/services/us-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:

```bash
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](/docs/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](http://web.archive.org/web/20260324041308/https://www.fcc.gov/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](/services/us-carrier-lookup). Other `+1` countries come back `unsupported_country` at no charge.

## Sources

1. [ITU-T E.164: The international public telecommunication numbering plan](https://www.itu.int/rec/T-REC-E.164) — International Telecommunication Union, 2026
2. [ITU-T E.212: The international identification plan for public networks and subscriptions](https://www.itu.int/rec/T-REC-E.212) — International Telecommunication Union, 2024
3. [Wireless Local Number Portability (WLNP)](http://web.archive.org/web/20251124041815/https://www.fcc.gov/general/wireless-local-number-portability-wlnp) — Federal Communications Commission (archived copy), 2025
4. [Reassigned Numbers Database](http://web.archive.org/web/20260324041308/https://www.fcc.gov/reassigned-numbers-database) — Federal Communications Commission (archived copy), 2026
5. [libphonenumber](https://github.com/google/libphonenumber) — Google, 2026
6. [NIST SP 800-63B-4: Digital Identity Guidelines — Authentication and Authenticator Management](https://pages.nist.gov/800-63-4/sp800-63b.html) — 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.
