NumVerify alternative: phone validation plus 150 endpoints
You're paying NumVerify $14.99/month to validate phone numbers. One endpoint. When your checkout form also needs email validation and your fraud pipeline needs IP geolocation, you'll add two more subscriptions, two more API keys, and two more billing dashboards. NumVerify is part of the APILayer family (same parent as ipstack, mailboxlayer, Fixer.io), and each product bills separately.
Botoi's /v1/phone endpoint validates and normalizes phone numbers from 30+
countries into E.164 format. It's one of 150+ endpoints included in every plan. Phone
validation, email verification, IP geolocation, DNS lookups, VPN detection; all under a
single key starting at $0/month.
Side by side: NumVerify vs botoi
NumVerify uses a GET request with the API key as a query parameter. The free tier is HTTP-only; HTTPS requires a paid plan. Botoi uses a POST request with Bearer auth over HTTPS on every tier, including free.
NumVerify request
curl "http://apilayer.net/api/validate?access_key=YOUR_KEY&number=14155552671" Response:
{
"valid": true,
"number": "14155552671",
"local_format": "4155552671",
"international_format": "+14155552671",
"country_prefix": "+1",
"country_code": "US",
"country_name": "United States of America",
"location": "California",
"carrier": "AT&T Mobility LLC",
"line_type": "mobile"
} Botoi request
curl -X POST https://api.botoi.com/v1/phone \
-H "Content-Type: application/json" \
-d '{"phone": "+14155552671"}' Response:
{
"success": true,
"data": {
"phone": "+14155552671",
"valid": true,
"country_code": "+1",
"country": "United States / Canada",
"e164_format": "+14155552671",
"national_format": "4155552671"
}
} Response field comparison
Both APIs return validity, country, and formatted numbers. The key difference is what NumVerify includes that botoi doesn't, and what botoi's broader platform adds.
| Field | NumVerify | Botoi |
|---|---|---|
| Valid flag | Yes | Yes |
| E.164 format | Yes (international_format) | Yes (e164_format) |
| National format | Yes (local_format) | Yes (national_format) |
| Country code | Yes | Yes |
| Country name | Yes | Yes |
| Location (state/region) | Yes | No |
| Carrier name | Yes | No |
| Line type (mobile/landline/VoIP) | Yes | No |
| HTTPS on free tier | No | Yes |
| HTTP method | GET (key in URL) | POST (Bearer auth) |
NumVerify returns carrier and line type, which matters for SMS routing. Botoi returns the same validation and formatting fields but skips carrier data in favor of covering 150+ other endpoint categories under the same key.
UK number example
curl -X POST https://api.botoi.com/v1/phone \
-H "Content-Type: application/json" \
-d '{"phone": "+442071234567"}' Response:
{
"success": true,
"data": {
"phone": "+442071234567",
"valid": true,
"country_code": "+44",
"country": "United Kingdom",
"e164_format": "+442071234567",
"national_format": "2071234567"
}
} Pricing comparison
| Plan | NumVerify | Botoi |
|---|---|---|
| Free | 100 req/month, HTTP only, phone only | 100 req/day, HTTPS, all 150+ endpoints, no signup |
| Basic / Starter | $14.99/mo, 5,000 req, phone only | $9/mo, 300,000 req, all endpoints |
| Pro | $49.99/mo, 50,000 req, phone only | $29/mo, 1,000,000 req, all endpoints |
| Enterprise | $99.99/mo, 250,000 req, phone only | $49/mo, 3,000,000 req, all endpoints |
NumVerify's $14.99/month Basic plan gives you 5,000 phone validation requests. Botoi's $9/month Starter plan gives you 300,000 requests across phone validation, email verification, IP geolocation, DNS lookups, and every other endpoint. The math gets more lopsided as you add capabilities.
NumVerify's free tier sends your API key in the URL over plain HTTP. That means your key is visible in server logs, proxy logs, and browser history. Botoi uses POST with Bearer auth over HTTPS on every tier.
What else you get with one botoi key
NumVerify gives you one API for phone validation. A botoi key unlocks 150+ endpoints. Here are the ones most relevant to the same workflows where you'd use phone validation:
- Email validation (
/v1/email/validate) checks syntax, verifies MX records, and flags disposable providers. The same signup form that validates a phone number can validate the email in the same request batch. - Disposable email detection (
/v1/disposable-email/check) catches throwaway addresses from Guerrilla Mail, Mailinator, and 5,000+ other providers. - IP geolocation (
/v1/ip/lookup) returns city, region, country, coordinates, and timezone for the caller's IP. Use it for currency defaults and GDPR compliance checks. - VPN detection (
/v1/vpn-detect) flags VPN, proxy, Tor, and datacenter connections with a risk score. Important for fraud prevention at signup. - DNS security (
/v1/dns-security/spf-check,/v1/dns-security/dmarc-check) audits email authentication records for any domain.
On NumVerify's pricing model, adding email validation means subscribing to mailboxlayer ($14.99/month). Adding IP geolocation means subscribing to ipstack ($9.99/month). Each new capability is a new API key, a new dashboard, and a new line item on your invoice. With botoi, it's the same key and the same monthly bill.
Migration: swap NumVerify for botoi in Express
Here's a typical signup route using NumVerify, followed by the same route using botoi. The migration involves three changes: HTTP method (GET to POST), URL, and response field names.
Before (NumVerify)
// BEFORE: NumVerify (GET, HTTP only on free tier)
app.post("/signup", async (req, res) => {
const phone = req.body.phone.replace(/[^0-9]/g, "");
const numverify = await fetch(
`http://apilayer.net/api/validate?access_key=${NUMVERIFY_KEY}&number=${phone}`
).then((r) => r.json());
if (!numverify.valid) {
return res.status(422).json({ error: "Invalid phone number" });
}
await db.users.create({
phone: numverify.international_format,
carrier: numverify.carrier,
country: numverify.country_name,
});
res.status(201).json({ ok: true });
}); After (botoi)
// AFTER: Botoi (POST, HTTPS, no API key needed for free tier)
app.post("/signup", async (req, res) => {
const phone = req.body.phone;
const botoi = await fetch("https://api.botoi.com/v1/phone", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ phone }),
}).then((r) => r.json());
if (!botoi.data.valid) {
return res.status(422).json({ error: "Invalid phone number" });
}
await db.users.create({
phone: botoi.data.e164_format,
country: botoi.data.country,
});
res.status(201).json({ ok: true });
});
The botoi version drops the regex sanitization step because the API handles spaces,
dashes, and parentheses in the input. You send the raw user input with a +
prefix and get back a clean E.164 string. The carrier field is gone; if you
were storing it but not using it for routing decisions, you won't miss it.
Combine phone, email, and fraud checks in one function
The single-key model pays off when a signup form needs multiple validations. This function runs four checks in parallel with one API key:
const BOTOI = "https://api.botoi.com/v1";
const headers = {
"Content-Type": "application/json",
"Authorization": `Bearer ${process.env.BOTOI_API_KEY}`,
};
async function validateSignup(email, phone, ip) {
const [emailCheck, phoneCheck, disposableCheck, vpnCheck] =
await Promise.all([
fetch(`${BOTOI}/email/validate`, {
method: "POST",
headers,
body: JSON.stringify({ email }),
}).then((r) => r.json()),
fetch(`${BOTOI}/phone`, {
method: "POST",
headers,
body: JSON.stringify({ phone }),
}).then((r) => r.json()),
fetch(`${BOTOI}/disposable-email/check`, {
method: "POST",
headers,
body: JSON.stringify({ email }),
}).then((r) => r.json()),
fetch(`${BOTOI}/vpn-detect`, {
method: "POST",
headers,
}).then((r) => r.json()),
]);
return {
emailValid: emailCheck.data.valid,
disposable: disposableCheck.data.disposable,
phoneValid: phoneCheck.data.valid,
phoneE164: phoneCheck.data.e164_format,
phoneCountry: phoneCheck.data.country,
vpn: vpnCheck.data.isVpn,
riskScore: vpnCheck.data.riskScore,
};
}
// One key, four checks, one billing dashboard
const result = await validateSignup(
"buyer@company.io",
"+14155552671",
"203.0.113.42"
);
console.log(result); On NumVerify + mailboxlayer + ipstack, this function would need three API keys from three dashboards. On botoi, it's one key, one bill, one quota that covers all four endpoints.
When to stay with NumVerify
NumVerify is the better choice in two scenarios:
- You need carrier detection for SMS routing. If your app picks between
Twilio and a local SMS gateway based on the carrier (e.g., routing AT&T numbers
through one provider and T-Mobile through another), NumVerify's
carrierandline_typefields are essential. Botoi doesn't return carrier data. - You need line type classification. If your product charges differently
for mobile vs landline vs VoIP numbers (common in telecommunications billing), NumVerify's
line_typefield drives that logic. Botoi tells you the number is valid but not whether it's a mobile or landline.
If your use case is "validate the format, normalize to E.164, and detect the country," botoi covers it. If your use case is "determine the carrier and line type for routing decisions," NumVerify has deeper data for that axis.
You can also mix both: use botoi for the 150+ endpoints where it matches or exceeds NumVerify's coverage, and keep NumVerify for carrier-specific lookups if that data drives business logic in your app.
Key points
- NumVerify charges $14.99/month for 5,000 phone validation requests over a single endpoint. Its free tier caps at 100 requests/month with no HTTPS.
-
Botoi's
/v1/phoneendpoint returns the same validation and E.164 formatting. The free tier includes 100 requests/day over HTTPS with no signup. - Botoi's $9/month plan includes 300,000 requests across all 150+ endpoints. NumVerify's $14.99/month plan includes 5,000 requests for phone validation only.
- NumVerify returns carrier name and line type. Botoi doesn't. If carrier detection drives SMS routing in your app, NumVerify is more specialized.
- The bigger win is consolidation. Phone validation, email verification, IP geolocation, VPN detection, DNS security, and 145 more endpoints under one API key and one invoice.
Frequently asked questions
- Is there a free alternative to NumVerify for phone validation?
- Yes. Botoi's /v1/phone endpoint validates international phone numbers and returns E.164 format, national format, country code, and country name. The free tier allows 5 requests per minute and 100 requests per day over HTTPS with no signup required. NumVerify's free plan caps at 100 requests per month and restricts you to HTTP.
- Does botoi return carrier data like NumVerify?
- No. NumVerify returns carrier name (e.g., AT&T Mobility) and line type (mobile, landline, VoIP). Botoi's /v1/phone endpoint focuses on validation and E.164 normalization. If carrier detection drives your SMS routing logic, NumVerify provides deeper data for that specific use case.
- What phone number format does botoi expect?
- Botoi's /v1/phone endpoint expects numbers in international format starting with a + prefix and the country code. For example, +14155552671 for the US or +442071234567 for the UK. Numbers without a + prefix return valid: false with a note explaining the expected format.
- How many requests does botoi's free tier include?
- The free tier allows 5 requests per minute and 100 requests per day across all endpoints with IP-based rate limiting. No API key, no signup, and no credit card required. Paid plans start at $9/month for 300,000 requests across all 150+ endpoints.
- Can I replace NumVerify with botoi without changing my backend?
- You'll need to update the HTTP method (POST instead of GET), the URL (api.botoi.com/v1/phone), and the response field names (e164_format instead of international_format, country instead of country_name). The migration takes 10-15 minutes per integration point. A code example is included in this guide.
Try this API
Phone Validation API — interactive playground and code examples
More guide posts
Start building with botoi
150+ API endpoints for lookup, text processing, image generation, and developer utilities. Free tier, no credit card.