VICIfast
Feature · TCPA Compliance

TCPA Compliance.

Per-trunk Blacklist Alliance scrubbing. Your API key, your account, your audit trail. Inherit-from-server-default for the simple case; override per outbound trunk when you have different compliance postures for different clients.
See pricing

7-day free trial · Cancel anytime · Pay with card or USDT

vicifast — tcpa-compliance
# AGI hook in extensions.conf — runs before every Dial
exten => _9742X.,1,AGI(tcpa-check.agi)
exten => _9742X.,n,GotoIf($[${TCPA_RESULT}=BLOCK]?blocked)
exten => _9742X.,n,Dial(PJSIP/${EXTEN:4}@twilio-out,,tor)
exten => _9742X.,n,Hangup
exten => _9742X.,n(blocked),Hangup
TCPA Compliance
40smedian deploy time
99.94%fleet uptime · last 30d
6regions live
Auditedevery state change

What you get

The full TCPA compliance surface, end-to-end.

Every card below is a shipped capability. Hover for emphasis; click any matching feature for the deep page.

BYO Blacklist Alliance key

You bring the API key, you see the BLA dashboard, you pay BLA directly. We do not resell, we do not mark up. The audit trail is in your BLA account.

Per-trunk override

Default mode is "inherit from server". On a trunk that needs different posture — different client, different state, different compliance contract — switch to "custom" with its own key, or to "disabled" entirely.

Fail-open or fail-closed

If BLA times out or returns an error, you choose: allow the call (fail-open, default) or block it (fail-closed). Per-trunk setting, audit-logged.

6-hour Redis cache

Repeated dials of the same number against the same trunk hit the cache, not BLA. The cache key includes a hash of your sealed API key so a key rotation invalidates stale results.

Pre-dial AGI hook, not post-call

The scrub runs BEFORE Asterisk dials — a litigator number never receives a call. Compare to "scrub on import" approaches that depend on the import list being fresh.

Litigator hits → quarantined disposition

A hit lands the number in a configurable disposition (default DNCC). Your reports break out scrub-blocked vs. carrier-blocked vs. agent-blocked separately so trends are visible.

Recording retention tied to scrub state

List-level recording retention can branch on scrub outcome — keep recordings of scrub-blocked attempts for the regulatory window; default-purge the rest at 7 days.

Operational, not legal advice

We provide the platform controls TCPA-compliant dialing needs. Compliance posture itself is yours + your counsel's — we do not interpret regulation for you. The audit log proves how each number was handled.

TCPA check happens pre-Dial, per call. The AGI script POSTs to your VICIfast API with the dialed number and a server token; the response comes back as TCPA_RESULT in 2–3s typical, 250ms cached.

FAQ

Questions worth answering

Different carriers serve different clients with different compliance contracts. A campaign-level switch is too coarse; per-trunk matches how scrubbing actually gets decided in practice.

We pin to the v3 lookup endpoint. If BLA versions, we add v4 support and let you opt in. We do not silently swap providers.

Today, BLA only. If there is genuine customer pull for another (Contact Center Compliance, etc.) we add the adapter — the AGI plumbing is provider-agnostic.

Every scrub result is in the AuditLog with the number, the trunk, the result, the cache state, and the timestamp. Export from /admin/audit-log as CSV.

No — the AGI strips the 4-digit prefix before the BLA call, so BLA gets the real dialed number. We tested this; it was a real bug in an earlier build, and the fix is in production.

Every dial scrubbed before Asterisk dials.

Start the trial. Paste your Blacklist Alliance key; the per-trunk AGI hook is wired the moment your trunk registers. Fail-open or fail-closed, audit log, 6-hour cache.

All features