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

FieldTypeExampleMeaning
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