Carrier lookup API with live HLR data
A carrier lookup API that returns the real current network, line type and porting status for any number. Route SMS by facts instead of prefixes, stop paying to message dead lines, and catch a SIM swap before it costs an account.
{
"live_status": "LIVE",
"telephone_number_type": "MOBILE",
"original_network_details": {
"name": "O2 (UK)", "mccmnc": "23410"
},
"current_network_details": {
"name": "EE Limited (T-Mobile)", "mccmnc": "23430"
},
"is_ported": "YES",
"ported_date": "NOT_AVAILABLE",
"timestamp": "2026-09-16T13:06:15Z"
}
Live
registry answers on every call. Not a prefix table that was right last year.
2
networks per response: the original one and the one the number is on today.
$25
per month to start, on the same plans as the Caller ID API. Volume pricing as you scale.
One lookup, three expensive problems
Every response carries network, line type and portability together, so one request covers routing, validation and fraud.
Cheaper SMS routing
Prefix routing sends a ported number to the wrong carrier and bills you for the failure. Landlines and dead lines get messages that can never arrive. Route by the current network from the response, skip anything that is not LIVE and MOBILE, and the failed-delivery line on the invoice shrinks.
Pairs with the VoIP caller ID API when you also need the name behind the number.
Number validation at signup
Live status, line type and timezone before the account exists. Fake and unreachable numbers never make it into your database or your OTP costs.
SIM-swap signals
A fresh port with a carrier change is the classic account takeover tell. It is in every response, ready for your risk engine to step up verification.
Need OCN, SPID and LRN too?
Add ?hlr=true to a Caller ID API lookup and the HLR block comes back with the spam verdict and business identity in the same response. HLR stays opt-in, so you only pay for it on the calls that need it.
A prefix tells you where a number was born. Not where it lives.
Number portability broke prefix routing years ago. A +44 7540 number that started on one network can be on another today, and the prefix will never tell you. The live lookup asks the registry and returns both networks, so your routing table stops guessing.
The same answer feeds your fraud stack. A number that ported yesterday and is now asking to reset a password deserves a harder look.
| Prefix table | Live carrier lookup | |
|---|---|---|
| Ported number | Wrong carrier | Current network, ported flag |
| Dead or unassigned line | Looks valid | Live status says otherwise |
| Landline vs mobile | Guess by range | Number type per response |
| SIM-swap signal | None | Ported date and carrier change |
| Cost | Free, then failed deliveries | One credit per lookup |
$ curl -sH "x-auth: $API_KEY" \
https://callerapi.com/api/network-lookup/+447540822872 \
| jq '.data | {live_status, telephone_number_type,
network: .current_network_details.name, is_ported}'
{
"live_status": "LIVE",
"telephone_number_type": "MOBILE",
"network": "EE Limited (T-Mobile)",
"is_ported": "YES"
}
One request before the send, the signup or the reset
Call it from the SMS router, the signup form or the risk engine. Same key as the Caller ID API, one credit per lookup, JSON you can branch on in one line.
Numbers go in as +E.164 or plain digits. The response tells you whether to send, which network to send through, and whether the number changed hands recently.
Reverse phone lookup API on the same key
The carrier lookup API tells you where a number lives. The reverse phone lookup API tells you who is behind it. Both answer with the same key and the same credit.
Send a number to /api/lookup and get the business name, industry, city and country from directories in 195 countries, plus the spam verdict and the complaint count behind it. Add ?hlr=true and the carrier, line type and ported status ride along in one response.
Typical uses: a phone number lookup API for signup forms, a reverse lookup for support consoles, and a name source for branded caller ID. Numbers go in as +E.164.
$ curl -sH "x-auth: $API_KEY" \
"https://callerapi.com/api/lookup/+18883578668?hlr=true" \
| jq '.data | {name: .business_info.business_name,
city: .business_info.city, reputation,
carrier: .carrier_info.network.carrier}'
{
"name": "CallerAPI LC",
"city": "Middletown",
"reputation": "VERIFIED",
"carrier": "Bandwidth.com"
}
Carrier lookup API questions
Route by facts, not prefixes
Self-serve plans from $25 a month. Sending millions of messages? We will price a volume deal.