SwitchfromTwilioLookupto1LookupbyChangingOneURLandOneKey
Move your Twilio Lookup v2 calls to 1Lookup by changing the base URL and the key. Same JSON back, 1 credit for a US lookup, code in curl, Node and Python.
Robby Frank
CEO & Founder

Table of Contents
1Lookup answers the Twilio Lookup v2 API, so you can move your calls by changing the base URL and the key. Your requests keep their path and their Fields parameter, and the JSON that comes back keeps the field names your code already reads.
For a US or Canadian number, carrier, line type and line status come back in one request for 1 credit. That is $0.00495 on the Starter plan, against $0.015 for Twilio's Line Type Intelligence and Line Status packages together, as priced on Twilio's own Lookup pricing page on 30 October 2026. Start a 7-day free trial and run your own numbers, or read the side-by-side comparison.
The short version is one base URL, one key and the same Lookup v2 JSON.
Six facts cover the whole switch:
- New base URL:
https://app.1lookup.io/api/compat/twilioreplaceshttps://lookups.twilio.com. - Key: your 1Lookup API key goes in the Basic-auth password. The username is ignored, so your account SID can stay, and
Authorization: Bearer <key>works too. - Request:
GET /v2/PhoneNumbers/{number}?Fields=...&CountryCode=..., exactly as you send it today. - Fields answered:
validation,line_type_intelligence,line_statusandcaller_name. - Cost: 1 credit for validation, 1 credit for line type and line status together on US and Canadian numbers, and 10 credits for a US caller name.
- Free trial: the 7-day trial includes API access.
Everything else in your integration stays: the GET method, the Fields and CountryCode parameters, the /v2/PhoneNumbers/{number} path and the snake_case names in the answer, such as line_type_intelligence.carrier_name and line_status.status.
You can migrate from Twilio Lookup in four steps.
- Start the free trial and copy your API key. Create your account and copy a key from the dashboard. It starts with
sk_live_, and API access is included during the trial. - Change the base URL. Replace
https://lookups.twilio.comwithhttps://app.1lookup.io/api/compat/twilioand keep the rest of the path. - Put the key where the auth token was. Use it as the Basic-auth password, and leave the account SID as the username.
- Send one number and read the credit headers. Every answer carries
X-1Lookup-Credits-UsedandX-1Lookup-Credits-Remaining, so you see what the call cost and what is left.
In curl, you change the host and the password.
curl -i -u "$TWILIO_ACCOUNT_SID:$ONELOOKUP_API_KEY" \
"https://app.1lookup.io/api/compat/twilio/v2/PhoneNumbers/+14155550142?Fields=line_type_intelligence,line_status"
The -i flag prints the response headers, where the two credit headers sit.
In Node, you change the base URL and the key.
// Unchanged, the username is ignored
const SID = process.env.TWILIO_ACCOUNT_SID
// Was TWILIO_AUTH_TOKEN
const KEY = process.env.ONELOOKUP_API_KEY
// Was 'https://lookups.twilio.com'
const BASE = 'https://app.1lookup.io/api/compat/twilio'
const url = `${BASE}/v2/PhoneNumbers/+14155550142?Fields=line_type_intelligence,line_status`
const res = await fetch(url, {
headers: { Authorization: `Basic ${btoa(`${SID}:${KEY}`)}` },
})
console.log('credits used:', res.headers.get('X-1Lookup-Credits-Used'))
const info = await res.json()
console.log(info.line_type_intelligence.carrier_name, info.line_type_intelligence.type)
console.log(info.line_status.status)
In Python, you change the same two values.
import os
import requests
# Unchanged, the username is ignored
SID = os.environ["TWILIO_ACCOUNT_SID"]
# Was TWILIO_AUTH_TOKEN
KEY = os.environ["ONELOOKUP_API_KEY"]
# Was "https://lookups.twilio.com"
BASE = "https://app.1lookup.io/api/compat/twilio"
res = requests.get(
f"{BASE}/v2/PhoneNumbers/+14155550142",
params={"Fields": "line_type_intelligence,line_status"},
auth=(SID, KEY),
timeout=10,
)
res.raise_for_status()
info = res.json()
print("credits used:", res.headers.get("X-1Lookup-Credits-Used"))
print(info["line_type_intelligence"]["carrier_name"], info["line_type_intelligence"]["type"])
print(info["line_status"]["status"])
Swap in one of your own numbers to see a real answer.
Twilio Lookup API pricing charges each package separately, and 1Lookup charges 1 credit for the common ones.
Twilio prices Lookup by package. Formatting and validation are free, Line Type Intelligence is $0.008 a request, Line Status starts at $0.007 a query, and Inbound Caller Identification is $0.01 a request for US numbers. Ask one number for its line type and its status and you pay for both, which is $0.015.
1Lookup answers carrier, line type and line status for a US or Canadian number with one product, so the request is 1 credit. A credit costs $0.00495 on the Starter plan and falls to $0.001999 on Enterprise.
Twilio's figures are the ones on its Lookup pricing page, read on 30 October 2026. Line Status is priced in volume tiers, and $0.007 is the first tier, up to 100,000 queries a month. 1Lookup's figures are each plan's price divided by its credits: $99 for 20,000 credits on Starter, $299 for 85,000 on Growth, $799 for 250,000 on Professional and $1,999 for 1,000,000 on Enterprise.
On a monthly bill, using every credit a plan includes on US numbers:
| US numbers a month | Twilio line type at $0.008 | 1Lookup line type and status |
|---|---|---|
| 20,000 | $160 | $99 on Starter |
| 85,000 | $680 | $299 on Growth |
| 250,000 | $2,000 | $799 on Professional |
| 1,000,000 | $8,000 | $1,999 on Enterprise |
The Twilio column counts Line Type Intelligence alone. Adding its Line Status package adds $0.007 a number at the first tier, and the 1Lookup column already includes line status.
Repeating a lookup you ran yourself inside the 7-day cache window is normally free on 1Lookup, and a number that is not valid costs nothing. Twilio's packages are priced per request or per query.
1Lookup answers four Lookup v2 fields and prices each one in credits.
| Lookup v2 field | Credits | What 1Lookup returns |
|---|---|---|
validation |
1 | Number format and validity, also the default with no Fields |
line_type_intelligence |
1 for US and Canada, 3 elsewhere | Carrier name and line type |
line_status |
1 for US and Canada, 5 elsewhere | Whether the line is active |
| Both of the above | 1 for US and Canada, 5 elsewhere | Line type and line status from one check |
caller_name |
10, free when no name is on record | Caller ID name of a US number, person or business |
Outside the US and Canada, line status includes a network check of the handset.
Credits are the same ones you use for phone, email and IP checks on one balance, so a Lookup v2 call and a carrier lookup draw from the same pool. A request that asks for several fields is charged once per check that runs, which is why line type and line status together cost the same 1 credit as either alone on a US number.
Line types arrive in Twilio's vocabulary: mobile, landline, nonFixedVoip, tollFree and the rest of the Lookup v2 list. Line status arrives as active, reachable, unreachable, inactive or unknown.
A field 1Lookup does not answer comes back in Twilio's shape, so your parsing code keeps working.
Here is a full answer for a US number with Fields=line_type_intelligence,line_status. Packages you did not ask for are null, as in Lookup v2, and the key order matches Twilio's.
{
"calling_country_code": "1",
"country_code": "US",
"phone_number": "+14155550142",
"national_format": "(415) 555-0142",
"valid": true,
"validation_errors": null,
"caller_name": null,
"sim_swap": null,
"call_forwarding": null,
"line_status": {
"status": "active",
"error_code": null
},
"line_type_intelligence": {
"mobile_country_code": null,
"mobile_network_code": null,
"carrier_name": "Example Wireless",
"type": "mobile",
"error_code": null
},
"identity_match": null,
"reassigned_number": null,
"sms_pumping_risk": null,
"phone_number_quality_score": null,
"pre_fill": null,
"url": "https://app.1lookup.io/api/compat/twilio/v2/PhoneNumbers/+14155550142"
}
A package you ask for and 1Lookup cannot answer comes back as its own object with every value null and error_code 60600, which is Twilio's code for no information. It never carries an invented value and it is never charged. This is the sim_swap object, for example:
"sim_swap": {
"last_sim_swap": null,
"carrier_name": null,
"mobile_country_code": null,
"mobile_network_code": null,
"error_code": 60600
}
What comes back, case by case:
- A package left out of
Fields:null, as in Lookup v2, and nothing is charged for it. sim_swap,call_forwarding,identity_match,reassigned_number,sms_pumping_risk,phone_number_quality_scoreorpre_fill: an object with every valuenullanderror_code60600, at no charge for the package.caller_nameon a US number with no name on record:caller_nameandcaller_typearenull,error_codeis 60600, and the lookup is free.caller_nameon a number outside the US: the same 60600 answer, for the 1 credit the validity check costs.line_type_intelligenceon a US or Canadian number:carrier_nameandtypeare filled, andmobile_country_codeandmobile_network_codearenull.- A number that is not valid: HTTP 200 with
validset tofalse, the reasons invalidation_errors, every packagenulland no charge.
The identity inputs Lookup v2 accepts, such as FirstName, LastName, AddressLine1, NationalId and DateOfBirth, are accepted and ignored. They are never read, passed on or logged.
Errors keep Twilio's format, so your error handling keeps working.
Every error is a JSON body with Twilio's code, message, more_info and status, and the HTTP status matches.
| What went wrong | HTTP status | Twilio code |
|---|---|---|
| Key missing, wrong or disabled | 401 | 20003 |
| Too few credits | 403 | 20403 |
| No active trial or paid plan | 403 | 20403 |
A Fields value Lookup v2 does not have |
400 | 60618 |
| Rate limited | 429 | 20429 |
| Credit check busy, nothing charged, retry | 503 | 20503 |
| Any other fault on 1Lookup's side | 500 | 20500 |
A 401 carries a WWW-Authenticate header, and a 429 passes the Retry-After header through. The two 403 cases carry different messages, one about credits and one about the plan, so a retry rule can tell them apart.
You can test the switch on your own numbers before you move any traffic.
Run a sample of your real numbers through both APIs for a day and compare line_type_intelligence.type and carrier_name side by side. The free trial runs 7 days and includes trial credits ($5 on Starter, $20 on Growth, Professional and Enterprise), so a first comparison costs nothing.
When the two agree, change the base URL and the key in your configuration and deploy. A rollback is the same two values in the other direction.
Moving from Vonage Number Insight instead? The same one-URL swap works there, and the steps are on the Vonage comparison page. For more on what a carrier lookup returns, see the carrier lookup API guide, and for lists of numbers rather than single calls, see bulk phone validation.
These are the questions teams ask before they switch.
What is a good Twilio Lookup alternative?
1Lookup is a Twilio Lookup alternative for teams that want to keep their Lookup v2 code. It answers the same request and returns the same JSON, charges 1 credit for carrier, line type and line status on a US or Canadian number, and runs email and IP checks on the same key and the same credit balance.
How do I migrate from Twilio Lookup to 1Lookup?
Change the base URL to https://app.1lookup.io/api/compat/twilio and put your 1Lookup API key in the Basic-auth password. The path, the Fields and CountryCode parameters and the response field names stay the same. The four steps and the curl, Node and Python code are above.
How much does the Twilio Lookup API cost compared with 1Lookup?
Twilio charges per package: formatting and validation are free, Line Type Intelligence is $0.008 a request, Line Status is $0.007 a query at its first tier, and caller identification is $0.01 a request for US numbers. 1Lookup charges 1 credit for line type and line status together on a US or Canadian number, which is $0.00495 on Starter and $0.001999 on Enterprise. Twilio's prices were read on 30 October 2026.
Which Lookup v2 fields does 1Lookup answer?
Four: validation, line_type_intelligence, line_status and caller_name. Validation is 1 credit. Line type and line status are 1 credit each, or 1 together, for US and Canadian numbers, and 3 and 5 credits elsewhere. Caller name is 10 credits for a US number and free when no name is on record.
What does 1Lookup return for the Twilio fields it does not answer?
The packages sim_swap, call_forwarding, identity_match, reassigned_number, sms_pumping_risk, phone_number_quality_score and pre_fill come back in Twilio's shape with every value null and error_code 60600, at no charge, so your parsing code does not break.
Do I keep my Twilio account SID?
Yes. The username in the Basic-auth header is ignored, so your SID can stay in your code or your configuration. A Bearer header with your 1Lookup key works as well.
What are the rate limits?
The same as any 1Lookup API call: 200 requests per 10 seconds for each API key on standard lookups and 1,000 requests a minute for each key on number type, HLR and MNP, and each account can make up to 1,000 requests a minute in total across all its keys. Higher limits are available on request. A limited request comes back as Twilio error 20429 with a Retry-After header.
Can I try 1Lookup before I switch?
Yes. Start a 7-day free trial, which includes API access, and send the same numbers you send to Twilio today. See the pricing page for every plan.
Meet the Expert Behind the Insights
Real-world experience from building and scaling B2B SaaS companies

Robby Frank
Head of Growth at 1Lookup
"Calm down, it's just life"
About Robby
Self-taught entrepreneur and technical leader with 12+ years building profitable B2B SaaS companies. Specializes in rapid product development and growth marketing with 1,000+ outreach campaigns executed across industries.
Author of "Evolution of a Maniac" and advocate for practical, results-driven business strategies that prioritize shipping over perfection.