> ## 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.

# Troubleshooting: state mini-TCPA blocked voice calls

> Resolve 422 TCPA_STATE_DIALING_WINDOW_BLOCKED — the state mini-TCPA variant of the dialing-window family. How per-state overlays (FL, MS, OK, LA, AL, AR, WV) layer on the federal window, where to check your posture, and how to choose a compliant send window.

# Troubleshooting: state mini-TCPA blocked voice calls

`422 TCPA_STATE_DIALING_WINDOW_BLOCKED` is the third member of the
dialing-window family, and it behaves differently from the other two
you'll see on US voice: the block comes from a **state mini-TCPA
overlay** — a specific recipient state's statute — not from the plain
federal 8 AM–9 PM window and not from a window you set yourself. The
error details carry the the state that resolved and, where the catalog
carries one, the statute `citation`, so you always know which overlay
fired.

The triage hub at
[Diagnose dialing-window blocked calls](/troubleshooting/tcpa-window-blocked-calls)
covers the tenant gate code (`TCPA_DIALING_WINDOW_BLOCKED`) and the
federal window code (`TCPA_FEDERAL_DIALING_WINDOW_BLOCKED`). This page
works the state variant end-to-end.

## Symptom

* An outbound US voice send returns `422` with code
  `TCPA_STATE_DIALING_WINDOW_BLOCKED`.
* The error `details` name the resolved recipient `state` (e.g. `FL`)
  and, for the cataloged overlay states, a `citation` (e.g.
  `Fla. Stat. § 501.059`) — the statute the block traces back to.
* Typical triggers: a Florida recipient on a Sunday (FL bans Sunday
  dialing at any hour), a Mississippi recipient after 7 PM
  recipient-local (MS ends three hours before the federal window), or a
  recipient in any overlay state after its tightened end hour (8 PM in
  FL/OK/LA/AL).

## How state overlays work

The federal TCPA dialing window is 8 AM–9 PM recipient-local. Seven US
states layer "mini-TCPA" statutes on top with stricter hours,
day-of-week bans, or both, and federal law expressly permits stricter
state rules — so the binding window for any US recipient is the
**intersection** of the federal window and whatever its state's overlay
says: the earlier end hour, the union of all banned weekdays. The
overlay can tighten the window; it can never widen it.

| State              | Window    | Blocked days | Resulting overlap with federal             |
| ------------------ | --------- | ------------ | ------------------------------------------ |
| Florida (FL)       | 8 AM–8 PM | Sunday       | Federal cut to 8 PM; no Sunday dialing     |
| Oklahoma (OK)      | 8 AM–8 PM | —            | Federal cut to 8 PM                        |
| Mississippi (MS)   | 8 AM–7 PM | Sunday       | Federal cut to 7 PM; no Sunday dialing     |
| Louisiana (LA)     | 8 AM–8 PM | Sunday       | Federal cut to 8 PM; no Sunday dialing     |
| Alabama (AL)       | 8 AM–8 PM | Sunday       | Federal cut to 8 PM; no Sunday dialing     |
| Arkansas (AR)      | 8 AM–9 PM | Sunday       | Federal hours unchanged; no Sunday dialing |
| West Virginia (WV) | 8 AM–9 PM | Sunday       | Federal hours unchanged; no Sunday dialing |

The full derivation — the resolution chain from area code to state, the
conservative rounding of Mississippi's 7:30 PM statute, and the
statutes behind each row — lives at
[US state calling windows](/compliance/state-calling-windows). Read it
before you schedule; don't re-derive the table from the error.

Ad-hoc 1:1 voice outside a window dispatches through with an advisory
log by default and only gets **held** when you've enabled the voice
channel on your quiet-hours gate — so where this variant surfaces as a
422 is usually a send path you deliberately gated (campaign or
automated voice on the org quiet-hours configuration, or an old
enforced integration). Scheduled US campaign traffic follows your
configured quiet-hours posture; where a send is held, the platform
defers the contact and re-attempts inside the window rather than
returning a hard error.

## Where to check and fix

The only lever in a dialing-window block is timing: pick a schedule the
intersected federal + overlay window admits, and these surfaces tell
you what posture you'll clear.

