API
Référence API
Sur cette page
Authentification
Vous avez besoin de crédits : les 20 par mois inclus avec un compte Pro actif, ou des crédits achetés sur la page de votre compte. Un compte qui n’a ni les uns ni les autres reçoit 403 pro_required.
Cette clé n’est affichée qu’une fois. Conservez-la en sécurité sur votre serveur.
Créez une API key dans votre compte et copiez la valeur affichée une seule fois. Configurez NOCALL_API_KEY comme secret sur votre serveur. Utilisez HTTPS ; ne mettez jamais la clé dans le code du navigateur, les dépôts, captures ou journaux.
Envoyez la clé complète dans Authorization: Bearer, avec un espace après Bearer. N’utilisez pas X-API-Key et ne placez pas la clé dans l’URL.
Sur /v1/data/* + /v2/*, une clé valide remplace la preuve ByteGuard du navigateur. Expiration, révocation, abonnement, crédits et limites restent contrôlés. Elle n’autorise pas les autres routes. openapi.json et products sont publics.
Authorization: Bearer <NOCALL_API_KEY>Votre première requête
Les 44 tools sont tous disponibles via l’API : appelez POST /v2/<tool-id>, ou POST /v2/tools avec le champ tool dans le corps. Chaque tool a son propre corps JSON, documenté dans son guide. data.result contient le résultat du tool. Utilisez les identifiants du tableau.
Générez une nouvelle Idempotency-Key pour chaque nouvelle opération. Conservez cette clé uniquement pour réessayer la même opération avec les mêmes données.
REQUEST_ID="$(uuidgen)" && [ -n "$REQUEST_ID" ] &&
curl --request POST 'https://api.nocall.io/v2/tools' \
--header "Authorization: Bearer $NOCALL_API_KEY" \
--header 'Content-Type: application/json' \
--header "Idempotency-Key: $REQUEST_ID" \
--data '{"tool":"who-calls","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/tools',
method='POST',
data=json.dumps({'tool': 'who-calls', '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/tools', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + apiKey,
'Content-Type': 'application/json',
'Idempotency-Key': requestId,
},
body: JSON.stringify({ tool: 'who-calls', 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);API v2 · tools
Les 44 tools sont tous disponibles via l’API : appelez POST /v2/<tool-id>, ou POST /v2/tools avec le champ tool dans le corps. Chaque tool a son propre corps JSON, documenté dans son guide. data.result contient le résultat du tool. Utilisez les identifiants du tableau.
| tool | Objectif | POST | Exemple fictif |
|---|---|---|---|
| who-calls | Qui m’appelle ? | /v2/who-calls | {"phone":"+12025550123","country":"US"} |
| phone-exposure | Mon numéro a-t-il fuité ? | /v2/phone-exposure | {"phone":"+12025550123","country":"US"} |
| phone-intelligence | Renseignement téléphonique | /v2/phone-intelligence | {"phone":"+12025550123","country":"US"} |
| phone-risk | Risque téléphonique | /v2/phone-risk | {"phone":"+12025550123","country":"US"} |
| carrier-lookup | Recherche opérateur | /v2/carrier-lookup | {"phone":"+12025550123","country":"US"} |
| verified-business | Recherche inversée d’entreprise vérifiée | /v2/verified-business | {"phone":"+12025550123","country":"US"} |
| phone-formats | Formats de téléphone | /v2/phone-formats | {"phone":"+34912345678","country":"ES"} |
| callback-cost | Combien coûte un rappel ? | /v2/callback-cost | {"phone":"806123456","country":"ES"} |
| prefix-origin | D’où vient cet indicatif ? | /v2/prefix-origin | {"phone":"910","country":"ES"} |
| number-validator | Valider et formater un numéro de téléphone | /v2/number-validator | {"phone":"+12025550123","country":"US"} |
| line-type | Mobile ou fixe ? | /v2/line-type | {"phone":"+34600111222","country":"ES"} |
| premium-rate | Est-ce un numéro surtaxé ? | /v2/premium-rate | {"phone":"806","country":"ES"} |
| wangiri | Vérificateur wangiri : cet appel manqué est-il une arnaque ? | /v2/wangiri | {"phone":"+216","country":"ES"} |
| commercial-400 | Cet appel de démarchage est-il légal ? | /v2/commercial-400 | {"phone":"+34400000000","country":"ES"} |
| number-research | Analyser un numéro avec l’IA | /v2/number-research | {"phone":"+12025550123","country":"US","language":"en"} |
| dial-code | On vous demande de composer un code ? | /v2/dial-code | {"code":"**21*+34600000000#","country":"ES"} |
| call-scam-check | Cet appel est-il une arnaque ? | /v2/call-scam-check | {"answers":{"impersonation":true,"sms_code":true,"pressure":true},"country":"ES"} |
| sms-check | Vérifier si un SMS est une arnaque | /v2/sms-check | {"message":"Your parcel is held. Pay the fee at https://example.invalid/pay","sender":"Correos","language":"en","country":"GB"} |
| sms-brand | Ce SMS d’une marque est-il authentique ? | /v2/sms-brand | {"brand":"correos","link":"https://correos-envio.example.invalid/pago","country":"ES"} |
| sms-sender | Qui m’a envoyé ce SMS ? | /v2/sms-sender | {"sender":"Correos","country":"ES"} |
| sms-code | On vous demande un code reçu par SMS ? | /v2/sms-code | {"unrequested":true,"asked":true,"sensitive":true,"shared":false} |
| sms-report | Où signaler un SMS frauduleux | /v2/sms-report | {"sender":"Correos","tapped":false,"gaveData":false,"country":"ES"} |
| sms-campaigns | Campagnes de SMS frauduleux | /v2/sms-campaigns | {} |
| sms-redact | Retirez vos données d’un SMS | /v2/sms-redact | {"message":"BBVA: su tarjeta 4111 1111 1111 1111 ha sido bloqueada. Llame al +34 612 34 56 78 o entre en https://bbva-seguro.com/login"} |
| callback-number | Faut-il appeler le numéro de ce message ? | /v2/callback-number | {"text":"Your account is locked. Call us now on 0909 879 0000 or +216 71 123 456","country":"GB"} |
| prefix-directory | Indicatifs | /v2/prefix-directory | {"country":"ES","serviceClass":"premium","page":1,"limit":3} |
| operator-directory | Opérateurs | /v2/operator-directory | {"country":"ES","operator":"Movistar"} |
| calling-codes | Indicatifs internationaux | /v2/calling-codes | {"query":"216","language":"en"} |
| spam-directory | Numéros spam | /v2/spam-directory | {"country":"US","category":"SCAM","page":1,"limit":20} |
| trends | Analyses | /v2/trends | {"country":"ES"} |
| smishing | Qu’est-ce que le smishing ? | /v2/smishing | {"message":"CORREOS: su paquete está retenido. Pague urgente las tasas en https://correos-entrega.info/pago","country":"ES"} |
| link-check | Vérifier un lien | /v2/link-check | {"url":"http://192.168.1.1/login","country":"ES"} |
| safety-tools | Outils de sécurité | /v2/safety-tools | {"text":"URGENTE: su cuenta BBVA ha sido bloqueada, verifique en https://bbva-seguro.com/login","mode":"email","country":"ES"} |
| sms-filter | Filtre anti-spam SMS | /v2/sms-filter | {"country":"ES"} |
| qr-check | Ce QR code est-il sûr ? | /v2/qr-check | {"payload":"BCD\n002\n1\nSCT\n\nAparcamientos Ejemplo SL\nES9121000418450200051332\nEUR49.90\n\n\nMulta de aparcamiento 4471","country":"ES"} |
| email-headers | Cet e-mail est-il authentique ? | /v2/email-headers | {"headers":"Delivered-To: [email protected]\nReceived: from mail.bank.example (mail.bank.example [192.0.2.10]) by mx.google.com with ESMTPS id x1 for <[email protected]>; Tue, 27 Oct 2026 09:00:00 -0700\nAuthentication-Results: mx.google.com; dkim=pass [email protected] header.s=s1; spf=pass (google.com: domain of [email protected] designates 192.0.2.10 as permitted sender) [email protected]; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=bank.example\nFrom: \"Bank Alerts\" <[email protected]>\nReply-To: [email protected]\nSubject: Your statement is ready\nMessage-ID: <[email protected]>","country":"ES"} |
| mx-lookup | Enregistrements MX d’un domaine | /v2/mx-lookup | {"domain":"example.com"} |
| spf-check | Vérifier le SPF | /v2/spf-check | {"domain":"example.com"} |
| dmarc-check | Vérifier le DMARC | /v2/dmarc-check | {"domain":"example.com"} |
| dkim-check | Vérifier le DKIM | /v2/dkim-check | {"domain":"example.com","selector":"s1"} |
| email-verify | Vérifier une adresse e-mail | /v2/email-verify | {"email":"[email protected]"} |
| website-age | Quel âge a ce site ? | /v2/website-age | {"url":"https://www.example.com/login","country":"ES"} |
| domain-popularity | Popularité d’un domaine | /v2/domain-popularity | {"url":"https://shop.example.com/cart","country":"ES"} |
| website-legit | Ce site est-il fiable ? | /v2/website-legit | {"url":"https://[email protected]/login","country":"ES"} |
Endpoints disponibles
Seules les données techniques vérifiées ou publiques sont affichées. Les identités privées et signaux de protection restent masqués.
API v1 · phone est obligatoire : une chaîne de 64 caractères maximum, de préférence au format E.164. country est un code pays pris en charge à deux lettres, facultatif, avec ES par défaut. Content-Type doit être application/json.
| HTTP | URL | Objectif | Prérequis |
|---|---|---|---|
| POST | /v2/tools | Utiliser avec l’API | Authorization: Bearer · Pro |
| GET | /v2/tools | Catalogue de produits NoCall | Authorization: Bearer · Pro |
| GET | /v2/openapi.json | OpenAPI 3.1 | — |
| POST | /v2/who-calls | Qui m’appelle ? | Authorization: Bearer · Pro |
| POST | /v2/phone-exposure | Mon numéro a-t-il fuité ? | Authorization: Bearer · Pro |
| POST | /v2/phone-intelligence | Renseignement téléphonique | Authorization: Bearer · Pro |
| POST | /v2/phone-risk | Risque téléphonique | Authorization: Bearer · Pro |
| POST | /v2/carrier-lookup | Recherche opérateur | Authorization: Bearer · Pro |
| POST | /v2/verified-business | Recherche inversée d’entreprise vérifiée | Authorization: Bearer · Pro |
| POST | /v2/phone-formats | Formats de téléphone | Authorization: Bearer · Pro |
| POST | /v2/callback-cost | Combien coûte un rappel ? | Authorization: Bearer · Pro |
| POST | /v2/prefix-origin | D’où vient cet indicatif ? | Authorization: Bearer · Pro |
| POST | /v2/number-validator | Valider et formater un numéro de téléphone | Authorization: Bearer · Pro |
| POST | /v2/line-type | Mobile ou fixe ? | Authorization: Bearer · Pro |
| POST | /v2/premium-rate | Est-ce un numéro surtaxé ? | Authorization: Bearer · Pro |
| POST | /v2/wangiri | Vérificateur wangiri : cet appel manqué est-il une arnaque ? | Authorization: Bearer · Pro |
| POST | /v2/commercial-400 | Cet appel de démarchage est-il légal ? | Authorization: Bearer · Pro |
| POST | /v2/number-research | Analyser un numéro avec l’IA | Authorization: Bearer · Pro |
| POST | /v2/dial-code | On vous demande de composer un code ? | Authorization: Bearer · Pro |
| POST | /v2/call-scam-check | Cet appel est-il une arnaque ? | Authorization: Bearer · Pro |
| POST | /v2/sms-check | Vérifier si un SMS est une arnaque | Authorization: Bearer · Pro |
| POST | /v2/sms-brand | Ce SMS d’une marque est-il authentique ? | Authorization: Bearer · Pro |
| POST | /v2/sms-sender | Qui m’a envoyé ce SMS ? | Authorization: Bearer · Pro |
| POST | /v2/sms-code | On vous demande un code reçu par SMS ? | Authorization: Bearer · Pro |
| POST | /v2/sms-report | Où signaler un SMS frauduleux | Authorization: Bearer · Pro |
| POST | /v2/sms-campaigns | Campagnes de SMS frauduleux | Authorization: Bearer · Pro |
| POST | /v2/sms-redact | Retirez vos données d’un SMS | Authorization: Bearer · Pro |
| POST | /v2/callback-number | Faut-il appeler le numéro de ce message ? | Authorization: Bearer · Pro |
| POST | /v2/prefix-directory | Indicatifs | Authorization: Bearer · Pro |
| POST | /v2/operator-directory | Opérateurs | Authorization: Bearer · Pro |
| POST | /v2/calling-codes | Indicatifs internationaux | Authorization: Bearer · Pro |
| POST | /v2/spam-directory | Numéros spam | Authorization: Bearer · Pro |
| POST | /v2/trends | Analyses | Authorization: Bearer · Pro |
| POST | /v2/smishing | Qu’est-ce que le smishing ? | Authorization: Bearer · Pro |
| POST | /v2/link-check | Vérifier un lien | Authorization: Bearer · Pro |
| POST | /v2/safety-tools | Outils de sécurité | Authorization: Bearer · Pro |
| POST | /v2/sms-filter | Filtre anti-spam SMS | Authorization: Bearer · Pro |
| POST | /v2/qr-check | Ce QR code est-il sûr ? | Authorization: Bearer · Pro |
| POST | /v2/email-headers | Cet e-mail est-il authentique ? | Authorization: Bearer · Pro |
| POST | /v2/mx-lookup | Enregistrements MX d’un domaine | Authorization: Bearer · Pro |
| POST | /v2/spf-check | Vérifier le SPF | Authorization: Bearer · Pro |
| POST | /v2/dmarc-check | Vérifier le DMARC | Authorization: Bearer · Pro |
| POST | /v2/dkim-check | Vérifier le DKIM | Authorization: Bearer · Pro |
| POST | /v2/email-verify | Vérifier une adresse e-mail | Authorization: Bearer · Pro |
| POST | /v2/website-age | Quel âge a ce site ? | Authorization: Bearer · Pro |
| POST | /v2/domain-popularity | Popularité d’un domaine | Authorization: Bearer · Pro |
| POST | /v2/website-legit | Ce site est-il fiable ? | Authorization: Bearer · Pro |
| GET | /v1/data/account | Clé API et crédits | Authorization: Bearer |
| POST | /v1/data/phone-lookups | Renseignement téléphonique | Authorization: Bearer · Pro |
| POST | /v1/data/phone-risk-checks | Risque téléphonique | Authorization: Bearer · Pro |
| POST | /v1/data/carrier-lookups | Recherche opérateur | Authorization: Bearer · Pro |
| POST | /v1/data/reverse-phone-lookups | Recherche inversée d’entreprise vérifiée | Authorization: Bearer |
| POST | /v1/data/phone-exposure-checks | Mon numéro a-t-il fuité ? | Authorization: Bearer · Pro |
| POST | /v1/data/bulk-lookups | Recherches téléphoniques en masse | Authorization: Bearer |
| GET | /v1/data/products | Catalogue de produits NoCall | — |
| GET | /v1/data/openapi.json | OpenAPI 3.1 | — |
Réponses
Exemple inventé, pas une recherche réelle. N’appelez pas et n’ouvrez pas ses liens.
data contient le résultat ; meta fournit requestId, unitsCharged et l’utilisation si applicable. L’extrait fictif montre le solde après une requête. Un résultat valide sans données coûte aussi 1 crédit ; les erreurs de validation ou de fournisseur et la lecture du solde ne sont pas facturées. L’absence de données ne prouve pas qu’un numéro est sûr. Les schémas complets figurent dans OpenAPI.
{
"data": {
"tool": "who-calls",
"result": {
"phoneNumber": "+12025550123",
"found": true,
"updatedAt": "2026-10-01T09:30:00.000Z",
"risk": {
"score": 72,
"level": "high"
},
"reportCount": 14,
"categories": [
"TELEMARKETING"
],
"verified": false,
"carrier": null,
"verifiedBusiness": null
}
},
"meta": {
"requestId": "req_example",
"unitsCharged": 1,
"usage": {
"periodStart": "2026-10-01",
"unitLimit": 20,
"unitsUsed": 3,
"unitsRemaining": 17
}
}
}| tool | data.result |
|---|---|
| who-calls | phoneNumber, found, updatedAt, risk, reportCount, categories, verified, carrier, verifiedBusiness |
| phone-exposure | atRisk |
| phone-intelligence | phoneNumber, found, updatedAt, risk, reportCount, categories, verified, carrier, verifiedBusiness, commentCount, aiRiskLevel, prefixRisk |
| phone-risk | phoneNumber, found, updatedAt, risk, signals |
| carrier-lookup | phoneNumber, found, updatedAt, carrier |
| verified-business | phoneNumber, found, updatedAt, verifiedBusiness |
| phone-formats | e164, national, international, callingCode, country, valid |
| callback-cost | tier, scope, callingCode, registry |
| prefix-origin | kind, planLoaded, numberType, foreignCode, national, row, complete, rows, factsType |
| number-validator | valid, possible, country, callingCode, type, e164 |
| line-type | e164, valid, type, lineKind |
| premium-rate | category, callbackRisk, prefix, callingCode, source |
| wangiri | verdict, code, nanpArea, entry |
| commercial-400 | verdict, prefix |
| number-research | answer, sources, countryCode, language, cached |
| dial-code | code, kind, action, service, forwardsTo, calls, risk, undo, operator |
| call-scam-check | verdict, signals, actions, reportChannel |
| sms-check | verdict, confidence, reason |
| sms-brand | verdict, host, brand, officialDomains, sightings |
| sms-sender | kind, tooLong, brand, lookalike, digits, code |
| sms-code | verdict, severity, serviceRecoverySteps, stepCodes |
| sms-report | channel, verified, stepCodes, reportFields |
| sms-campaigns | totalCampaigns, totalSightings, topBrands, topDomains |
| sms-redact | text, counts, total |
| callback-number | numbers, signals, attention |
| prefix-directory | countryCode, callingCode, planVersion, total, page, limit, hasMore, rows |
| operator-directory | operators, specialPrefixes |
| calling-codes | rows, total |
| spam-directory | view, totals, categories, topReported, category, total, page, limit, hasMore, rows |
| trends | totals, activity24h, verification, freshness, categoryDistribution, phoneTypes, topOperators, growthTimeline, topPrefixes, searchTrends, communityDistribution, impersonationRanking, aiBreakdown |
| smishing | verdict, score, attention, signals, hosts, linkFlags, brand, brandSlug |
| link-check | host, hostAscii, official, brand, hosts, linkFlags, signals, attention |
| safety-tools | attention, signals, hosts, linkFlags |
| sms-filter | country, version, updatedAt, source, counts |
| qr-check | payload, signals, attention, hosts, linkFlags, link, numbers |
| email-headers | fromDomain, fromDomainAscii, displayName, replyToDomain, returnPathDomain, senderDomain, subject, auth, authenticated, brand, official, freeMail, signals, attention |
| mx-lookup | domain, domainAscii, found, records, nullMx, implicitMx, acceptsMail, provider, signals, attention |
| spf-check | domain, domainAscii, found, record, recordCount, terms, allResult, lookups, includes, signals, valid, attention |
| dmarc-check | domain, domainAscii, found, record, foundAt, inherited, policy, subdomainPolicy, effectivePolicy, percentage, alignment, reports, signals, valid, attention |
| dkim-check | domain, domainAscii, selectorGiven, selectorsTried, keys, signals, attention |
| email-verify | domain, domainAscii, status, syntaxValid, acceptsMail, mx, disposable, role, freeMail, suggestion, signals, attention |
| website-age | domain, domainAscii, rdapAvailable, found, registeredDomain, registered, updated, expires, ageDays, registrar, status, campaigns, signals, attention |
| domain-popularity | domain, domainAscii, ranked, rank, rankedDomain, refSubnets, refIps, listSize, updated, source |
| website-legit | domain, domainAscii, verdict, official, brand, ageDays, registered, ranked, rank, campaigns, signals, linkFlags, attention, checks |
Crédits et limites
Avec Pro, vous avez 20 crédits gratuits chaque mois
Chaque appel à l'API coûte 1 crédit. Les crédits mensuels sont utilisés en premier.
La régénération désactive vos anciennes clés. Votre solde de crédits est conservé.
curl 'https://api.nocall.io/v1/data/account' \
--header "Authorization: Bearer $NOCALL_API_KEY"Nouvelles tentatives et lots
Générez une nouvelle Idempotency-Key pour chaque nouvelle opération. Conservez cette clé uniquement pour réessayer la même opération avec les mêmes données.
Idempotency-Key est facultatif pour une requête individuelle et obligatoire pour un lot : 8 à 128 caractères (lettres, chiffres, points, tirets, traits de soulignement ou deux-points). Pour réessayer, gardez la même clé, route, API key et le même corps. Une réponse rejouée n’est pas refacturée. Vérifiez le solde après une réponse ambiguë.
Un lot accepte jusqu’à 50 entrées. product choisit une opération de l’exemple. Le solde doit couvrir toutes les entrées valides avant de commencer ; seuls les résultats valides terminés sont facturés. Les requêtes simultanées partagent le solde : s’il est épuisé avant le débit final, la requête renvoie 429 sans être facturée.
8–128 ASCII: A–Z a–z 0–9 . _ : -
TTL: 24 hphone-lookup
phone-risk
carrier-lookup
reverse-phone-lookup
phone-exposureREQUEST_ID="$(uuidgen)" && [ -n "$REQUEST_ID" ] &&
curl --request POST 'https://api.nocall.io/v1/data/bulk-lookups' \
--header "Authorization: Bearer $NOCALL_API_KEY" \
--header 'Content-Type: application/json' \
--header "Idempotency-Key: $REQUEST_ID" \
--data '{"product":"phone-risk","inputs":[{"phone":"+12025550123","country":"US"}]}'Résoudre un problème
| HTTP | Interpréter le résultat |
|---|---|
| 401 | Clé absente, format Bearer incorrect, clé expirée ou révoquée. Vérifiez le header ou créez une nouvelle clé dans votre compte. |
| 403 | Vous avez besoin de crédits : les 20 par mois inclus avec un compte Pro actif, ou des crédits achetés sur la page de votre compte. Un compte qui n’a ni les uns ni les autres reçoit 403 pro_required. |
| 400 / 422 | Vérifiez JSON, phone, country et Idempotency-Key. Les erreurs de validation ne consomment pas de crédits. |
| 409 | La clé d’idempotence a été utilisée avec un autre corps ou la requête est en cours. Pour réessayer la même opération, conservez son corps et attendez. |
| 429 | Crédits épuisés ou limite de requêtes atteinte. Consultez /account et X-RateLimit-Remaining. Respectez Retry-After s’il est présent. ai_busy signifie que l’IA est occupée : la requête n’est pas facturée ; réessayez après Retry-After. |
| 500 / 503 | Service ou fournisseur indisponible, ou bêta désactivée. Attendez et réessayez avec la même Idempotency-Key ; évitez les tentatives immédiates en boucle. tool_warming signifie que le tool est encore en démarrage : la requête n’est pas facturée ; réessayez après Retry-After. |
