Reference

Phone validation API documentation

Real-time validation of US and Canada phone numbers: live carrier dip, line type, portability, deliverability, and geolocation in a single REST call. Sign up for a free API key (500 lookups/month, hard-capped).

POST https://api.checkthatphone.com/v1/lookup

Authentication

Pass the API key from your dashboard as a bearer token in the Authorization header. Keep it secret: anyone with the key can spend your credits.

Header Value
Authorization Bearer YOUR_API_KEY
Content-Type application/json

Request Body

Send a JSON body with the following fields:

Parameter Type Required Description
phone string Yes US or Canada phone number. Accepts any common format — non-digit characters (spaces, dashes, parentheses, +) are stripped and the result must be 10 digits, or 11 digits starting with the 1 country code. E.g. "8182925409", "(818) 292-5409", "+1-818-292-5409".
ip string No IPv4 or IPv6 address of the subscriber. Enables precise GeoIP/timezone enrichment when available.
litigatorFilter boolean No Check the number against our TCPA litigator database. Adds litigator, litigator_type, litigator_name to the response. +1 credit per lookup.
landlineSmsLookup boolean No If the number is a landline, perform an SMS eligibility lookup. Adds dipMessaging* fields. Mobile numbers are unaffected. +1 credit per landline lookup.
dncState boolean No Run the state do-not-call check. Adds dncStateChecked and dncStateResult. Free — no extra credit. Covers 38 states plus DC; see State DNC & Complainers for the 12 states it doesn't cover.
dncComplainer boolean No Check the number against our national DNC complainer list. Adds dncComplainerChecked and dncComplainerResult. Free — no extra credit.
dncOther (deprecated) boolean No Turns on both DNC checks. Use dncState and dncComplainer instead; responses to requests that send dncOther carry a Deprecation header.

Response Envelope

Every response is wrapped in a standard envelope:

Field Type Description
success boolean true if the lookup completed
credits_used number Credits this call consumed: 1 for the base lookup plus 1 for each paid add-on applied (the DNC checks are free). Also returned in the X-Credits-Used response header. Failed lookups (HTTP 4xx/5xx errors, or upstream service errors) do not consume credits.
data.* object The per-field result described in the Response Fields section below

Official SDKs

Zero-dependency, typed clients that cover the full API surface including all add-on flags. Both are MIT-licensed and open source on GitHub.

Code Examples

cURL

curl --request POST \
  --url 'https://api.checkthatphone.com/v1/lookup' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"phone":"8182925409","ip":"136.38.145.14","litigatorFilter":false,"landlineSmsLookup":false,"dncState":false,"dncComplainer":false}'

JavaScript

const response = await fetch('https://api.checkthatphone.com/v1/lookup', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    phone: '8182925409',
    ip: '136.38.145.14',
    litigatorFilter: false,
    landlineSmsLookup: false,
  }),
});
const result = await response.json();
console.log(result.data);

Python

import requests

response = requests.post(
    'https://api.checkthatphone.com/v1/lookup',
    headers={
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json',
    },
    json={
        'phone': '8182925409',
        'ip': '136.38.145.14',
        'litigatorFilter': False,
        'landlineSmsLookup': False,
    },
)
result = response.json()
print(result['data'])

With add-on features

# Enable add-ons per request. litigatorFilter and landlineSmsLookup are paid;
# dncState and dncComplainer (the DNC checks) are free.
curl --request POST \
  --url 'https://api.checkthatphone.com/v1/lookup' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"phone":"8182925409","litigatorFilter":true,"landlineSmsLookup":true,"dncState":true,"dncComplainer":true}'

Example Response

{
  "success": true,
  "credits_used": 1,
  "data": {
    "subscriber": "4155551234",
    "optDate": "2026-05-23T06:58:42.048Z",
    "action": "send",
    "deliverable": "true",
    "reason": "",
    "nanpType": "mobile",
    "blackList": "false",
    "dip": "success",
    "dipLrn": "4155551234",
    "dipPorted": "false",
    "dipOcn": "6214",
    "dipCarrier": "AT&T",
    "dipCarrierSubType": "WIRELESS",
    "dipCarrierType": "mobile",
    "geoState": "CA",
    "geoCity": "san francisco",
    "geoCountry": "US",
    "geoSource": "area-code",
    "timezone": "America/Los_Angeles",
    "tzOffset": 8,
    "error": "false"
  }
}

Response Fields

All fields below appear inside data on the response envelope. Fields in the Landline SMS Lookup, Litigator Filter, and State DNC & Complainers groups are only present when the corresponding request flag is enabled.

Subscriber Info

Field Type Description Example
subscriber string The phone number that was queried. "8182925409"
optDate string ISO 8601 timestamp of when the query was processed. "2026-05-21T18:55:56.532Z"