1. **Preview before you schedule.** Run the read-only check against a
   sample of the list — one preview per distinct area code covers every
   recipient that shares its resolution:

   ```bash theme={null}
   curl "https://api.orbit.devotel.io/api/v1/compliance/quiet-hours/preview?phone=%2B13055550123&channel=voice" \
     -H "Authorization: Bearer $ORBIT_API_KEY"
   ```

   `allowed_now` and `next_allowed_at` answer the whole question; for
   overlay states the preview evaluates the intersected federal + state
   window. Sample your list by area code before the campaign launches
   instead of learning the overlay from blocked attempts.

2. **Read your tenant posture.** Pull `GET /api/v1/settings/general`
   and look at the `quiet_hours` block — which channels you enabled on
   the org gate, and the hours you've set. A held send reports
   `next_allowed_at`; schedule at that timestamp instead of retrying.
   Your own gate can only ever **add** restrictions on top of the
   intersected window — nothing you set relaxes it.

3. **Compliance posture map.** [Your tenant compliance
   posture](/compliance/posture-overview) is the one-page map of which
   controls are yours to switch, what defaults open, and where each
   switch lives. Use it to confirm which layer (your gate or the
   intersected window) is actually holding the send.

4. **Choose a compliant send window.** Inside the recipient's
   intersected window, the send admits. For a `state_blocked_day`
   reason (a Florida Sunday, for example) no hour on that day survives
   — reschedule the day, not the hour; the error's `next_allowed_at`
   already points past the ban.

5. **When self-serve resolves nothing**, escalate per the capture
   checklist on the
   [main dialing-window troubleshooting page](/troubleshooting/tcpa-window-blocked-calls)
   — full error body, recipient E.164 + area code, call path, org ID,
   and the preview response for the same number.

## The three codes, mapped to their posture control

Every 422 in this family routes back to one of three levels. The
whole map — tenant-owned controls only, no platform mandate here:

| Error code                            | What fired                                                                                    | The posture control to work                                                                                                                                                                                                                                   |
| ------------------------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `TCPA_DIALING_WINDOW_BLOCKED`         | Your own quiet-hours gate held the voice send                                                 | **Tenant-owned** — relax or disable the voice channel toggle on your org `quiet_hours` gate (`PUT /api/v1/settings/general`), or schedule at `next_allowed_at`                                                                                                |
| `TCPA_FEDERAL_DIALING_WINDOW_BLOCKED` | The recipient-local hour fell outside the plain federal 8 AM–9 PM window                      | **Timing-only** — the recipient's state resolved to no overlay, so the plain federal window is the binding rule. Schedule at `next_allowed_at`; pre-flight with the preview endpoint so the campaign launches inside it                                       |
| `TCPA_STATE_DIALING_WINDOW_BLOCKED`   | A state mini-TCPA overlay tightened the window or banned the day (FL, OK, MS, LA, AL, AR, WV) | **Timing-only** — the error details name the resolved `state` and (for cataloged overlays) the statute `citation`. Schedule at `next_allowed_at`; the [state calling windows table](/compliance/state-calling-windows) shows the intersected window per state |

`TCPA_TIMEZONE_UNKNOWN` sits alongside these: the resolver failed
before any window math, and the failure posture comes from your
`unknown_timezone_policy` on the tenant gate (`skip` passes, `deny`
blocks, `enforce_utc` evaluates against UTC). Fix it as data, not
policy — pass a `timezone_override` hint or repair the area code.

## Related

* [Diagnose dialing-window blocked calls](/troubleshooting/tcpa-window-blocked-calls)
  — the hub page for the tenant gate and the federal variant; escalate
  from here when self-serve above resolves nothing.
* [US state calling windows](/compliance/state-calling-windows) — the
  overlay derivation, the resolution chain, and the statutes every
  `citation` points back to.
* [Quiet hours configuration](/guides/quiet-hours-configuration) — the
  tenant gate knobs that decide whether you ever see a 422 here at
  all, and the `unknown_timezone_policy` posture.
* [Your tenant compliance posture](/compliance/posture-overview) — the
  full toggle map across every compliance surface you own.
* [Error codes reference](/reference/error-codes) — the full TCPA entry
  set this family of codes works from.
