SMS & messages
Where to report a scam text
Coverage: A verified channel for each country where NoCall has checked one; general advice everywhere else. We only name a channel, a phone number or a website after verifying it.
Open toolOn this page
Purpose
Where to report a scam text message in your country, a report text you can copy, and how to warn other people about the number in NoCall.
Requirements
Anyone can read these guides, no account needed. Some tools require Pro, as indicated in each guide.
The reporting channel we have verified for your country, a text you can copy into your report and how to warn other people about the number.
How to use it
The reporting channel we have verified for your country, a text you can copy into your report and how to warn other people about the number.
If you lost money or gave card or bank details, call your bank right away and report it to the police.
If you entered passwords, change them and turn on two-step verification.
Tell your mobile operator about the message and the number it came from.
Report the number in NoCall so that other people are warned.
Keep a screenshot of the message, then delete it.
Synthetic example
Invented example, not a real lookup. Do not call or open its links.
https://delivery.example/noticeInterpret the result
A verified channel for each country where NoCall has checked one; general advice everywhere else. We only name a channel, a phone number or a website after verifying it.
Limitations
Scammers can make a text message show a brand’s name or someone else’s number (spoofing), and the fake can even land in the same conversation as the real messages. What gives a fake away is where its link goes.
The report text is built in your browser: nothing you type is sent or saved.
Troubleshooting
We haven’t verified an official channel for reporting phone scams in your country, so we don’t name one. The steps below apply anywhere.
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.
Steps to report a scam SMS, with the report fields tidied for copying. With country, channel is that country's verified reporting body; without country, or when there is no verified body, channel is null.
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/sms-report
POST https://api.nocall.io/v2/tools {"tool":"sms-report","sender":"Correos","tapped":false,"gaveData":false,"country":"ES"}Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| sender | string (≤200) | No | Sender name or number, as shown on the SMS. |
| received | string (≤200) | No | When you received the SMS, as free text. |
| link | string (≤200) | No | Link in the message. It is never opened. |
| tapped | boolean | No | Whether you tapped the link. |
| gaveData | boolean | No | Whether you entered personal or bank details. |
| country | string (enum, 56) | No | Country whose verified reporting body is returned in channel. Optional: without it channel is null. |
REQUEST_ID="$(uuidgen)" && [ -n "$REQUEST_ID" ] &&
curl --request POST 'https://api.nocall.io/v2/sms-report' \
--header "Authorization: Bearer $NOCALL_API_KEY" \
--header 'Content-Type: application/json' \
--header "Idempotency-Key: $REQUEST_ID" \
--data '{"sender":"Correos","tapped":false,"gaveData":false,"country":"ES"}'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/sms-report',
method='POST',
data=json.dumps({'sender': 'Correos', 'tapped': False, 'gaveData': False, 'country': 'ES'}).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/sms-report', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + apiKey,
'Content-Type': 'application/json',
'Idempotency-Key': requestId,
},
body: JSON.stringify({ sender: 'Correos', tapped: false, gaveData: false, country: 'ES' }),
});
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": "sms-report",
"result": {
"channel": {
"name": "INCIBE",
"fullName": "Instituto Nacional de Ciberseguridad de España",
"url": "https://www.incibe.es/linea-de-ayuda-en-ciberseguridad",
"phone": "017"
},
"verified": true,
"stepCodes": [
"contact_bank",
"change_passwords",
"tell_operator",
"report_number",
"keep_screenshot"
],
"reportFields": {
"sender": "Correos",
"received": null,
"link": null,
"tapped": false,
"gaveData": false
}
}
},
"meta": {
"requestId": "req_example",
"unitsCharged": 1,
"usage": {
"periodStart": "2026-10-01",
"unitLimit": 20,
"unitsUsed": 3,
"unitsRemaining": 17
}
}
}Result fields (data.result)
| Field | Type | Description |
|---|---|---|
| channel | object | null | That country's verified reporting body, when country is given and one exists; otherwise null. |
| verified | boolean | Whether channel is a verified reporting body. false when channel is null. |
| stepCodes | array<"contact_bank" | "change_passwords" | "tell_operator" | "report_number" | "keep_screenshot"> | Codes of the five general steps that apply anywhere, in order. |
| reportFields | object | Your answers, tidied for copying into a report. |
Frequently asked questions
Should I forward the text message to someone?
Only to the channel listed here, or to your bank or operator if they ask for it. Don’t forward it to friends: the link stays dangerous.
Is it worth reporting if I didn’t fall for it?
Yes. Reports help to spot a campaign sooner, and in NoCall your report warns everyone who looks up that number.
Why don’t you give a phone number for my country?
We only give channels, phone numbers and websites that we have verified for each country. If we haven’t verified one, we say so rather than guess.
