> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# TCPA Known-Litigator Gate

> Opt in to the recipient-provenance check that blocks SMS/MMS sends to numbers on the platform's known-litigator list of TCPA professional plaintiffs, with a consented-bypass audit trail and a fail-open failure mode.

# TCPA Known-Litigator Gate

US carriers and industry services (Numeracle, Blacklist Alliance,
DNC.com) maintain lists of **professional plaintiffs** — recipients who
file TCPA complaints against senders as a business. A single
non-consented A2P SMS to one of them costs $500–$1,500 per message under
47 U.S.C. § 227(b)(3). Orbit's known-litigator gate blocks those sends
before they dispatch.

The gate is scoped by design to **US (+1, NANP) SMS and MMS traffic**
— the TCPA is a US statute, and SMS/MMS are the channels that trigger
it. Voice traffic carries its own TCPA dialing-window guard; see
[Send Gates](/compliance/send-gates).

<Warning>
  This is a tenant risk control you opt into, not a platform screen. The
  gate rides on the send path only when your organization turns it on,
  and it reduces (not eliminates) your exposure to serial TCPA filers.
  It is not legal advice — confirm your TCPA obligations with counsel.
</Warning>

***

## How the check resolves

Every send on an enabled organization resolves the recipient against a
layered chain, cheapest first:

1. **Contact pre-flag** — if a bulk import already stamped the contact's
   `is_tcpa_litigator` flag, the lookup is skipped entirely and the send
   resolves flagged without touching the network or the cache. One
   computation per import, not per send.
2. **Redis cache** — a cached verdict from an earlier lookup.
3. **Numeracle live lookup** — used when the operator configured the
   Numeracle key (Orbit's hosted SaaS sets it for you).
4. **Static seed** — the platform-bundled litigator list, used as the
   last-resort source when the live lookup is unavailable.

Each verdict reports its `source` back through the audit trail and the
admin lookup surface, so you can tell a cached hit from a live one.

Admin-set **manual overrides** live in the same cache layer, so a
force-flag or force-clear persists across lookups. See
[Admin manual overrides](#admin-manual-overrides) below.

***

## Enable the gate

The gate is **off by default**. It ships off for non-US operators: a US
TCPA check on traffic that never touches +1 recipients adds lookup
latency and audit noise for no benefit. Turn it on per organization by
setting `tcpa_check_enabled` in your general settings:

```bash theme={null}
curl -X PUT "https://api.orbit.devotel.io/api/v1/settings/general" \
  -H "Authorization: Bearer $ORBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "settings": { "tcpa_check_enabled": true } }'
```

Until the flag is `true`, every send skips the chain entirely. Setting
`false` (or never setting the key) means off. The dashboard compliance
settings expose the same toggle.

<Note>
  Voice calls are not gated by this check. The scope is `sms` and `mms`
  sends to `+1` destinations. To extend litigator screening to outbound
  voice, use the admin manual-override surface below or screen
  recipients before a campaign with the admin lookup.
</Note>

***

## What a blocked send looks like

A blocked send throws `403 TCPA_KNOWN_LITIGATOR_BLOCKED` (the code the
class is named once it lands — the legacy listing name
`MESSAGING_TCPA_KNOWN_LITIGATOR` was replaced). The response body:

```json theme={null}
{
  "error": {
    "code": "TCPA_KNOWN_LITIGATOR_BLOCKED",
    "message": "Recipient is on the TCPA known-litigator list and has not given verifiable consent. Confirm consent in writing before sending, OR remove the recipient from the campaign.",
    "status": 403,
    "details": {
      "to": "+1415****",
      "channel": "sms",
      "source": "numeracle",
      "score": 92
    }
  }
}
```

The block is resolved **before** billing, so a blocked send never
charges. `details.source` tells you which layer flagged the recipient
(`contact_flag`, `cache`, `numeracle`, `seed`, or `manual_override`).

When the gate has a confidence score from Numeracle, it passes through
in `details.score` (0–100, higher is riskier).

### Non-US destinations

Non-`+1` recipients that match the list get a **soft warn** rather than
a hard block: the send proceeds, a Sentry breadcrumb and an audit entry
of `messages.tcpa_litigator_soft_warn` record the flag, and you can
review it post-hoc. The TCPA's hard-block scope is NANP only.

***

## Consented bypass

If the recipient has an `opted_in` consent record for the same channel,
the gate **allows the send** — but writes an audit entry
(`messages.tcpa_litigator_consented_bypass`) plus a Sentry breadcrumb so
your compliance team can review the decision post-hoc. The audit entry
carries the recipient (redacted), the channel, the flag source, and the
score.

Blocked sends write `messages.tcpa_litigator_blocked` entries instead.
Query either class from the Admin console or your SIEM sink.

***

## Failure mode: fail-open

An outage in the Redis cache, the database probe, or the Numeracle API
does **not** block your sends. The chain catches the fault, logs a
warning, captures it in Sentry, and treats the recipient as un-flagged
— the send goes through. This is deliberate: a TCPA preflight outage
must never black-hole all outbound messaging.

If you would rather fail closed (e.g. during a live complaint), turn
the toggle off and rely on the admin manual-override surface — force-
flag the affected numbers so they block without depending on upstream
lookup availability.

***

## Admin manual overrides

Platform staff manage the list itself through the super-admin surface
(`/dashboard/tcpa-litigators`):

* `GET /admin/compliance/tcpa-litigators/seed` — the static seed
  envelope (source, entry count, last-updated).
* `GET /admin/compliance/tcpa-litigators/lookup?phone=…` — run the live
  chain against one phone to debug a complaint.
* `POST /admin/compliance/tcpa-litigators/override` — force-flag or
  force-clear a number (persists across lookups until removed).
* `DELETE /admin/compliance/tcpa-litigators/override/:phone` — drop an
  override.
* `GET /admin/compliance/tcpa-litigators/overrides` — list active
  overrides with provenance (who set it, when, why).
* `POST /admin/compliance/tcpa-litigators/diff` + `/merge` — bulk-import
  a CSV of flags.
* `GET /admin/compliance/tcpa-litigators/match-stats` — hourly blocked /
  consented-bypass / soft-warn counts for the sparkline.

All of these are super-admin only and audit-logged.

***

## Related

* [Send Gates](/compliance/send-gates) — quiet hours, DNC, RND, RMD, and
  the emergency stop run alongside this gate at send time.
* [DNC Scrubbing](/compliance/dnc-scrub) — the Do-Not-Call pre-flight
  against your own lists and the national registries.
* [Consent Management](/compliance/consent-management) — the consent
  records the bypass reads.
* [Error Codes](/reference/error-codes) — the
  `TCPA_KNOWN_LITIGATOR_BLOCKED` row with the full payload shape.
