Beta
RealtimeBulkPhone input

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.

Last updated

checks: ["network.carrier"]
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.

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 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. 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 will provide when it launches.

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.
  • 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. 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?

FieldTypeMeaning
attributes.line_typeenummobile, fixed_line, fixed_line_or_mobile, voip, toll_free, premium_rate, shared_cost, personal, pager, uan, voicemail or unknown
attributes.carrierstringCurrent carrier name (up to 80 characters)
attributes.original_carrierstringCarrier the number range was allocated to, only when different
attributes.countrystringISO 3166-1 alpha-2 country of the number
registeredboolean or nulltrue when data was found; null when not conclusive
status / reasonenum / stringcompleted, 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.

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

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

Runs as pasted with the public sandbox key, which answers the test values only. In the SDKs, omit the key to use MOBILEVALIDATE_API_KEY.

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
}

Try it now

Realtime lookup via POST /v1/lookup. Every example runs as pasted: it uses the public sandbox key, which answers the test values for free. In the SDKs, omit the key to use MOBILEVALIDATE_API_KEY.

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

Real test-mode result for this check

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:29.004Z",
  "cached": false,
  "age_seconds": 0,
  "billed": false,
  "reason": null,
  "poll_after_ms": null
}

What you get

Fields of checks["network.carrier"], generated from the public service catalog.

FieldTypeMeaning
registeredboolean | nulltrue when data was found; null when unknown (not charged).
statusenumcompleted, pending, unknown, unsupported_country or failed.
checked_attimestampWhen the answer was obtained.
attributes.line_typeenumLine type.mobile · fixed_line · fixed_line_or_mobile · voip · toll_free · premium_rate · shared_cost · personal · pager · uan · voicemail · unknown
attributes.carrierstringCurrent carrier name.
attributes.original_carrierstringCarrier the number range was allocated to, when different.
attributes.countrystringISO 3166-1 alpha-2 country of the number.

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 will provide when it launches.

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.

All articles

Add Carrier lookup to your stack

Request access to MobileValidate. Start in test mode, go live when you are ready.