Calls & numbers
Phone number validator and formatter
Coverage: It works for every country, using the numbering-plan data of the open-source libphonenumber library. Numbers typed without + are read as numbers of this edition’s country. NoCall adds Spain’s new 400 range and its 118xx directory numbers, which the library does not describe yet.
Open toolOn this page
Purpose
Check whether a phone number is valid, whether it is a mobile, landline, freephone or premium number, and see it in E.164, national and international format.
Requirements
Anyone can read these guides, no account needed. Some tools require Pro, as indicated in each guide.
Paste any phone number to check whether it is valid, what type of number it is and how to write it in E.164, national and international format.
How to use it
Open tool
Paste any phone number to check whether it is valid, what type of number it is and how to write it in E.164, national and international format.
Check
Read the available fields alongside their limitations. An empty result does not prove safety or identify a person.
Synthetic example
Invented example, not a real lookup. Do not call or open its links.
+44 1632 960123Interpret the result
Read the available fields alongside their limitations. An empty result does not prove safety or identify a person.
It is the international standard for writing a number: a plus sign, the country calling code and the national number, with no spaces or leading zero. Apps and phone systems use it to store numbers.
No. Valid means it belongs to a range that is allocated in the numbering plan. Whether that exact number is connected today is something only the operator knows.
The type belongs to the range, not to the line, and it stays the same when the number moves to another operator. Internet telephony numbers can look like landlines.
Limitations
It works for every country, using the numbering-plan data of the open-source libphonenumber library. Numbers typed without + are read as numbers of this edition’s country. NoCall adds Spain’s new 400 range and its 118xx directory numbers, which the library does not describe yet.
Indicative information from published numbering plans. It describes the type of number, never the person or company behind it.
Troubleshooting
If the input is invalid, check its format and country. Retry connection errors; respect the waiting period when a limit is reached.
Enter a valid phone number or prefix.
We couldn’t check it right now. Please try again in a moment.
Use with the API
Needs an API key and credits. Each completed call costs 1 credit, even when there is no data. An active Pro account includes 20 credits per UTC calendar month, shared by every API route and spent first; unused monthly credits do not roll over. Credits bought on your account page work without Pro and never expire.
Errors are never charged: 401 invalid_api_key (missing or invalid key), 403 pro_required (no Pro credits and no purchased credits), 422 invalid input, 429 quota_exceeded (no credits left), rate_limit_exceeded or ai_busy (the AI of sms-check is at capacity), 503 tool_warming (the data is still being prepared) or tool or provider unavailable. After a 429 or 503, retry once the seconds in the Retry-After header have passed.
Numbering-plan validity, possibility, type, country, calling code and E.164. Any phone-like input is a successful result: valid=false is returned, never an error.
Send the JSON body to the tool's own route, or to POST /v2/tools with the tool field added. Both routes return the same result.
POST https://api.nocall.io/v2/number-validator
POST https://api.nocall.io/v2/tools {"tool":"number-validator","phone":"+12025550123","country":"US"}Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| phone | string (1–40) | Yes | Phone number in E.164 (+34…) or national format. |
| country | string (enum, 56) | No (default: "ES") | Two-letter country code, for example ES or US, used for national input and for the country's data. |
REQUEST_ID="$(uuidgen)" && [ -n "$REQUEST_ID" ] &&
curl --request POST 'https://api.nocall.io/v2/number-validator' \
--header "Authorization: Bearer $NOCALL_API_KEY" \
--header 'Content-Type: application/json' \
--header "Idempotency-Key: $REQUEST_ID" \
--data '{"phone":"+12025550123","country":"US"}'import json
import os
import urllib.request
import uuid
api_key = os.environ.get('NOCALL_API_KEY')
if not api_key:
raise SystemExit('Set NOCALL_API_KEY')
request = urllib.request.Request(
'https://api.nocall.io/v2/number-validator',
method='POST',
data=json.dumps({'phone': '+12025550123', 'country': 'US'}).encode(),
headers={
'Authorization': 'Bearer ' + api_key,
'Content-Type': 'application/json',
'Idempotency-Key': str(uuid.uuid4()),
},
)
with urllib.request.urlopen(request, timeout=30) as response:
result = json.load(response)
print(result['data']['result'], result['meta']['unitsCharged'])import { randomUUID } from 'node:crypto';
const requestId = randomUUID();
const apiKey = process.env.NOCALL_API_KEY;
if (!apiKey) throw new Error('Set NOCALL_API_KEY');
const response = await fetch('https://api.nocall.io/v2/number-validator', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + apiKey,
'Content-Type': 'application/json',
'Idempotency-Key': requestId,
},
body: JSON.stringify({ phone: '+12025550123', country: 'US' }),
});
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code ?? 'request_failed');
console.log(result.data.result, result.meta.unitsCharged);Example response (200)
This is the documented example from the API reference. Lookups use a fictional number, and aggregates and AI answers show the shape of the result, not live data.
{
"data": {
"tool": "number-validator",
"result": {
"valid": true,
"possible": true,
"country": "US",
"callingCode": "1",
"type": "fixed_line_or_mobile",
"e164": "+12025550123"
}
},
"meta": {
"requestId": "req_example",
"unitsCharged": 1,
"usage": {
"periodStart": "2026-10-01",
"unitLimit": 20,
"unitsUsed": 3,
"unitsRemaining": 17
}
}
}Result fields (data.result)
| Field | Type | Description |
|---|---|---|
| valid | boolean | Whether the number is valid in the numbering plan. false is still a completed result. |
| possible | boolean | Whether the number has a possible length for the country. |
| country | string | null | Country of the number (ISO code), or null when it cannot be determined. |
| callingCode | string | null | Calling code of the number's country, or null when it is unknown. |
| type | string (enum, 14) | Number type from the numbering plan, such as mobile, fixed_line, toll_free or premium_rate; unknown when it cannot be classified. |
| e164 | string | null | The number in E.164 format, or null when it cannot be formatted. |
Frequently asked questions
What is the E.164 format?
It is the international standard for writing a number: a plus sign, the country calling code and the national number, with no spaces or leading zero. Apps and phone systems use it to store numbers.
Does a valid number mean it is in use?
No. Valid means it belongs to a range that is allocated in the numbering plan. Whether that exact number is connected today is something only the operator knows.
Can a number change from mobile to landline?
The type belongs to the range, not to the line, and it stays the same when the number moves to another operator. Internet telephony numbers can look like landlines.
