SMS & messages
SMS scam campaigns
Coverage: Open the directory for your edition, choose a category and open an entry to read its data. Counts describe data available in NoCall, not every call in the country. Missing data does not prove a number is safe.
Open toolOn this page
Purpose
In Trends, open the SMS tab to view campaigns, impersonated brands and detected domains. This view requires Pro. Compare the signals and their period; the same brand alone does not connect a particular message to a campaign.
Requirements
Anyone can read these guides, no account needed. Some tools require Pro, as indicated in each guide.
How to use it
Select the country edition, open the category or row you need and review the available details.
SMS scam campaigns
In Trends, open the SMS tab to view campaigns, impersonated brands and detected domains. This view requires Pro. Compare the signals and their period; the same brand alone does not connect a particular message to a campaign.
Synthetic example
Invented example, not a real lookup. Do not call or open its links.
DHL: Last warning. Your parcel is blocked. Action required at https://parcel.exampleInterpret the result
In Trends, open the SMS tab to view campaigns, impersonated brands and detected domains. This view requires Pro. Compare the signals and their period; the same brand alone does not connect a particular message to a campaign.
Only domains are displayed, without active links. A familiar domain does not prove a message is genuine.
Limitations
Indicative result based on automatic signals, not sender verification. No result guarantees that a message is safe.
Information based on community reports and automated analysis. It may contain errors or be out of date, and is not legal advice or a verified accusation against the number's owner.
Troubleshooting
The security check or API connection did not respond in time. Try again in a few seconds.
Select the country edition, open the category or row you need and review the available details.
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.
Public aggregate of SMS scam campaigns: totals and the top brands (with their sms-brand id) and domains, recomputed at most every 10 minutes. Never sender or message text.
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-campaigns
POST https://api.nocall.io/v2/tools {"tool":"sms-campaigns"}Parameters
No parameters: send an empty JSON object, {}.
REQUEST_ID="$(uuidgen)" && [ -n "$REQUEST_ID" ] &&
curl --request POST 'https://api.nocall.io/v2/sms-campaigns' \
--header "Authorization: Bearer $NOCALL_API_KEY" \
--header 'Content-Type: application/json' \
--header "Idempotency-Key: $REQUEST_ID" \
--data '{}'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-campaigns',
method='POST',
data=json.dumps({}).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-campaigns', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + apiKey,
'Content-Type': 'application/json',
'Idempotency-Key': requestId,
},
body: JSON.stringify({}),
});
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-campaigns",
"result": {
"totalCampaigns": 0,
"totalSightings": 0,
"topBrands": [],
"topDomains": []
}
},
"meta": {
"requestId": "req_example",
"unitsCharged": 1,
"usage": {
"periodStart": "2026-10-01",
"unitLimit": 20,
"unitsUsed": 3,
"unitsRemaining": 17
}
}
}Result fields (data.result)
| Field | Type | Description |
|---|---|---|
| totalCampaigns | integer | Number of campaigns with at least 3 observers. |
| totalSightings | integer | Total sightings of those campaigns. |
| topBrands | array<object> | Most impersonated brands, up to 10, each with its sms-brand id, or null when it has none. |
| topDomains | array<object> | Most used domains, up to 10. |
