APIUpdated 2026-07-17

API: DNC Scrubbing Jobs

Compliance-scrub lists with DNC and phone verification always on via /dnc-jobs.

The /dnc-jobs family mirrors bulk trace jobs with one difference: the dnc and phone_verification add-ons are always on. It exists for one workflow — compliance-scrubbing lists you already own before your dialer touches them. Every traced phone comes back with DNC/TCPA flags and verification columns, so your team never cold-calls a number on the federal Do Not Call registry by accident. For why this matters before every campaign, read our DNC compliance article.

Endpoints

  • POST /dnc-jobs — create a scrub job (JSON rows, raw CSV, or multipart, exactly like POST /jobs).
  • GET /dnc-jobs — list jobs that ran with the DNC scrub, newest first (page, per_page default 20, max 100).
  • GET /dnc-jobs/{id} — status, progress, and result links.
  • GET /dnc-jobs/{id}/results — paginated JSON rows.
  • POST /dnc-jobs/{id}/retry-webhook — re-deliver the completion callback.

Note that GET /dnc-jobs/{id}only resolves jobs created with the DNC add-on — a plain trace job's id returns 404 not_found here.

Creating a DNC job

The request shape is identical to POST /jobs: a rows array (or CSV upload) with address, city, and state required per row, plus optional filename and callback_url. You may pass extra add_ons; dnc and phone_verification are added automatically either way.

Request
curl -X POST https://data.acquiredcrm.com/api/v1/dnc-jobs \
  -H "Authorization: Bearer ad_live_XXXX" \
  -H "Content-Type: application/json" \
  -d '{
    "filename": "dnc-scrub",
    "rows": [
      {"first_name":"John","last_name":"Doe","address":"123 Main St","city":"Phoenix","state":"AZ","zip":"85001"}
    ],
    "callback_url": "https://example.com/hooks/dnc-done"
  }'
Response
HTTP 202
{
  "job_id": "6d2a91f0-4b3c-4e8d-a7f1-2b9c8d7e6f50",
  "status": "processing",
  "total_rows": 1,
  "credits_charged": 2,
  "add_ons": ["dnc", "phone_verification"],
  "environment": "production"
}

CSV uploads work exactly as they do for bulk jobs — Propwire/PropStream exports unmodified, options as query parameters:

Request (CSV body)
curl -X POST "https://data.acquiredcrm.com/api/v1/dnc-jobs?filename=dnc-scrub" \
  -H "Authorization: Bearer ad_live_XXXX" \
  -H "Content-Type: text/csv" \
  --data-binary @call_list.csv

What comes back per row

Results include the standard trace columns (matched names, phones, emails) plus the DNC and verification fields the forced add-ons unlock. Fetch them from GET /dnc-jobs/{id}/results as flat JSON:

Response (results)
{
  "job_id": "6d2a91f0-4b3c-4e8d-a7f1-2b9c8d7e6f50",
  "total_rows": 1,
  "page": 1,
  "per_page": 100,
  "rows": [
    {
      "property_address": "123 Main St",
      "matched_first_name": "John",
      "matched_last_name": "Doe",
      "primary_phone": "6025551234",
      "primary_phone_type": "Mobile",
      "dnc_tcpa": "true",
      "primary_phone_dnc": "true",
      "primary_phone_tested": "true",
      "primary_phone_reachable": "true",
      "primary_phone_last_reported_date": "2026-05-02",
      "mobile_phone_1": "6025551234",
      "mobile_phone_1_dnc": "true",
      "mobile_phone_1_tested": "true",
      "mobile_phone_1_reachable": "true",
      "email_1": "john@example.com"
    }
  ]
}
  • DNC flagsdnc_tcpa (overall DNC/TCPA flag for the match) plus per-phone flags: primary_phone_dnc, mobile_phone_1_dncmobile_phone_5_dnc, and landline_phone_1_dnclandline_phone_5_dnc.
  • Phone verification — per-phone _tested, _reachable, and _last_reported_date columns (e.g. mobile_phone_1_tested, mobile_phone_1_reachable), so you can prioritize numbers that actually connect.

The same data is in the signed CSV at download_url (valid 1 hour on the job detail response). Route true DNC flags out of your dialer and into mail or other compliant channels.

Pricing

DNC jobs bill per record at your trace rate plus the two forced add-ons: base_trace + dnc + phone_verification (defaults 1 + 0.5 + 0.5 = 2 credits per row; entity rows substitute llc_trust_trace). Billing follows the bulk-job rules: charged upfront per row, unmatched rows are not refunded, and a failed job is fully refunded. Confirm your rates with GET /pricing.

Errors and completion

  • 402 insufficient_credits — balance below the job cost.
  • 429 job_in_progress — another trace job is already running on the account.
  • 409 job_not_complete — results requested before the job resolved.

DNC jobs fire the same signed completion webhooks as regular bulk jobs — see the webhooks guide — and POST /dnc-jobs/{id}/retry-webhook re-delivers a missed callback. If you only need occasional scrubbing, the dashboard bulk flow offers the same add-ons with checkboxes instead of code.