vicigeeksimple guides
Browse
All guides

VICIdial & agents · Suppression list configuration

Set up DNC scrubbing in VICIdial: internal lists and DNC.com

Load and scope VICIdial's internal DNC list, wire up the optional DNC.com batch and inbound scrubs, and prove a specific number is actually suppressed before you trust a report.

Reader setup

Before you start

  1. A read-only database account for the SQL samples below — see Create a read-only database account for safe VICIdial queries if you do not have one yet — or an admin account for the Lists → DNC screens
  2. One inactive test campaign and an isolated test list, so you are not reconfiguring a live campaign to learn this
  3. The named jurisdiction your calls fall under, since TCPA is U.S. federal law and state, provincial, and other countries' rules differ
Expected result
You will configure system- and campaign-level DNC scope, wire up the optional DNC.com batch and inbound scrubs, and produce a verifiable record that one specific number is blocked.
Before making changes
This is technical configuration guidance, not legal advice; completing it does not by itself establish that calling any number is lawful in your jurisdiction.

01 / 08

Separate internal filtering from external scrubbing

Use one fictional test number in an isolated list. Check the relevant DNC setting, try each intended call path and record whether the call is blocked; investigate any path that behaves differently.

VICIdial has internal DNC lists and an optional DNC.com integration. Internal enforcement depends on campaign settings and the call path; DNC.com batch and inbound checks are separate, optional integrations. Confirm the installed revision and test each intended path.

This is configuration guidance, not legal advice, and it does not establish that any call is lawful. The Telephone Consumer Protection Act (TCPA) is United States federal law; state, provincial, and other countries' do-not-call and telemarketing rules differ and can be stricter. For the legal-boundary and carrier-signaling material — what a DNC check or STIR/SHAKEN attestation does and does not prove, and how far a technical control actually reaches — see the companion article “VICIdial DNC and STIR/SHAKEN: controls, limits and legal review”; this guide is the hands-on counterpart and does not repeat that legal-review discussion.

In plain language: a lead is one contact record, a phone number plus its call history; a list is a named batch of leads you load and dial as a unit; a campaign is one calling project, meaning which leads get dialed, by which agents, under which dialing settings; a DID (direct inward dial number) is a phone number that routes an inbound call into VICIdial; a carrier is the phone company that carries your calls to the public telephone network; a disposition is the outcome code an agent saves after a call, such as SALE or DNC; a hopper is the queue of leads VICIdial has already decided are eligible to dial next.

  • Name the jurisdiction (TCPA plus any state, provincial, or other country rule) that applies to this campaign before you configure anything.
  • Decide whether you need system-wide suppression, campaign-only suppression, or both.
  • Confirm whether DNC.com is even in use; it requires its own paid account and is entirely optional.
Trace path · read left to right
01Internal DNC list02Campaign DNC scope03DNC.com scrub + audit trail
Reference screenshots 3 images

Reference capture

Reference screens from the demo

Captured on an isolated VICIdial demo: Administration screens on September 24, 2026, and the idle Agent screen on August 11, 2026. Each caption states its own capture time, and every sanitized image helps you recognize a related screen; none proves that this article's call, command, or result occurred.
Step 1 · Find lead filters

Open the Filters workspace

Open to enlarge
Sanitized VICIdial Lead Filter Listings page showing where filters are managed
Captured September 24, 2026 at 21:53:16 UTC on the authorized isolated demo.
Capture detailsNo filters are defined for the fixture account, so the listing is empty. This is filter configuration, not evidence that leads were selected, excluded, scrubbed, or called.
Step 2 · Understand Do Not Call

Read the shared DNC status definitions

Open to enlarge
Sanitized VICIdial System Statuses page showing status names, categories, and selectable flags
Captured August 11, 2026 at 16:21:13 UTC on the authorized isolated demo.
Capture detailsThis is shared status configuration with no customer or call rows; it does not prove that any status was used.
Step 3 · Check campaign filter selection

Find the campaign's Lead Filter field

Open to enlarge
Sanitized VICIdial campaign detail page showing dialing, hopper, script, and call-launch settings
Captured August 11, 2026 at 16:20:58 UTC on the authorized isolated demo.
Capture detailsIdentifiers were redacted. Visible settings belong to an isolated configuration page and do not prove that calls were launched or completed.

02 / 08

Step 1 — Load and manage the internal DNC list

