What a Carrier Lookup Returns
A standard phone carrier lookup returns the network operator assigned to the number. VeriRouteIntel goes further: every lookup also returns the messaging provider — the actual platform routing SMS traffic for that number (Twilio, Bandwidth, Sinch, etc.). This distinction matters for SMS deliverability, sender ID compliance, and fraud filtering.
| Field | Type | Description |
|---|---|---|
carrier |
string | Network operator (e.g., "T-Mobile USA") |
carrier_type |
string | "mobile", "landline", or "voip" |
messaging_provider |
string | SMS routing platform (e.g., "Twilio", "Bandwidth") |
line_type |
string | "mobile", "landline", "voip", "toll-free", "unknown" |
ported |
boolean | Whether the number has been number-ported |
lrn |
string | Local Routing Number (post-port routing code) |
mcc |
string | Mobile Country Code |
mnc |
string | Mobile Network Code |
country |
string | ISO 3166-1 alpha-2 country code |
phone |
string | Queried number in E.164 format |
Step 1: Get a Free API Key
Sign up at verirouteintel.com — your free account includes 10 free lookups, no credit card required. Copy your API key from the dashboard.
Step 2: Install Dependencies
All you need is the Python requests library:
pip install requests
Or, if you prefer a zero-boilerplate SDK with built-in retry logic:
pip install vri-sdk
Step 3: Make Your First Carrier Lookup
Pass your phone number in E.164 format (e.g., +12125551234) and your API key as a header:
import requests
API_KEY = "your_api_key_here"
PHONE = "+12125551234"
response = requests.get(
"https://api.verirouteintel.com/v1/lookup",
params={"phone": PHONE},
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=5,
)
response.raise_for_status()
data = response.json()
print(f"Carrier: {data['carrier']}")
print(f"Messaging Provider: {data['messaging_provider']}")
print(f"Line Type: {data['line_type']}")
print(f"Ported: {data['ported']}")
Step 4: Full JSON Response Example
Here's what a successful lookup looks like for a ported mobile number:
{
"phone": "+12125551234",
"carrier": "T-Mobile USA",
"carrier_type": "mobile",
"messaging_provider": "Twilio",
"line_type": "mobile",
"ported": true,
"lrn": "2125550000",
"mcc": "310",
"mnc": "260",
"country": "US"
}
Note "ported": true — the original carrier may have been AT&T, but the number now routes through T-Mobile. Without a live LRN dip, SMS sent to the original routing path will fail or be delayed. VeriRouteIntel performs a live LRN query on every lookup, so you always get the current carrier, not the carrier of record.
Step 5: Error Handling
Production code needs to handle invalid numbers, exhausted quotas, and transient network failures:
import requests
from requests.exceptions import HTTPError, Timeout, RequestException
API_KEY = "your_api_key_here"
def lookup_carrier(phone: str) -> dict | None:
try:
response = requests.get(
"https://api.verirouteintel.com/v1/lookup",
params={"phone": phone},
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=5,
)
response.raise_for_status()
return response.json()
except HTTPError as e:
status = e.response.status_code
if status == 400:
print(f"Invalid phone number: {phone}")
elif status == 401:
print("Invalid or missing API key.")
elif status == 402:
print("Lookup quota exhausted. Upgrade your plan.")
elif status == 429:
print("Rate limit hit. Retry after 1 second.")
else:
print(f"API error {status}: {e}")
except Timeout:
print(f"Request timed out for {phone}. Retry with backoff.")
except RequestException as e:
print(f"Network error: {e}")
return None
# Example usage
result = lookup_carrier("+12125551234")
if result:
print(result)
Using the VRI Python SDK
If you're running high-volume lookups or want retry logic and connection pooling handled for you, use the SDK:
from vri import Client
client = Client(api_key="your_api_key_here")
result = client.lookup("+12125551234")
print(result.carrier) # "T-Mobile USA"
print(result.messaging_provider) # "Twilio"
print(result.line_type) # "mobile"
print(result.ported) # True
The SDK supports batch lookups and async execution — useful when validating thousands of numbers before a campaign send:
import asyncio
from vri import AsyncClient
async def validate_list(numbers: list[str]) -> list[dict]:
async with AsyncClient(api_key="your_api_key_here") as client:
results = await client.lookup_batch(numbers)
return results
numbers = ["+12125551234", "+13105559876", "+14155553210"]
asyncio.run(validate_list(numbers))
Free API key — 10 free lookups included, no credit card required.
Get your free API keyCarrier vs. Messaging Provider: Why Both Matter
Most carrier lookup APIs — including Twilio Lookup — return the network operator. For call routing, that's enough. For SMS, it's not.
When a business sends an SMS through a CPaaS platform, the message travels through a messaging provider (Bandwidth, Twilio, Sinch, etc.) before reaching the carrier network. TCPA compliance, sender ID verification, and spam filtering all operate at the messaging provider layer, not the carrier layer.
- Use carrier data for: call routing, LRN-based billing, voicemail detection
- Use messaging provider data for: SMS deliverability optimization, 10DLC compliance routing, spam risk scoring, fraud detection
At $0.0009 per lookup, you can validate every number before it touches your send queue.
Frequently Asked Questions
What is the difference between a phone carrier lookup and a messaging provider lookup?
A carrier lookup returns the network operator that owns the phone number (e.g., T-Mobile, Verizon). A messaging provider lookup identifies the SMS routing platform for that number — Twilio, Bandwidth, Sinch, etc. Carrier data routes calls; messaging provider data routes SMS and determines compliance requirements. VeriRouteIntel returns both in a single API call.
Can I look up ported numbers in Python?
Yes. VeriRouteIntel performs a live LRN dip on every request, detecting ported numbers in real time. The ported field in the response is True when a number has been transferred between carriers. The carrier field always reflects the current carrier — not the original — so your routing logic stays accurate even for numbers that have changed hands multiple times.
How fast is the VeriRouteIntel carrier lookup API?
Lookups return in under 200ms at p99. The API is built for real-time validation at scale — CPaaS providers use it inline during message send, not as a pre-send batch job. If you need sub-100ms latency for a specific region, contact us about edge routing options.
Is there a Python SDK for VeriRouteIntel?
Yes. Install with pip install vri-sdk. The SDK includes synchronous and async clients, connection pooling, automatic retry on rate limits, and type hints throughout. See the full SDK docs.