SMS & messages
Should I call the number in this message?
Coverage: Finds the valid numbers of any country in the text, with or without an international prefix (numbers without one are read as numbers of this edition), and checks against the published numbering plans whether they are premium-rate, shared-cost, toll-free, from another country or a satellite network, and whether their calling code appears in missed-call scams. Checks up to 10 numbers per message.
Open toolOn this page
Purpose
Paste a text, email or letter that asks you to call a number and check first whether it’s premium-rate, from another country or a satellite network.
Requirements
Anyone can read these guides, no account needed. Some tools require Pro, as indicated in each guide.
Many scams don’t include a link: they ask you to call (“call to cancel the charge”, “contact our fraud department”). Paste the message and we check every number before you dial.
How to use it
Message with the number
Check numbers
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.
Your account is locked, call +44 1632 960123Interpret the result
Don’t call this number: The message sends you to an expensive number or one from a typical scam origin. If it claims to be from a company or an authority, find their number on their official website, your contract or your card, and call that one.
Check before you call: It’s a number from another country or a shared-cost number: calling may cost more than usual, and a message asking you to call a foreign number deserves suspicion.
No expensive number and no suspicious origin: That doesn’t prove the message is genuine: scammers also use ordinary and toll-free numbers. If it claims to be from a company, call the number on its official website, not the one in the message.
Limitations
The text is processed on NoCall’s server only to find the numbers and is not stored. This is indicative information from published numbering plans: it describes the type of number, never the person or company using it.
Troubleshooting
We didn’t find a valid phone number in the text. If it’s incomplete or mistyped, search for it on NoCall exactly as it appears.
The text is too long: paste 2,000 characters at most.
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.
Every valid phone number in a pasted SMS, email or letter (up to 10), with its type, what calling it costs, whether it is foreign and its wangiri verdict, plus signals such as a request to call or a forwarding code. Nothing is stored.
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/callback-number
POST https://api.nocall.io/v2/tools {"tool":"callback-number","text":"Your account is locked. Call us now on 0909 879 0000 or +216 71 123 456","country":"GB"}Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| text | string (1–2000) | Yes | The pasted SMS, email or letter, up to 2000 characters. Numbers written without + or 00 are read as national numbers of country. |
| 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/callback-number' \
--header "Authorization: Bearer $NOCALL_API_KEY" \
--header 'Content-Type: application/json' \
--header "Idempotency-Key: $REQUEST_ID" \
--data '{"text":"Your account is locked. Call us now on 0909 879 0000 or +216 71 123 456","country":"GB"}'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/callback-number',
method='POST',
data=json.dumps({'text': 'Your account is locked. Call us now on 0909 879 0000 or +216 71 123 456', 'country': 'GB'}).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/callback-number', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + apiKey,
'Content-Type': 'application/json',
'Idempotency-Key': requestId,
},
body: JSON.stringify({ text: 'Your account is locked. Call us now on 0909 879 0000 or +216 71 123 456', country: 'GB' }),
});
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": "callback-number",
"result": {
"numbers": [
{
"e164": "+449098790000",
"country": "GB",
"type": "premium_rate",
"category": "premium",
"risk": "high",
"international": false,
"wangiri": null
},
{
"e164": "+21671123456",
"country": "TN",
"type": "fixed_line",
"category": "wangiri",
"risk": "high",
"international": true,
"wangiri": "listed"
}
],
"signals": [
"asks_to_call",
"premium_number",
"wangiri_country",
"international_number"
],
"attention": true
}
},
"meta": {
"requestId": "req_example",
"unitsCharged": 1,
"usage": {
"periodStart": "2026-10-01",
"unitLimit": 20,
"unitsUsed": 3,
"unitsRemaining": 17
}
}
}Result fields (data.result)
| Field | Type | Description |
|---|---|---|
| numbers | array<object> | The valid numbers found, in order and each once: e164, country, type, category and risk (as premium-rate returns them), international and the wangiri verdict of a foreign number. |
| signals | array<"asks_to_call" | "premium_number" | "satellite_number" | "wangiri_country" | "international_number" | "dial_code_in_text" | "too_many_numbers"> | asks_to_call, premium_number, satellite_number, wangiri_country, international_number, dial_code_in_text or too_many_numbers. |
| attention | boolean | Whether the content deserves a closer look. |
Frequently asked questions
Why would a scammer want me to call them?
Because then the call feels like your idea and you trust it more. A fake support line asks for your details, a code or for you to install an app. Some of those numbers also charge the call at a premium rate.
The message says it’s from my bank. Which number should I call?
The one on the back of your card, in your bank’s app or on its official website, typing the address yourself. Never the one in the message.
What if the number is toll-free or from my country?
It won’t cost more than a normal call (or nothing, if it’s toll-free), but the risk remains: many “cancel your subscription” scams use toll-free or ordinary numbers. Always check the number on the company’s official website.