VICIdial keeps a system-wide internal list in the vicidial_dnc table, one row per phone number, checked across every campaign that turns the check on. A separate table, vicidial_campaign_dnc, pairs a phone number with one campaign_id, so a number can be blocked only for a single campaign without ever touching the system-wide list.

Load and remove entries through Lists → the DNC add/delete screen, or through the add_dnc_phone and delete_dnc_phone Non-Agent API functions. Do not write to either table directly: both supported paths write a matching row to vicidial_dnc_log, which is what lets you prove later who suppressed a number and when.

The admin screen accepts more than one campaign at a time. SYSTEM_INTERNAL targets the global list; ALL_CAMPAIGNS, ALL_ACTIVE_CAMPAIGNS, ALL_DNC_CAMPAIGNS, and ALL_ACTIVE_DNC_CAMPAIGNS apply the same add or delete across every campaign that matches that description, which is convenient but also the fastest way to touch far more campaigns than you intended. Read the target value twice before submitting a delete.

Removing a number is the riskier direction of the two. The delete_from_dnc permission on a user account is what actually allows a deletion to go through; review who holds that permission the same way you would review any other destructive-action grant.

Use only an authorized synthetic number or approved aggregate in this check; keep real phone numbers and record identifiers private. Results for one call path do not prove another path.

Before you use it
Run through an authorized read-only database session, mysql --defaults-extra-file=/etc/vicidial-readonly.cnf. Replace <CAMPAIGN_ID> with one real campaign_id you are allowed to inspect; this only reads structure and counts.
Read-only internal DNC structure and counts
SHOW CREATE TABLE vicidial_dnc;SHOW CREATE TABLE vicidial_campaign_dnc;SELECT COUNT(*) AS system_dnc_rows FROM vicidial_dnc;SELECT COUNT(*) AS campaign_dnc_rows FROM vicidial_campaign_dnc WHERE campaign_id='<CAMPAIGN_ID>';
Evidence · ViciBox 12 demo capture · demo values substituted

Captured demo response · 2026-09-24 22:25 UTC. Any filtering, hidden values or test-only data are identified in the capture label. Select Replay transcript to read the recorded output.

