Real-time validation of US and Canada phone numbers: 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).
POSThttps://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 or 11 digits. A leading 1 country code is fine. 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.
dncOther
boolean
No
Scrub the number against state do-not-call registries and our national complainer list. Adds the dnc* fields. Free — no extra credit. See the coverage note under State DNC & Complainers: 11 states are not covered, and dncStateCovered tells you when an empty result means "not checked" rather than "clear".
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 (dncOther is 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
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 is reachable. Safe to message.
"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 as the carrier recycles the number.
"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 registry checks — those are the dnc* fields returned by the free dncOther add-on.
"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 carrier DIP (Database 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
Returned only when landlineSmsLookup: true is set. "true" if a landline messaging lookup was actually performed (the number is a landline); "false" if the add-on was requested but the lookup did not apply (e.g. a mobile number). Omitted entirely when the add-on is not requested.
"false"
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
A free add-on (dncOther: true) that screens numbers against state
do-not-call registries and our national complainer list. Coverage: 40
states, refreshed weekly. We do not hold registry data for Florida,
Colorado, Indiana, Massachusetts, Missouri, Pennsylvania, Texas, Wyoming, Louisiana,
Oklahoma, or Tennessee — those states require direct registration, so numbers
there return an empty dncStateResult that means "not checked", not
"clear". Always branch on dncStateCovered first. This scrub does not
query the federal Do-Not-Call registry, and it never changes action
— the results are informational.
Field
Type
Description
Example
dncOtherChecked
string
Returned only when dncOther: true is set (a free add-on — no extra charge). "true" when the DNC scrub ran; "error" when the check could not be completed — in that case treat dncStateResult and dncComplainerResult as unavailable, never as clear.
"true"
dncStateResult
string
"STATE DNC" when the number appears on its state's do-not-call registry; empty otherwise. An empty value only means "clear" when dncStateCovered is "true". We hold registry data for 40 states, refreshed weekly; for the 11 states we do not cover (Florida, Colorado, Indiana, Massachusetts, Missouri, Pennsylvania, Texas, Wyoming, Louisiana, Oklahoma, Tennessee) an empty result means the state was not checked, and you must scrub against that state's registry yourself.
"STATE DNC"
dncComplainerResult
string
"DNC COMPLAINER" when the number appears on our national complainer list — roughly 700,000 numbers with a documented history of DNC/TCPA complaints; empty otherwise. This list is nationwide and is not affected by state registry coverage.
""
dncStateCovered
string
"true" when the number's state do-not-call registry is in our data, derived from the phone's area code (the state the scrub actually checks — deliberately not geoState, which can reflect a provided IP). "false" for the 11 uncovered states, Canadian and territory numbers, and unrecognized area codes. When "false", treat dncStateResult as no-data rather than clear.
"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 or 11 digits) 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 paused pending verification. New accounts get a one-time review checkpoint at high volume; we’ll have emailed you. Reply to that message or contact us and we’ll clear it. 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.
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.