# Carrier and line type lookup

> Look up the line type and current carrier of a phone number, plus the original carrier when it differs. Beta, real time or bulk; no data is free.

Canonical: https://mobilevalidate.com/services/carrier-lookup · Last updated: 2026-09-27

![A cell tower sends signal to a SIM card; the line type is identified as mobile rather than landline or VoIP.](https://mobilevalidate.com/images/carrier-and-line-type-lookup.svg)

*Carrier lookup returns the line type (mobile, landline or VoIP) and the network behind the number.*


The carrier lookup tells you what kind of line a phone number is (mobile, fixed line, VoIP, toll-free and others) and which network serves it. When the number has moved away from the network its range was allocated to, it also returns that original carrier. It covers numbers worldwide, in real time or in bulk jobs, and is currently in beta.

## What does the carrier lookup tell you?

It answers two practical questions about a number: *can it receive SMS at all*, and *which network is it on*. The first comes from `line_type`, the second from `carrier`.

A `line_type` of `mobile` means the number belongs to a mobile range. `fixed_line`, `toll_free`, `premium_rate`, `shared_cost` or `uan` usually mean SMS will fail or cost money for nothing. `voip` means the number is served by an internet-telephony provider. In some countries mobile and fixed ranges cannot be told apart, and the answer is then `fixed_line_or_mobile`. The [line type glossary entry](/glossary/line-type) explains each value.

`carrier` is the current network name. `original_carrier` appears only when it differs from `carrier`, and a difference is a strong hint that the number was [ported](/glossary/mobile-number-portability). `country` is the ISO country of the number.

This is data about the number, not about a person or a handset. It does not tell you whether the phone is switched on. That needs a live query to the home network, which the [HLR lookup](/services/hlr-lookup) provides. To confirm a port and get the current network code, use the [MNP lookup](/services/mnp-lookup).

## Who uses it, and why?

Teams that send SMS, place calls or accept phone numbers on forms use the carrier lookup as the first filter.

- **SMS cost control.** Sending a text to a landline or a toll-free number wastes the message fee and skews delivery reports. Filter by `line_type` before you send. See [SMS cost reduction](/use-cases/sms-cost-reduction).
- **Routing.** Some messaging providers price or route by destination network. The current `carrier`, not the one the number prefix suggests, is what counts once a number has been ported.
- **Sign-up and OTP fraud.** A burst of sign-ups from `voip` numbers or a single small carrier is a common pattern in fake account creation and [SMS pumping](/glossary/sms-pumping). The line type is a signal for an extra verification step.
- **Lead verification.** A form entry with a `fixed_line` number in a "mobile" field, or a number whose country doesn't match the address, is worth a second look.

Unlike the platform checks, this service returns data rather than a yes/no answer. A conclusive answer has `registered: true`, which means "data found".

## What do you get back?

| Field | Type | Meaning |
|---|---|---|
| `attributes.line_type` | enum | `mobile`, `fixed_line`, `fixed_line_or_mobile`, `voip`, `toll_free`, `premium_rate`, `shared_cost`, `personal`, `pager`, `uan`, `voicemail` or `unknown` |
| `attributes.carrier` | string | Current carrier name (up to 80 characters) |
| `attributes.original_carrier` | string | Carrier the number range was allocated to, only when different |
| `attributes.country` | string | ISO 3166-1 alpha-2 country of the number |
| `registered` | boolean or null | `true` when data was found; `null` when not conclusive |
| `status` / `reason` | enum / string | `completed`, `unknown` (e.g. `NO_DATA`, `UPSTREAM_TIMEOUT`), `pending`, `unsupported_country` |
| `checked_at`, `cached`, `billed` | — | When the answer was obtained, whether it came from cache, whether it was charged |

An answer is conclusive only when `carrier` is present. Attributes we don't have are left out rather than guessed.

## How is it billed?

You pay per number, and only when we return carrier data. You're not charged for inconclusive results (unknown, unsupported country, timeout, invalid, duplicate). A number we hold no data for comes back as `unknown` with reason `NO_DATA` and is free. Real-time and bulk checks have separate prices. See [pricing](/pricing).

Repeat checks of the same number inside the freshness window can come from your account's cache. Cache hits are free (`cached: true, billed: false`). Send `max_age: 0` to force a fresh, billed check. Use `max_cost` to cap what a single request can cost.

## What are the limits?

The carrier lookup runs in real time (`POST /v1/lookup`, up to 100 numbers) and in bulk jobs (`POST /v1/jobs`, up to 50,000 numbers and e-mails). It accepts numbers from every country, but **coverage varies by country**. That is why the service is labelled beta, and why `NO_DATA` answers are free.

- Up to 20 checks per request. Numbers × checks is capped at 2,000 per lookup and 100,000 per job.
- Requests that look like sequential number ranges or generated e-mail lists are rejected (20 or more consecutive numbers → `suspected_enumeration`).
- A daily numbers cap applies per account (`GET /v1/limits`).
- Carrier names are returned as we hold them. Brand names, mergers and MVNOs (virtual operators that use another network) can make the name differ from what a subscriber sees on their bill.

## How do I use it responsibly?

Line type and carrier are facts about a number, but the number usually belongs to a person. Check only numbers you have a lawful reason to process, such as customers, sign-ups and leads who gave you their number. Don't use the lookup to screen or profile people for eligibility decisions like credit, housing or employment. The [acceptable use policy](/legal/acceptable-use) forbids that. A `voip` answer is not evidence of fraud on its own. Many legitimate users have VoIP numbers.

People can object to their number being checked through the [opt-out form](/opt-out). Suppressed numbers are skipped and never charged.

## Example request

With a test key, `+447700900001` returns fixed test data, `…002` returns `unknown` (`NO_DATA`) and `…003` returns `unknown` (`UPSTREAM_TIMEOUT`). See [test mode](/docs/test-mode).

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

Response (excerpt, test mode: the first item of `results`):

```json
{
  "kind": "phone",
  "input": "+447700900001",
  "e164": "+447700900001",
  "country": "GB",
  "number_status": "valid",
  "checks": {
    "network.carrier": {
      "service": "network.carrier",
      "status": "completed",
      "registered": true,
      "attributes": {
        "line_type": "mobile",
        "carrier": "Test Carrier",
        "country": "GB"
      },
      "confidence": "high",
      "confidence_score": 0.99,
      "checked_at": "2026-09-25T14:25:31.270Z",
      "cached": false,
      "age_seconds": 0,
      "billed": false,
      "reason": null,
      "poll_after_ms": null
    }
  },
  "test": true
}
```

## Frequently asked questions

### What is the difference between carrier and original_carrier?

carrier is the network the number is served by today, as far as our data shows. original_carrier is the network the number range was first allocated to, and is only returned when it differs, which usually means the number was ported.

### Does a carrier lookup tell me whether the phone is switched on?

No. It describes the number (line type and network), not the handset. Live reachability needs a live network query, which our HLR lookup provides.

### Why is the service marked beta?

Coverage and data depth still vary by country. When we hold no data for a number, the result is unknown with reason NO_DATA and you are not charged.

### Should I use this or the US/CA carrier lookup for North American numbers?

For US and Canadian numbers where porting is common, the US/CA carrier lookup is the more specific option. It runs in bulk jobs only. The general carrier lookup covers all countries and also works in real time.

### Can I block every VoIP number based on line_type?

You can, but many real customers use VoIP numbers. Most teams treat voip as a reason for an extra step, such as another verification method, rather than an automatic block.

## Service code and modes

- Code: `network.carrier` (input: phone number)
- Modes: realtime and bulk · worldwide

## Price (live)

- Realtime (POST /v1/lookup): $0.002 per check ($2.00 per 1,000)
- Bulk (POST /v1/jobs): $0.001 per check ($1.00 per 1,000)
- You're not charged for inconclusive results (unknown, unsupported country, timeout, invalid, duplicate).

## Response fields (from the public catalog)

| Field | Type | Meaning |
|---|---|---|
| registered | boolean or null | true when data was found; null when unknown (not charged) |
| status | enum | completed, pending, unknown, unsupported_country, failed |
| checked_at | timestamp | When the answer was obtained |
| attributes.line_type | enum (mobile, fixed_line, fixed_line_or_mobile, voip, toll_free, premium_rate, shared_cost, personal, pager, uan, voicemail, unknown) | Line type. |
| attributes.carrier | string | Current carrier name. |
| attributes.original_carrier | string | Carrier the number range was allocated to, when different. |
| attributes.country | string | ISO 3166-1 alpha-2 country of the number. |