Command output line: SHOW CREATE TABLE vicidial_dnc;
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| vicidial_dnc | CREATE TABLE `vicidial_dnc` (
`phone_number` varchar(18) NOT NULL,
PRIMARY KEY (`phone_number`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Command output line: SHOW CREATE TABLE vicidial_campaign_dnc;
+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| vicidial_campaign_dnc | CREATE TABLE `vicidial_campaign_dnc` (
`phone_number` varchar(18) NOT NULL,
`campaign_id` varchar(8) NOT NULL,
UNIQUE KEY `phonecamp` (`phone_number`,`campaign_id`),
KEY `phone_number` (`phone_number`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci |
+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Command output line: SELECT COUNT(*) AS system_dnc_rows FROM vicidial_dnc;
+-----------------+
| system_dnc_rows |
+-----------------+
| 0 |
+-----------------+
Command output line: SELECT COUNT(*) AS campaign_dnc_rows FROM vicidial_campaign_dnc WHERE campaign_id='KPISYN1';
+-------------------+
| campaign_dnc_rows |
+-------------------+
| 0 |
+-------------------+
Success looks like
Both tables match the documented single-column and two-column-unique-index design, and the counts are plausible for what you expect to be loaded.
Stop if
Stop if the account can write, either table has been altered from the documented structure, or the campaign_dnc_rows count is far higher or lower than expected for that campaign.
  • Confirm whether the number belongs on the system-wide list, a single campaign's list, or both.
  • Use the admin screen or the API, never a direct table write.
  • List accounts with delete_from_dnc permission, remove grants no longer needed and set a date to repeat the check.

03 / 08

Step 2 — Choose system-level vs. campaign-level scope

Two campaign settings decide whether either list is even consulted: use_internal_dnc controls the system-wide vicidial_dnc table, and use_campaign_dnc controls that campaign's own vicidial_campaign_dnc entries. Each accepts Y, N, or AREACODE — AREACODE blocks every number sharing the same area code as a listed entry, not just an exact match, which is useful when an entire region has opted out of a campaign rather than one number.

A third setting, use_other_campaign_dnc, lets one campaign also honor a second, named campaign's list without merging or duplicating the underlying rows. A fourth, callback_dnc, decides whether a scheduled callback re-checks DNC before it redials; leaving it DISABLED means a callback can still reach a number that was added to DNC after the callback was scheduled.

This is the gotcha that catches most new installs: a number sitting in vicidial_dnc or vicidial_campaign_dnc proves nothing about enforcement on its own. If the campaign's flag is N, the row is simply never read. Always check the list and the flag together, never one on its own.

Use only an authorized synthetic number or approved aggregate in this check; keep real phone numbers and record identifiers private. Results for one call path do not prove another path.

Before you use it
Run through the same read-only session, substituting one <CAMPAIGN_ID> you are authorized to inspect.
Read-only campaign DNC scope
SELECT campaign_id, use_internal_dnc, use_campaign_dnc, use_other_campaign_dnc, callback_dncFROM vicidial_campaignsWHERE campaign_id='<CAMPAIGN_ID>';
Evidence · ViciBox 12 demo capture · demo values substituted

Captured demo response · 2026-09-24 22:25 UTC. Any filtering, hidden values or test-only data are identified in the capture label. Select Replay transcript to read the recorded output.

Command output line: SELECT campaign_id, use_internal_dnc, use_campaign_dnc, use_other_campaign_dnc, callback_dnc FROM vicidial_campaigns WHERE campaign_id='KPISYN1';
+-------------+------------------+------------------+------------------------+--------------+
| campaign_id | use_internal_dnc | use_campaign_dnc | use_other_campaign_dnc | callback_dnc |
+-------------+------------------+------------------+------------------------+--------------+
| KPISYN1 | N | N | | DISABLED |
+-------------+------------------+------------------+------------------------+--------------+
Success looks like
You can state, for that exact campaign, whether the system list, the campaign list, another campaign's list, and callback re-checks are each active.
Stop if
Stop if any of the four values is unexpected, unset, or cannot be reconciled with what the campaign owner believes is configured.
  • Read use_internal_dnc and use_campaign_dnc together with the DNC tables, not instead of them.
  • Decide the AREACODE behavior deliberately; it blocks an entire area code, not one number.
  • Set callback_dnc to ENABLED unless you have a specific, documented reason not to.

04 / 08

Step 3 — Configure the optional DNC.com integration

Keep batch and inbound integration separate. Before configuring, obtain the current provider HTTPS scrub endpoint, private API login and project/campaign identifiers from your DNC.com account. Verify the installed script accepts that account/API version; the historical project example is a configuration reference, not current provider authorization.

In Admin → Settings Containers, create or reopen the private container ID DNCDOTCOM. Paste the reviewed key/value contract below only after replacing placeholders. VICI_LISTS uses hyphen-separated IDs, not an inclusive numeric range. The selected statuses must exist on this installation and remain excluded from campaign Dial Statuses until reviewed.

For this conservative worksheet create DCHOLD, DCCLR and DCDNC as non-dialable campaign statuses through the campaign’s status controls. Clean classification DCCLR is held for review, not automatically made callable. DCDNC/DCHOLD suppress or quarantine external results; do not infer lawful calling from a provider code.

  1. Save/reopen the reviewed private container. For a first batch use one inactive isolated list with provider-approved test fixtures; never submit customer numbers merely to learn the interface. Record prior lead statuses.
  2. Confirm the actual installed AST_DNCcom_filter.pl path and run its documented --lists=<ISOLATED_LIST_ID> invocation only in an independently authorized provider test. Check exit/result and vicidial_dnccom_filter_log for exactly those lead IDs; a clean exit alone is insufficient.
  3. For inbound screening, set only the spare test DID’s Filter Inbound Number to URL and its Filter URL to the local DNCcom_inbound_filter.php with phone=--A--phone_number--B--. Use the approved HTTPS host/path and R10 only for the documented North American ten-digit normalization. Reopen the DID.
  4. Verify inbound blocking separately using a provider-approved fixture and a bounded authorized test; inspect vicidial_dnccom_scrub_log and the intended caller result. An outbound batch log does not prove the DID filter.
  5. If either result is wrong, disable only this test job/filter, retain the container/logs and restore the recorded DID fields. Restore only known changed lead statuses through Admin/update_lead; do not delete real suppression entries to make a test pass.
Before you use it
Complete every placeholder privately and review every response code against the current paid account documentation. Define the three non-dialable statuses first; never publish this populated container.
Private DNCDOTCOM configuration worksheet
DNC_DOT_COM_URL => <CURRENT_PROVIDER_HTTPS_SCRUB_URL>LOGIN_ID => <PRIVATE_ACCOUNT_API_LOGIN>PROJ_ID => <ACCOUNT_PROJECT_ID>CAMPAIGN_ID => <ACCOUNT_CAMPAIGN_ID>VERSION => <SUPPORTED_ACCOUNT_API_VERSION>VICI_LISTS => <ISOLATED_LIST_ID>VICI_STATUS_SKIP => SALE-DNCSTATUS_X => DCHOLDSTATUS_C => DCCLRSTATUS_O => DCHOLDSTATUS_E => DCHOLDSTATUS_W => DCHOLDSTATUS_G => DCHOLDSTATUS_H => DCHOLDSTATUS_L => DCHOLDSTATUS_F => DCHOLDSTATUS_V => DCHOLDSTATUS_I => DCHOLDSTATUS_M => DCHOLDSTATUS_B => DCHOLDSTATUS_P => DCDNCSTATUS_D => DCDNCSTATUS_S => DCHOLDSTATUS_T => DCHOLDSTATUS_Y => DCHOLDINBOUND_FILTER => USADNC,PROJDNC,LITIGATOR,INVALIDINBOUND_CACHE => 0
Not executed · worksheet or reference text

This sample is a template or reading aid, not a terminal command. There is no output to show.

Success looks like
Reopening DNCDOTCOM shows the intended isolated list, skip statuses, mappings and inbound categories; it does not establish a successful provider request.
Stop if
Stop if the endpoint/version or code coverage is unknown, a status is dialable unexpectedly, or the container targets a live list.
Conservative example mappings, not legal clearanceScroll sideways to compare columns
ResultExample local statusWhy it remains held
C clean classificationDCCLRClassification is not consent/permission;review before any Dial Status inclusion.
D or P DNC matchDCDNCExclude from dialing and preserve the reason/log.
All other listed resultsDCHOLDReview the current provider code and account settings;unknown/unmapped results stop deployment.

You should seeConfiguration is complete only when the private container, non-dialable status mapping, isolated list and separate DID filter all reopen as intended. Provider batch/inbound acceptance remains unperformed here.

  • Confirm which list IDs are actually included in VICI_LISTS before the first run.
  • Set VICI_STATUS_SKIP to exclude already-worked statuses such as SALE, so a rescrub cannot overwrite a completed disposition.
  • Schedule the outbound batch job on inactive lists or after hours, since it is documented as batch-only.

05 / 08

Where a lead actually gets blocked in the call path

Suppression is checked at more than one point, and knowing which one fired matters when a call gets through that should not have. A batch worker, AST_DB_DNC_filter.pl, can pre-scrub a freshly loaded list against the system and campaign DNC tables and flip a matching lead's status to DNCL for a system match or DNCC for a campaign match, before that lead is ever eligible to dial.

Hopper fill selects eligible leads for hopper-based dialing. A lead absent from the hopper is not selected by that hopper path; manual-number entry and callbacks require their own checks.

Hopper-based outbound dialing and manual-number entry can follow different paths. Check DNC behavior separately for each mode and for scheduled callbacks, including the installed meaning of callback_dnc. Inbound DID screening is configured separately from outbound hopper selection.

The DNC disposition status itself — the one an agent or an API sets after a live contact asks to be removed — is a different thing again. That status records a request going forward; it does not retroactively prove the earlier call should have been blocked.

Use only an authorized synthetic number or approved aggregate in this check; keep real phone numbers and record identifiers private. Results for one call path do not prove another path.

  • Trace a suspect call through the batch pre-scrub, hopper fill, and callback flag in that order.
  • Check inbound DIDs separately; they do not share the outbound hopper path.
  • Do not treat a DNC disposition on one call record as proof the number was suppressed beforehand.

06 / 08

Prove one manual-number DNC refusal in an isolated lab

Worked path: manual-number entry, with internal DNC filtering enabled. This is a future authorized test recipe; no new call or rejection capture is claimed. Use a private isolated MANUAL campaign, an approved station and a known-working internal-only route so an unexpected filter failure cannot reach a customer/carrier.

Example raw phone_number 9001001 and phone_code 1 refer to the course’s internal19001001 route only if that exact route was independently prepared and verified. Store the raw9001001 in the DNC list, not the constructed19001001. Substitute your approved fixture consistently.

  1. Before activation, record campaign Dial Method, Manual Dial Filter, Use Internal DNC, Use Campaign DNC, other-campaign DNC and callback settings. Confirm the effective test route is internal only and the synthetic number is absent from DNC before this new test. If already present, record the existing state and do not remove it.
  2. On this source-checked SVN4037 branch, set Manual Dial Filter DNC and Use Internal DNC Y on the isolated campaign;save/reopen. The DNC filter gate is required for manual-number entry. Keep unrelated flags unchanged and obtain the test window before station login.
  3. Open Lists → DNC add/delete. Select ADD and SYSTEM_INTERNAL, enter raw9001001 once and submit. Read the result and verify the exact membership plus its vicidial_dnc_log ADD row. Use only the synthetic fixture;never use a real subscriber for this exercise.
  4. In a fresh authorized test Agent session, remain PAUSED. Open MANUAL DIAL, enter the raw test number and phone code in their own fields, and submit once. Expected result on this branch is the DNC refusal, not a connected customer call. Do not bypass the rejection or switch filters to continue.
  5. Record time, user, campaign, raw number, path and the exact returned DNC message. Have the telephony owner confirm no customer Originate/channel was created for that attempt and compare the relevant request/log. List membership plus an unrelated error is not a pass.
  6. If any customer leg starts, hang up the owned test leg, pause/stop the campaign and preserve evidence. Check the saved Manual Dial Filter, number normalization and installed path;do not retry blindly.
  7. For cleanup, log out the test station and restore recorded campaign/Active values. Remove this DNC entry only if the test created it and the owner approves its scoped reversal;use the supported delete path and verify its audit row. Existing DNC entries remain protected.
Before you use it
Use the authorized root/sudo read-only session and the raw synthetic number. These are configuration/history reads for the planned test; no capture is available. Before the scoped query, use the approved client to run SELECT CURRENT_USER(), DATABASE();stop if the identity or selected schema differs. Keep the option file root-owned0600. Save the block as a dedicated script and run it after replacing its placeholders;do not paste strict-mode/exit instructions into an existing interactive SSH session.
Read-only DNC list and lead checks
#!/usr/bin/env bashset -euo pipefailREADONLY_CNF=/etc/vicidial-readonly.cnfPHONE='<PHONE_NUMBER>'sudo mysql --defaults-file="$READONLY_CNF" -e "SELECT phone_number FROM vicidial_dnc WHERE phone_number='$PHONE';"sudo mysql --defaults-file="$READONLY_CNF" -e "SELECT phone_number, campaign_id FROM vicidial_campaign_dnc WHERE phone_number='$PHONE';"sudo mysql --defaults-file="$READONLY_CNF" -e "SELECT lead_id, list_id, status FROM vicidial_list WHERE phone_number='$PHONE';"
Reader-run example · not executed for this guide

This example has no recorded result here. Follow its preparation, expected result and stop conditions before using it.

Success looks like
Exact rows support identity and state checks;combine them with the refusal and no-origination observation to establish this one path.
Stop if
If the flags or rows differ from the intended policy, stop and check them. Confirm actual behavior using a non-customer test route for each relevant call path.
Acceptance record for this exact pathScroll sideways to compare columns
CheckPassFail or incomplete
ConfigurationMANUAL;Manual Dial Filter DNC;internal DNC Y read backUnknown or stale session settings.
Stored identityRaw test number in system DNC with ADD audit rowDifferent raw/constructed number or no matching log.
Agent resultExact DNC rejection on one manual-number requestNo message, another error, or a call starts.
TelephonyNo customer origination for the request intervalAny matching customer leg or unverified PBX evidence.
ScopeManual-number path onlyHopper, callback and inbound behavior still require separate tests.

Inspect the actual campaign DNC control

Open to enlarge
Inspect the actual campaign DNC control
Actual native campaign DNC control on the restored synthetic fixture.
Capture detailsManual-number filtering and a matching synthetic refusal must be checked separately; this image does not establish a successful DNC rejection.

You should seePass requires the intended DNC refusal and no customer call, alongside matching configuration/membership/audit evidence. The installed primary source has a DNC gate before manual origination;this article supplies no newly executed acceptance.

07 / 08

Keep an auditable record of every suppression

vicidial_dnc_log records every add and delete against either DNC table with the acting user, an add-or-delete action, a campaign_id (or -SYSINT- for the system list), and a timestamp. Read it by phone number to answer who suppressed this number, when, and through which list.

The admin screen additionally writes a matching vicidial_admin_log row with the section, the exact action, and the SQL that ran, which is useful when you need to show an administrative action rather than just the resulting row. For DNC.com, vicidial_dnccom_filter_log records each outbound batch result per lead (old status, new status, and the raw response), and vicidial_dnccom_scrub_log records each inbound real-time result per phone number with separate invalid, DNC, project-DNC, and litigator flags.

Together these four sources are the record you keep: the two DNC tables say what is currently suppressed, and these logs say how it got that way. Retain them at least as long as your compliance owner requires, and never let a bulk cleanup delete log rows just to shrink a table.

Use only an authorized synthetic number or approved aggregate in this check; keep real phone numbers and record identifiers private. Results for one call path do not prove another path.

Before you use it
In the authorized read-only SQL session, substitute only the raw synthetic number whose history you may review. No sample-specific capture is available. Open the approved client with sudo mysql --defaults-file=/etc/vicidial-readonly.cnf and confirm SELECT CURRENT_USER(), DATABASE() before entering this scoped SQL. Do not widen the credential-file permissions.
Read-only suppression history for one number
SELECT campaign_id, action, action_date, userFROM vicidial_dnc_logWHERE phone_number='<PHONE_NUMBER>'ORDER BY action_date DESCLIMIT 1000;
Reader-run example · not executed for this guide

This example has no recorded result here. Follow its preparation, expected result and stop conditions before using it.

Success looks like
The result shows up to 1, 000 retained matching log rows. Check retention and completeness before calling it a complete history.
Stop if
Stop if the log is missing entries you expected from step 1, or if an action's user field is blank — either means the audit trail has a gap worth investigating before you rely on it.

08 / 08

Troubleshoot a bad scrub, stop it, and roll back safely

If statuses change unexpectedly, inspect the batch selection and VICI_STATUS_SKIP. If a call reaches a listed number, check the campaign flags, call path and any queued lead. If inbound screening fails, inspect the DID filter configuration and provider responses; none of these symptoms has a single guaranteed cause.

If a batch run mis-set statuses, stop the cron job first, then use vicidial_dnccom_filter_log to find exactly which lead_id and list_id rows changed and what their old_status was. Restore only those rows through the admin lead screen or the update_lead API function, never a bulk update statement.

If you need to reverse an internal DNC add, use the Admin delete screen or the delete_dnc_phone API function, gated by the delete_from_dnc permission from step 1, rather than a direct delete against the table. That path writes the same audit row that later proves the reversal happened. Rollback here means a documented reversal through the same supported interface that made the original change, not a manual SQL fix applied under pressure.

Recheck the list entries and campaign flags, then verify the affected call path on a non-customer test route. The database reads alone do not prove enforcement.

Any cron, status or recovery action described here is prospective. Verify the installed-version procedure and preserve existing records; no rollback or restore has been performed.

  • Stop the batch job before investigating, not after.
  • Restore only the specific rows a log identifies, never with a bulk statement.
  • After checking the affected rows and flags, test enforcement on each relevant non-customer call path.

Checks and sources

What was checked

  • The DNC.com batch scrub (AST_DNCcom_filter.pl) and the DNC.com inbound DID filter (DNCcom_inbound_filter.php) are documented as optional add-ons requiring a separate DNC.com account; neither is enabled by a default install.
  • Table names, columns, enum values, and defaults referenced above (vicidial_dnc, vicidial_campaign_dnc, vicidial_dnc_log, vicidial_dnccom_filter_log, vicidial_dnccom_scrub_log, use_internal_dnc, use_campaign_dnc, use_other_campaign_dnc, callback_dnc, delete_from_dnc) come from the installed schema; no production suppression data was read to write this article.
  • The manual-number refusal recipe is source-reviewed against installed SVN4037 manual_dnc_check and its Agent alert branch;it has not been executed in this editorial pass. The two no-capture examples contain no claimed substituted output.

Primary references

Sources

  1. VICIdial DNC.com integrationVICIdial · accessed August 5, 2026
  2. VICIdial Non-Agent APIVICIdial · accessed August 5, 2026
  3. Complying with the Telemarketing Sales RuleFederal Trade Commission · accessed August 5, 2026

Follow without guesswork

Get the next article

RSS is live now. Email delivery below is an explicit local preview and sends nothing.Open the RSS feed
Email preview only. The address stays in this browser and is never transmitted.