State do-not-call scrub for outbound calling and SMS
The federal Do-Not-Call registry gets all the attention, but it is not the only list that can cost you. Most US states run their own do-not-call registries, several with penalties that are enforced separately from — and on top of — federal exposure. And beyond the registries sits a quieter risk: numbers whose owners have lodged complaints against telemarketers before, who are disproportionately likely to complain about you next.
Most teams scrub state registries late, rarely, or never, because it traditionally means buying and merging per-state files on your own schedule. Two free flags fold both checks into the lookup you are already making.
The fix: two booleans, zero extra credits
Set dncState: true and dncComplainer: true on any request to
POST /v1/lookup (or tick the matching options on a bulk CSV job). The state check
screens the number against registry data covering 38 states plus DC, refreshed
weekly. The complainer check screens it against our national list of roughly
700,000 numbers belonging to people who have lodged complaints against
telemarketers but haven't sent a demand letter or filed suit. Each check reports whether it
ran and what it found. credits_used does not change. (The older
dncOther: true still turns on both, but it's deprecated.)
What you get back
| Field | Type | Example | Meaning |
|---|---|---|---|
dncStateChecked | string | "true" | Present only when the state check ran: "true", or "error" if it couldn't complete — treat the result as unavailable, never as clear. Absent in the 12 uncovered states, which means "not checked". |
dncStateResult | string | "STATE DNC" | Set when the number appears on its state's do-not-call registry; empty otherwise. Present only when dncStateChecked is "true". |
dncComplainerChecked | string | "true" | Present only when the complainer check ran: "true", or "error" if it couldn't complete. |
dncComplainerResult | string | "DNC COMPLAINER" | Set when the number is on our national complainer list; empty otherwise. Nationwide — unaffected by state coverage. |
See the State DNC & Complainers field group in the docs for the full reference.
The honest part: coverage
We hold registry data for 38 states plus DC. Twelve states — Colorado, Florida, Indiana, Louisiana, Massachusetts, Mississippi, Missouri, Oklahoma, Pennsylvania, Tennessee, Texas, and Wyoming — only distribute their lists to organizations that register with the state directly, so they are not in our data. A Dallas number comes back with no state result at all, because Texas wasn't checked.
Most data vendors let that ambiguity ride. We don't: the state check reports itself only
when it ran, so your suppression logic can branch on it explicitly — suppress on a
match, trust a clear result when dncStateChecked is "true", and fall
back to your own per-state scrub file when it's absent.
A complete request
curl --request POST \
--url 'https://api.checkthatphone.com/v1/lookup' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"phone": "8182925409",
"dncState": true,
"dncComplainer": true
}' A state-registry match looks like this:
{
"success": true,
"credits_used": 1,
"data": {
"subscriber": "8182925409",
"optDate": "2026-08-13T17:01:48.188Z",
"action": "send",
"deliverable": "true",
"nanpType": "mobile",
"blackList": "false",
"dip": "success",
"dipLrn": "8182925409",
"dipPorted": "false",
"dipOcn": "6010",
"dipCarrierSubType": "WIRELESS",
"dipCarrier": "AT&T",
"dipCarrierType": "mobile",
"dncStateChecked": "true",
"dncStateResult": "STATE DNC",
"dncComplainerChecked": "true",
"dncComplainerResult": "",
"dncOtherChecked": "true",
"dncStateCovered": "true",
"geoState": "CA",
"geoCity": "agoura hills",
"geoCountry": "US",
"timezone": "America/Los_Angeles",
"tzOffset": 8,
"geoSource": "area-code",
"error": "false",
"smsEligible": "true"
}
}
Notice two things: credits_used: 1 — the checks added nothing to the bill
— and action is still send. A DNC match is informational by
design: whether a registered number is contactable depends on consent you may already hold
(an existing business relationship, prior express written consent), so the routing decision
stays yours.
How to wire it up
1. Turn it on everywhere (recommended)
Both checks are free, so the simplest posture is dncState: true and
dncComplainer: true on every lookup you already make. Suppress on
dncStateResult or dncComplainerResult matches unless you hold
documented consent, and log dncStateChecked with the result for your audit
trail.
2. Bulk scrub before a campaign
Tick the State DNC and DNC complainers options on a bulk CSV upload and the
result file carries their columns for every row. A blank dncStateChecked cell
means the state wasn't checked. Registry data refreshes weekly, so re-scrub
long-running lists on at least that cadence.
3. Layer it with the litigator scrub
The litigator filter catches professional plaintiffs; the DNC scrub catches registered consumers and complaint-history numbers. They overlap less than you'd hope, which is exactly why running both is the standard posture for outbound compliance.
State DNC scrub: common questions
Why are these checks free when the other add-ons cost a credit?
The state-DNC and complainer checks run against data we already hold, in the same call as the live carrier dip — there is no per-lookup cost on our side worth metering. The litigator and landline-SMS add-ons query separate paid data layers, which is why those carry a surcharge.
Which states are covered?
38 states plus DC, refreshed weekly. The 12 states we do not hold registry data for are Colorado, Florida, Indiana, Louisiana, Massachusetts, Mississippi, Missouri, Oklahoma, Pennsylvania, Tennessee, Texas, and Wyoming — those registries require direct registration with the state. The state check is skipped for numbers there, and dncStateChecked is absent, so you can tell per number which situation you are in.
Does a DNC match change the action field?
No. Unlike a litigator hit, a DNC match never rewrites action — the fields are informational, because whether a registered number is contactable depends on your consent posture (an existing business relationship or prior express consent can permit contact). Your suppression logic decides.
Is the federal Do-Not-Call registry included?
No. The federal registry is outside what these checks cover — you must scrub against it separately, whatever your existing process for that is. These checks cover the state-level registries and complainer history that most teams skip.
What this isn't
This is not federal DNC compliance — we do not check the national registry, and you must honor it through your own scrub process. It is also not a consent record: a number absent from every list can still be wrong to contact without underlying consent, and a number on a state registry can be fine to contact with it. Treat the scrub as a defensive data layer feeding your compliance logic, not as the logic itself.
Pricing for this use case
Free, on every plan, including the free tier and bulk CSV jobs. A scrubbed lookup costs exactly what the lookup costs — 1 credit — and the flag adds nothing on top. There is no catch to look for: the data layers this scrub reads are ones we already maintain, so we'd rather every campaign that runs through us be scrubbed than meter it.
See the pricing page for the full plan grid.
Related
- Field reference: State DNC & Complainers in the docs
- Background reading: Litigator scrub vs DNC registry vs internal opt-out
- Background reading: Opt-out hygiene: keeping your suppression list defensible
- Companion add-on: TCPA litigator scrub
- Scrubbing a whole list: Bulk phone validation (CSV upload)
- Back to all use cases