Deliverability

Field Type Description Example
action string Recommended SMS list action. Returns one of:
  • "send" — the number passed the enabled technical and screening checks. This does not establish consent or legal authorization to contact the subscriber.
  • "unsubscribe" — don't message. Triggered by a TCPA litigator match, a non-mobile / non-SMS-capable carrier, an internal blacklist hit, or a carrier deactivation in the last 45 days. Check reason for the specific cause and blackList / deactivationDate for the extras.
  • "error" — the request was malformed (missing or invalid phone). Retrying produces the same error.
"send"
deliverable string Composite reachability summary covering line type, blacklist, litigator filter, and 45-day deactivation checks. Always agrees with action — "true" when action is "send", "false" when action is "unsubscribe". Not a real-time delivery probe; carriers do not guarantee actual delivery. "true"
error string "true" if an error occurred while processing this lookup. Inspect reason for details. "false"
reason string Human-readable explanation for the action. The exact strings we return:
  • "Associated with TCPA Litigator DO NOT CONTACT"
  • "Not a valid mobile number"
  • "Blacklisted Subscriber"
  • "Number deactivated by carrier id <N> on <date>"
"Number deactivated by carrier id 6529 on 2025-12-04"
deactivationDate string Date of the most recent deactivation for this number, when known. Our deactivation data refreshes daily; expect a 1–7 day lag between an actual carrier deactivation and the value appearing here. Entries expire after 45 days, and the field clears as soon as the number is reactivated. Not a reassignment signal: a reactivated number shows no deactivationDate whether it went back to the same subscriber or a new one. "2019-06-01"
blackList string "true" when the number is on our internal blacklist of flagged numbers OR when the litigator filter matched (litigator hits force this flag). Inspect reason and litigator to disambiguate which check triggered it. Distinct from the do-not-call checks — those are the dnc* fields returned by the free dncState and dncComplainer checks. "false"
smsEligible string Present as "true" when the number is eligible to receive SMS — an active mobile, or a landline confirmed SMS-capable when landlineSmsLookup: true is set. Omitted entirely when not eligible. The inverse of doNotSms. "true"
doNotSms string Present as "true" when the number is NOT eligible to receive SMS — either undeliverable (not a mobile, deactivated, or blacklisted) or a known TCPA litigator. Omitted entirely otherwise. The inverse of smsEligible. "true"

NANP

Field Type Description Example
nanpType string Line type per the North American Numbering Plan. Values: "mobile", "landline", "not-mobile". "mobile"
nanpCarrier string Carrier name per NANP. Not authoritative due to number porting — prefer dipCarrier when available. "verizon"

Carrier DIP

Field Type Description Example
dip string Status of the live carrier dip lookup. One of "success", "error", "invalid". "success"
dipLrn string Local Routing Number — the number used for actual call/SMS routing. Critical for ported numbers. "8182925409"
dipPorted string "true" when dipLrn differs from subscriber — the standard industry method for detecting that a number has been ported (transferred) to a different carrier than originally assigned. "false"
dipOcn string Operating Carrier Numeric ID — unique identifier code for the current carrier operating this number. "6010"
dipCarrier string Authoritative carrier name from DIP lookup. "AT&T"
dipCarrierType string Broad carrier type. One of "mobile", "landline", "invalid", "undefined". "mobile"
dipCarrierSubType string Carrier sub-classification. Plain-English codes: WIRELESS (mobile carrier), PCS (Personal Communications Service — also mobile), CLEC (Competitive Local Exchange Carrier — landline), ILEC (Incumbent Local Exchange Carrier — wireline), RBOC (Regional Bell Operating Company), IPES (IP-Enabled Service / VoIP), CAP (Competitive Access Provider), LRSL (Local Resale carrier), ULEC (Unbundled Local Exchange Carrier), WRSL (Wireless Resale / MVNO), GENERAL (unclassified). The literal string "undefined" occasionally appears as upstream-data noise from carrier records and is not our classification. "WIRELESS"

Landline SMS Lookup

Field Type Description Example
dipMessagingLookup string Present only when landlineSmsLookup: true is set and the lookup actually ran, i.e. the number is a landline: "true". Absent for mobile numbers (the lookup does not apply and is not charged) and when the add-on is not requested. "true"
dipMessagingEnabled string Returned only when landlineSmsLookup: true is set. "true" if landline messaging is enabled for this number. Only meaningful alongside dipMessagingLookup: "true". "false"
dipMessagingProvider string Name of the messaging provider serving this landline number. Populated only when the landline messaging lookup returned a positive match. "Google (Grand Central) - SVR"
dipMessagingRefId string Messaging provider's reference ID for this number. "us_acme"
dipMessagingCountryCode string Two-letter country code of the messaging provider. "US"

