On this page

API

API reference

API · ProBeta
API key and credits
On this page

Authentication

Warning

You need credits: the 20 a month included with an active Pro account, or credits bought on your account page. An account with neither receives 403 pro_required.

Important

This key is shown only once. Save it securely on your server.

Create an API key in your account and copy the value shown once. Configure NOCALL_API_KEY as a secret on your server. Use HTTPS; never include the key in browser code, repositories, screenshots or logs.

Send the full key in Authorization: Bearer, with one space after Bearer. Do not use X-API-Key or put the key in the URL.

On /v1/data/* + /v2/*, a valid key replaces browser ByteGuard proof. Expiry, revocation, subscription, credits and rate limits still apply. It does not authorize other routes. openapi.json and products are public.

HTTP
Authorization: Bearer <NOCALL_API_KEY>

Your first lookup

All 44 tools are available through the API: call POST /v2/<tool-id>, or POST /v2/tools with the tool field in the body. Each tool has its own JSON body, documented in its guide. data.result contains the tool result. Use the identifiers in the table.

Generate a fresh Idempotency-Key for each new operation. Keep that key only to retry the same operation with the same input.

bash
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"}'

API v2 · tools

All 44 tools are available through the API: call POST /v2/<tool-id>, or POST /v2/tools with the tool field in the body. Each tool has its own JSON body, documented in its guide. data.result contains the tool result. Use the identifiers in the table.

toolPurposePOSTSynthetic example
who-callsWho is calling me?/v2/who-calls{"phone":"+12025550123","country":"US"}
phone-exposureHas my number been leaked?/v2/phone-exposure{"phone":"+12025550123","country":"US"}
phone-intelligencePhone intelligence/v2/phone-intelligence{"phone":"+12025550123","country":"US"}
phone-riskPhone risk/v2/phone-risk{"phone":"+12025550123","country":"US"}
carrier-lookupCarrier lookup/v2/carrier-lookup{"phone":"+12025550123","country":"US"}
verified-businessVerified business reverse lookup/v2/verified-business{"phone":"+12025550123","country":"US"}
phone-formatsPhone number formats/v2/phone-formats{"phone":"+34912345678","country":"ES"}
callback-costHow much does it cost to call back?/v2/callback-cost{"phone":"806123456","country":"ES"}
prefix-originWhere is this area code from?/v2/prefix-origin{"phone":"910","country":"ES"}
number-validatorPhone number validator and formatter/v2/number-validator{"phone":"+12025550123","country":"US"}
line-typeIs it a mobile or a landline?/v2/line-type{"phone":"+34600111222","country":"ES"}
premium-rateIs it a premium-rate number?/v2/premium-rate{"phone":"806","country":"ES"}
wangiriWangiri check: is this missed call a scam?/v2/wangiri{"phone":"+216","country":"ES"}
commercial-400Is this sales call legal?/v2/commercial-400{"phone":"+34400000000","country":"ES"}
number-researchResearch a number with AI/v2/number-research{"phone":"+12025550123","country":"US","language":"en"}
dial-codeAsked to dial a code?/v2/dial-code{"code":"**21*+34600000000#","country":"ES"}
call-scam-checkIs this call a scam?/v2/call-scam-check{"answers":{"impersonation":true,"sms_code":true,"pressure":true},"country":"ES"}
sms-checkCheck if a text message is a scam/v2/sms-check{"message":"Your parcel is held. Pay the fee at https://example.invalid/pay","sender":"Correos","language":"en","country":"GB"}
sms-brandIs this text from a brand real?/v2/sms-brand{"brand":"correos","link":"https://correos-envio.example.invalid/pago","country":"ES"}
sms-senderWho sent me this text?/v2/sms-sender{"sender":"Correos","country":"ES"}
sms-codeAsked for a code sent by SMS?/v2/sms-code{"unrequested":true,"asked":true,"sensitive":true,"shared":false}
sms-reportWhere to report a scam text/v2/sms-report{"sender":"Correos","tapped":false,"gaveData":false,"country":"ES"}
sms-campaignsSMS scam campaigns/v2/sms-campaigns{}
sms-redactRemove your data from a text/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-numberShould I call the number in this message?/v2/callback-number{"text":"Your account is locked. Call us now on 0909 879 0000 or +216 71 123 456","country":"GB"}
prefix-directoryPrefixes/v2/prefix-directory{"country":"ES","serviceClass":"premium","page":1,"limit":3}
operator-directoryOperators/v2/operator-directory{"country":"ES","operator":"Movistar"}
calling-codesInternational codes/v2/calling-codes{"query":"216","language":"en"}
spam-directorySpam numbers/v2/spam-directory{"country":"US","category":"SCAM","page":1,"limit":20}
trendsInsights/v2/trends{"country":"ES"}
smishingWhat is smishing?/v2/smishing{"message":"CORREOS: su paquete está retenido. Pague urgente las tasas en https://correos-entrega.info/pago","country":"ES"}
link-checkCheck a link/v2/link-check{"url":"http://192.168.1.1/login","country":"ES"}
safety-toolsSafety tools/v2/safety-tools{"text":"URGENTE: su cuenta BBVA ha sido bloqueada, verifique en https://bbva-seguro.com/login","mode":"email","country":"ES"}
sms-filterSMS spam filter/v2/sms-filter{"country":"ES"}
qr-checkIs this QR code safe?/v2/qr-check{"payload":"BCD\n002\n1\nSCT\n\nAparcamientos Ejemplo SL\nES9121000418450200051332\nEUR49.90\n\n\nMulta de aparcamiento 4471","country":"ES"}
email-headersIs this email real?/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-lookupMX record lookup/v2/mx-lookup{"domain":"example.com"}
spf-checkSPF record checker/v2/spf-check{"domain":"example.com"}
dmarc-checkDMARC checker/v2/dmarc-check{"domain":"example.com"}
dkim-checkDKIM checker/v2/dkim-check{"domain":"example.com","selector":"s1"}
email-verifyEmail address checker/v2/email-verify{"email":"[email protected]"}
website-ageHow old is this website?/v2/website-age{"url":"https://www.example.com/login","country":"ES"}
domain-popularityDomain popularity check/v2/domain-popularity{"url":"https://shop.example.com/cart","country":"ES"}
website-legitIs this website legit?/v2/website-legit{"url":"https://[email protected]/login","country":"ES"}

Available endpoints

Only reviewed or public technical facts are shown. Private identities and protection signals stay hidden.

API v1 · phone is required: a string of up to 64 characters, preferably in E.164 format. country is a supported two-letter country code; it is optional and defaults to ES. Content-Type must be application/json.

HTTPURLPurposeRequirements
POST/v2/toolsUse with the APIAuthorization: Bearer · Pro
GET/v2/toolsNoCall product catalogAuthorization: Bearer · Pro
GET/v2/openapi.jsonOpenAPI 3.1—
POST/v2/who-callsWho is calling me?Authorization: Bearer · Pro
POST/v2/phone-exposureHas my number been leaked?Authorization: Bearer · Pro
POST/v2/phone-intelligencePhone intelligenceAuthorization: Bearer · Pro
POST/v2/phone-riskPhone riskAuthorization: Bearer · Pro
POST/v2/carrier-lookupCarrier lookupAuthorization: Bearer · Pro
POST/v2/verified-businessVerified business reverse lookupAuthorization: Bearer · Pro
POST/v2/phone-formatsPhone number formatsAuthorization: Bearer · Pro
POST/v2/callback-costHow much does it cost to call back?Authorization: Bearer · Pro
POST/v2/prefix-originWhere is this area code from?Authorization: Bearer · Pro
POST/v2/number-validatorPhone number validator and formatterAuthorization: Bearer · Pro
POST/v2/line-typeIs it a mobile or a landline?Authorization: Bearer · Pro
POST/v2/premium-rateIs it a premium-rate number?Authorization: Bearer · Pro
POST/v2/wangiriWangiri check: is this missed call a scam?Authorization: Bearer · Pro
POST/v2/commercial-400Is this sales call legal?Authorization: Bearer · Pro
POST/v2/number-researchResearch a number with AIAuthorization: Bearer · Pro
POST/v2/dial-codeAsked to dial a code?Authorization: Bearer · Pro
POST/v2/call-scam-checkIs this call a scam?Authorization: Bearer · Pro
POST/v2/sms-checkCheck if a text message is a scamAuthorization: Bearer · Pro
POST/v2/sms-brandIs this text from a brand real?Authorization: Bearer · Pro
POST/v2/sms-senderWho sent me this text?Authorization: Bearer · Pro
POST/v2/sms-codeAsked for a code sent by SMS?Authorization: Bearer · Pro
POST/v2/sms-reportWhere to report a scam textAuthorization: Bearer · Pro
POST/v2/sms-campaignsSMS scam campaignsAuthorization: Bearer · Pro
POST/v2/sms-redactRemove your data from a textAuthorization: Bearer · Pro
POST/v2/callback-numberShould I call the number in this message?Authorization: Bearer · Pro
POST/v2/prefix-directoryPrefixesAuthorization: Bearer · Pro
POST/v2/operator-directoryOperatorsAuthorization: Bearer · Pro
POST/v2/calling-codesInternational codesAuthorization: Bearer · Pro
POST/v2/spam-directorySpam numbersAuthorization: Bearer · Pro
POST/v2/trendsInsightsAuthorization: Bearer · Pro
POST/v2/smishingWhat is smishing?Authorization: Bearer · Pro
POST/v2/link-checkCheck a linkAuthorization: Bearer · Pro
POST/v2/safety-toolsSafety toolsAuthorization: Bearer · Pro
POST/v2/sms-filterSMS spam filterAuthorization: Bearer · Pro
POST/v2/qr-checkIs this QR code safe?Authorization: Bearer · Pro
POST/v2/email-headersIs this email real?Authorization: Bearer · Pro
POST/v2/mx-lookupMX record lookupAuthorization: Bearer · Pro
POST/v2/spf-checkSPF record checkerAuthorization: Bearer · Pro
POST/v2/dmarc-checkDMARC checkerAuthorization: Bearer · Pro
POST/v2/dkim-checkDKIM checkerAuthorization: Bearer · Pro
POST/v2/email-verifyEmail address checkerAuthorization: Bearer · Pro
POST/v2/website-ageHow old is this website?Authorization: Bearer · Pro
POST/v2/domain-popularityDomain popularity checkAuthorization: Bearer · Pro
POST/v2/website-legitIs this website legit?Authorization: Bearer · Pro
GET/v1/data/accountAPI key and creditsAuthorization: Bearer
POST/v1/data/phone-lookupsPhone intelligenceAuthorization: Bearer · Pro
POST/v1/data/phone-risk-checksPhone riskAuthorization: Bearer · Pro
POST/v1/data/carrier-lookupsCarrier lookupAuthorization: Bearer · Pro
POST/v1/data/reverse-phone-lookupsVerified business reverse lookupAuthorization: Bearer
POST/v1/data/phone-exposure-checksHas my number been leaked?Authorization: Bearer · Pro
POST/v1/data/bulk-lookupsBulk phone lookupsAuthorization: Bearer
GET/v1/data/productsNoCall product catalog—
GET/v1/data/openapi.jsonOpenAPI 3.1—

Responses

Note

Invented example, not a real lookup. Do not call or open its links.

data contains the result; meta includes requestId, unitsCharged and usage where applicable. The synthetic excerpt shows the balance after one lookup. A valid not-found result also costs 1 credit; validation and provider errors and reading the balance are free. Missing data does not prove a number is safe. See OpenAPI for complete schemas.

JSON · who-calls
{
  "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
    }
  }
}
tooldata.result
who-callsphoneNumber, found, updatedAt, risk, reportCount, categories, verified, carrier, verifiedBusiness
phone-exposureatRisk
phone-intelligencephoneNumber, found, updatedAt, risk, reportCount, categories, verified, carrier, verifiedBusiness, commentCount, aiRiskLevel, prefixRisk
phone-riskphoneNumber, found, updatedAt, risk, signals
carrier-lookupphoneNumber, found, updatedAt, carrier
verified-businessphoneNumber, found, updatedAt, verifiedBusiness
phone-formatse164, national, international, callingCode, country, valid
callback-costtier, scope, callingCode, registry
prefix-originkind, planLoaded, numberType, foreignCode, national, row, complete, rows, factsType
number-validatorvalid, possible, country, callingCode, type, e164
line-typee164, valid, type, lineKind
premium-ratecategory, callbackRisk, prefix, callingCode, source
wangiriverdict, code, nanpArea, entry
commercial-400verdict, prefix
number-researchanswer, sources, countryCode, language, cached
dial-codecode, kind, action, service, forwardsTo, calls, risk, undo, operator
call-scam-checkverdict, signals, actions, reportChannel
sms-checkverdict, confidence, reason
sms-brandverdict, host, brand, officialDomains, sightings
sms-senderkind, tooLong, brand, lookalike, digits, code
sms-codeverdict, severity, serviceRecoverySteps, stepCodes
sms-reportchannel, verified, stepCodes, reportFields
sms-campaignstotalCampaigns, totalSightings, topBrands, topDomains
sms-redacttext, counts, total
callback-numbernumbers, signals, attention
prefix-directorycountryCode, callingCode, planVersion, total, page, limit, hasMore, rows
operator-directoryoperators, specialPrefixes
calling-codesrows, total
spam-directoryview, totals, categories, topReported, category, total, page, limit, hasMore, rows
trendstotals, activity24h, verification, freshness, categoryDistribution, phoneTypes, topOperators, growthTimeline, topPrefixes, searchTrends, communityDistribution, impersonationRanking, aiBreakdown
smishingverdict, score, attention, signals, hosts, linkFlags, brand, brandSlug
link-checkhost, hostAscii, official, brand, hosts, linkFlags, signals, attention
safety-toolsattention, signals, hosts, linkFlags
sms-filtercountry, version, updatedAt, source, counts
qr-checkpayload, signals, attention, hosts, linkFlags, link, numbers
email-headersfromDomain, fromDomainAscii, displayName, replyToDomain, returnPathDomain, senderDomain, subject, auth, authenticated, brand, official, freeMail, signals, attention
mx-lookupdomain, domainAscii, found, records, nullMx, implicitMx, acceptsMail, provider, signals, attention
spf-checkdomain, domainAscii, found, record, recordCount, terms, allResult, lookups, includes, signals, valid, attention
dmarc-checkdomain, domainAscii, found, record, foundAt, inherited, policy, subdomainPolicy, effectivePolicy, percentage, alignment, reports, signals, valid, attention
dkim-checkdomain, domainAscii, selectorGiven, selectorsTried, keys, signals, attention
email-verifydomain, domainAscii, status, syntaxValid, acceptsMail, mx, disposable, role, freeMail, suggestion, signals, attention
website-agedomain, domainAscii, rdapAvailable, found, registeredDomain, registered, updated, expires, ageDays, registrar, status, campaigns, signals, attention
domain-popularitydomain, domainAscii, ranked, rank, rankedDomain, refSubnets, refIps, listSize, updated, source
website-legitdomain, domainAscii, verdict, official, brand, ageDays, registered, ranked, rank, campaigns, signals, linkFlags, attention, checks

Credits and limits

Note

Pro gives you 20 free credits every month

Each API call costs 1 credit. Monthly credits are used first.

Regenerating disables your previous keys. Your credit balance stays the same.

cURL
curl 'https://api.nocall.io/v1/data/account' \
  --header "Authorization: Bearer $NOCALL_API_KEY"

Retries and bulk lookups

Generate a fresh Idempotency-Key for each new operation. Keep that key only to retry the same operation with the same input.

Idempotency-Key is optional for single lookups and required for bulk: 8–128 characters (letters, digits, dots, hyphens, underscores or colons). When retrying, keep the same key, path, API key and body. A replay is not charged again. Check the balance before retrying an ambiguous response.

A batch accepts up to 50 inputs. product selects one of the operations listed in the example. There must be enough credits for all valid inputs before starting; only completed valid results are charged. Concurrent requests share the balance: if it runs out before the final debit, the request returns 429 without charging it.

Idempotency-Key
8–128 ASCII: A–Z a–z 0–9 . _ : -
TTL: 24 h
product
phone-lookup
phone-risk
carrier-lookup
reverse-phone-lookup
phone-exposure
cURL
REQUEST_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"}]}'

Troubleshooting

HTTPInterpret the result
401The key is missing, Bearer format is incorrect, or the key is expired or revoked. Check the header or generate a new key in your account.
403You need credits: the 20 a month included with an active Pro account, or credits bought on your account page. An account with neither receives 403 pro_required.
400 / 422Check the JSON, phone, country and Idempotency-Key. Validation errors do not consume credits.
409The idempotency key was used with another body, or the request is still processing. To retry the same operation, keep its body and wait.
429Credits are exhausted or the request-rate limit was reached. Check /account and X-RateLimit-Remaining. Honor Retry-After when present. ai_busy means the AI is busy: the request is not charged; retry after Retry-After.
500 / 503The service or provider is unavailable, or the beta is disabled. Wait and retry with the same Idempotency-Key; avoid immediate retry loops. tool_warming means the tool is still starting: the request is not charged; retry after Retry-After.