Carrier lookup API
Carrier lookup API for US and Canadian phone numbers
The CheckThatPhone carrier lookup API returns the carrier that currently serves a US or Canadian phone number, with its OCN, its routing number (LRN) and whether it has been ported. The data comes from a live carrier dip at lookup time, so a number that moved carriers last week shows its new carrier, not the one that first issued it.
One POST /v1/lookup call costs one credit and also returns line type,
deliverability and location. The Free plan includes 500 lookups a month.
What a carrier lookup returns
A lookup returns these carrier fields. Values are strings, including booleans.
| Field | Example | Meaning |
|---|---|---|
dip | "success" | Status of the carrier dip: "success", "error" or "invalid". |
dipCarrier | "AT&T" | The carrier currently serving the number. |
dipCarrierType | "mobile" | Broad carrier type: "mobile", "landline", "invalid" or "undefined". |
dipCarrierSubType | "WIRELESS" | Sub-classification such as WIRELESS, PCS, ILEC, RBOC, CLEC or IPES (VoIP). The docs list every code. |
dipOcn | "6010" | Operating Company Number: the ID of the carrier currently operating the number. |
dipLrn | "3125550199" | Local Routing Number: the number calls and texts are actually routed on. Critical for ported numbers. |
dipPorted | "true" | "true" when dipLrn differs from the number, the standard way to detect a port. |
nanpCarrier | "verizon" | Carrier according to numbering-plan data. Not authoritative once a number ports; prefer dipCarrier. |
Why a live carrier dip matters for ported numbers
Numbering-plan data tells you which carrier a block of numbers was assigned to. Once a subscriber ports their number to another carrier, that answer is out of date, and anything built on it (SMS routing, carrier-based fraud rules, line-type filters) inherits the error.
We return both views. nanpCarrier is the numbering-plan answer. The
dip* fields come from a live carrier dip at lookup time: when the routing number
differs from the number itself, dipPorted is "true",
dipLrn holds the routing number and dipCarrier and
dipOcn name the carrier the number moved to.
Example request and response
Send the number in any common format. Add "ip" to get IP-based location as well.
curl --request POST \
--url 'https://api.checkthatphone.com/v1/lookup' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"phone": "(312) 555-0142"}' An illustrative response for a ported mobile number (a fictional 555 number; field names and formats match the live API):
{
"success": true,
"credits_used": 1,
"data": {
"subscriber": "3125550142",
"optDate": "2026-10-03T15:04:12.381Z",
"action": "send",
"deliverable": "true",
"reason": "",
"nanpType": "mobile",
"blackList": "false",
"dip": "success",
"dipLrn": "3125550199",
"dipPorted": "true",
"dipOcn": "6010",
"dipCarrier": "AT&T",
"dipCarrierSubType": "WIRELESS",
"dipCarrierType": "mobile",
"geoState": "IL",
"geoCity": "chicago",
"geoCountry": "US",
"geoSource": "area-code",
"timezone": "America/Chicago",
"tzOffset": 6,
"error": "false"
}
} credits_used: 1 is the whole cost of this call. The same fields come back from the
official Node.js and Python SDKs and in every row of a
bulk CSV upload.
What else comes back in the same call
- Line type.
nanpTypeplus the carrier type and sub-type above. See the line type lookup API for how to read them. - Deliverability.
action("send","unsubscribe"or"error"),deliverable,reason,deactivationDateandblackList. - Location.
geoState,geoCity,geoMetro,timezoneandtzOffset. Pass anipand we addipResultand IP-derived location. - Opt-in add-ons. The TCPA litigator scrub (+1 credit), the landline SMS lookup (+1 credit, landlines only) and the free state DNC and complainer checks.
Where teams use carrier data
- List cleaning before SMS or calls: drop numbers whose carrier type can't take a text, and re-check stale records on a schedule. Contact list hygiene.
- Signup risk: a recently ported number on a VoIP carrier
(
dipCarrierSubType: "IPES") is a different risk from a native mobile. KYC phone verification. - Lead routing: carrier and line type decide whether a lead gets a text or a call. Sales lead validation.
Pricing
Carrier data is part of every lookup, with no per-field fees: one lookup is one credit. The Free plan includes 500 lookups a month, hard-capped. Paid plans:
| Plan | Per month | Lookups included | Overage per lookup |
|---|---|---|---|
| 1K | $5 | 1,000 | $0.005 |
| 10K | $30 | 10,000 | $0.003 |
| 100K | $100 | 100,000 | $0.001 |
| 500K | $450 | 500,000 | $0.0009 |
Failed lookups are free. Annual billing is 15% off. Above 500,000 lookups a month, ask for a volume quote. Full details on the pricing page.
Limits worth knowing
- US and Canada only. NANP numbers. For other countries, use a global provider.
- Not a reassignment check.
deactivationDateshows a recent carrier deactivation, but a reactivated number looks the same whether it went back to the same subscriber or a new one. - Not a delivery guarantee.
deliverableis a reachability summary, not a live delivery test, and carriers don't guarantee delivery.
Carrier lookup: common questions
What is a carrier lookup API?
An API that tells you which carrier serves a phone number. The CheckThatPhone carrier lookup returns the current carrier, OCN, routing number (LRN), porting status and line type for US and Canadian numbers, from a live carrier dip, in one POST /v1/lookup call.
Does the carrier lookup detect ported numbers?
Yes. dipPorted is "true" when the routing number (dipLrn) differs from the number itself, and dipCarrier names the carrier the number moved to. nanpCarrier comes from numbering-plan data and can be out of date after a port, so prefer dipCarrier.
Does it work for Canadian numbers?
Yes. The API accepts US and Canadian (NANP) numbers in any common format: 10 digits, or 11 digits starting with 1. Numbers outside North America are not supported.
How much does a carrier lookup cost?
One credit. There is no separate carrier fee. The Free plan includes 500 lookups a month, hard-capped; paid plans start at $5 a month for 1,000 lookups, and overage goes down to $0.0009 per lookup on the 500K plan. Failed lookups are not billed.
Can I try it without writing code?
Yes. Run a free check with the demo on the homepage. For a whole list, sign up and upload a CSV from the dashboard: see bulk phone validation.
Related
- Field reference: carrier fields in the docs
- Next step: Line type lookup API (mobile, landline, VoIP)
- Whole lists: Bulk phone validation (CSV upload)
- Compared: CheckThatPhone vs Twilio Lookup
- Background: What is a carrier lookup?
- Background: The North American Numbering Plan