Litigator Filter

Field Type Description Example
litigator string "true" if the subscriber is a suspected TCPA litigator. Do not contact. Returned when litigatorFilter: true is set on the request. "false"
litigator_type string Litigator classification. One of "litigator", "plaintiff", "agitator". All three carry the same recommended action ("unsubscribe") — the value is informational about how the match was classified in our source data; treat the action identically across all three. "plaintiff"
litigator_name string Name on record for the matched litigator. Present when a likely name is on record; not all matches have a name. Treat as potentially sensitive — handle carefully and do not log unnecessarily. "John Smith"

State DNC & Complainers

Two free checks. dncState: true runs the state do-not-call check; dncComplainer: true screens the number against our national complainer list. State coverage: 38 states plus DC, refreshed weekly. Not covered: Colorado, Florida, Indiana, Louisiana, Massachusetts, Mississippi, Missouri, Oklahoma, Pennsylvania, Tennessee, Texas and Wyoming. For numbers in those states the state check doesn't run and dncStateChecked is absent. Each check reports itself only when it ran: an absent *Checked field means "not checked", never "clear". Neither check queries the federal Do-Not-Call registry, and neither changes action — the results are informational. dncOther: true still turns on both checks but is deprecated.

Field Type Description Example
dncStateChecked string Present only when the state DNC check ran: "true", or "error" if it could not be completed (treat the state result as unavailable, never as clear). Absent when dncState was not requested, and for numbers in the 12 states the state check does not cover: Colorado, Florida, Indiana, Louisiana, Massachusetts, Mississippi, Missouri, Oklahoma, Pennsylvania, Tennessee, Texas and Wyoming. Absent always means "not checked", never "clear". "true"
dncStateResult string "STATE DNC" when the state do-not-call check matches the number; an empty string when it does not. Present only when dncStateChecked is "true". The state check covers 38 states plus DC, refreshed weekly. "STATE DNC"
dncComplainerChecked string Present only when the complainer check ran: "true", or "error" if it could not be completed (treat the result as unavailable, never as clear). Absent only when dncComplainer was not requested. "true"
dncComplainerResult string "DNC COMPLAINER" when the number is on our national complainer list; an empty string when it is not. Present only when dncComplainerChecked is "true". The list holds roughly 700,000 numbers belonging to people who have lodged complaints against telemarketers but have not sent a demand letter or filed suit. Informational: a match never changes action. ""
dncOtherChecked (deprecated) string Legacy. "true" when either DNC check ran, "error" if it failed; absent when neither ran. Use dncStateChecked and dncComplainerChecked, which report each check separately. "true"
dncStateCovered (deprecated) string Deprecated: use dncStateChecked. Returned whenever the state check is requested: "true" when dncStateChecked is "true", "false" otherwise. Kept so existing integrations keep working. "true"

IP & Geolocation

Field Type Description Example
ipResult string Validation result for the IP address provided with the request. Examples: "valid-v4", "valid-v6". Only populated when an ip parameter is included. "valid-v4"
geoCountry string Two-letter country code where the number is registered. "US"
geoState string Two-letter US state code. "CA"
geoCity string City associated with the phone number, derived from the area code or the provided IP address. "Riverside"
geoMetro number Metro area code (DMA code) for the geographic region of the phone number. 803
geoSource string Source of the geographic data. "ip" when derived from a provided IP address, "area-code" when derived from the phone number itself. "ip"
timezone string IANA timezone identifier for the phone number's location. "America/Los_Angeles"
tzOffset number UTC offset in hours for the phone number's timezone. 8

Errors

Standard HTTP status codes apply. The response envelope carries a structured error when applicable.

Status Meaning
400 Invalid request — a missing or malformed phone (must be 10 digits, or 11 starting with 1) or an unparseable body. No credit charged. Fix the input; retrying the same request returns the same error.
401 Missing or invalid API key.
402 Account safety limit reached for this billing period (paid plans): a protective cap in case the usage isn’t intentional. If it is, contact us and we’ll raise it. Requests resume as soon as the limit rises or your next period starts. No credit charged.
429 Rate limit exceeded, or your monthly quota is used up (Free tier). Back off and retry, or upgrade your plan. No credit charged. Rate limits aren’t a fixed published number: each account’s limit grows with its billing history.
502 Upstream validation service errored. No credit charged. Safe to retry; contact support if it persists.
503 Service briefly busy — a transient, retryable condition. Honor the Retry-After header (retry after a short wait). No credit charged.

Verifying a large list?

You can also upload a CSV from your dashboard. No SDK or batching code required. Up to 1M rows per file, same fields per row, same per-unique-number pricing as this API. See Features → Two ways to call.

Ready to get started?

Sign up free and get an API key in seconds: 500 lookups per month on the free tier.