Skip to main content

US Calling Windows — Federal TCPA + State Overlays

This page consolidates two wires that used to live on separate pages — the federal TCPA wire (the 8 AM–9 PM recipient-local window, the concept page TCPA federal voice guard reviewed for context) and the state wire (the seven mini-TCPA overlays below) — into the one place that computes the binding window for a US (+1) recipient. Operators who used to cross-reference the federal concept page against this table can read the intersection here end to end. Federal law expressly does not preempt stricter state law (47 U.S.C. § 227(e)), so the binding outbound rule is always the most restrictive of the federal and any applicable state window. Everything below describes controls you own as the tenant — the platform does not impose a global block beyond the one federal-only asymmetry documented below. This page is not legal advice; confirm your obligations with counsel.

1. Federal wire — 8 AM–9 PM recipient-local

The federal TCPA sets a dialing window of 8 AM–9 PM in the recipient’s local time (47 U.S.C. § 227(b)(1)(B), implemented by 47 CFR § 64.1200(c)(1)). How it bites depends on the path:
  • Campaign and dialer voice (predictive, progressive, preview, agentless modes, scheduled callbacks, the Jambonz-side pre-dial gate): always hard-blocked outside the federal window regardless of your tenant settings — 422 TCPA_FEDERAL_DIALING_WINDOW_BLOCKED. This is the one compliance control with no tenant opt-out, per the send gates reference.
  • Ad-hoc 1:1 voice (dashboard/softphone dials): advisory-only by default — the call dispatches and the decision is logged. Enable quiet_hours.voice.enabled in your organization settings (see the quiet hours guide) and the same evaluation becomes a hard hold (422 TCPA_DIALING_WINDOW_BLOCKED).
  • Non-voice channels / non-US recipients: not evaluated — the federal window applies to US voice only.
The full concept rationale — why the federal guard is the platform’s sole owned control, its fail-closed timezone posture, and how it differs from every other gate — lives on TCPA federal voice guard; the mechanics themselves are consolidated here.

2. State overlay table — the intersection

Seven US states run “mini-TCPA” statutes with stricter hours, day-of-week bans (usually Sunday), or both. States not in this table fall through to the federal window unchanged. All windows are recipient-local; the end hour is exclusive (an 8 PM end means the last permitted dial starts at 7:59 PM).
Mississippi’s statute sets a 7:30 PM end. Orbit encodes this conservatively at the hour boundary — the last permitted dial starts at 6:59 PM — because the window model resolves to whole hours. The full 30-minute cutoff is preserved in the statute citation for legal traceability.
The intersection is always the most-restrictive-of-the-two:
  • Start hour — the later of the federal and state starts (currently 8 AM everywhere).
  • End hour — the earlier of the federal and state ends.
  • Blocked days — the union of all day-of-week bans (only states set these; federal law has none).
When a state-based block fires, the error details carry the specific statute citation (e.g. Fla. Stat. § 501.059) so you can trace the decision back to the source statute without reading platform code.

3. Which page to consult

  • This page — the complete window rule (federal + state intersection, worked example, gate order, preview contract). Start here.
  • TCPA quiet hours and windows — the step-by-step quiet-hours setup workflow (enabling channels, campaign fallback windows, timezone policies) with worked API examples.
  • TCPA federal voice guard — the concept rationale for the federal-only asymmetry (why the platform owns that one control outright).

4. Order of gate execution

The voice window pipeline runs in a fixed order; the binding window is the lower bound of all applicable windows:
  1. Non-voice channel or non-US recipient → allow, no window evaluation.
  2. Resolve the recipient’s timezone — area-code lookup (a hint you pass is honored first). Unresolvable on the campaign/dialer path → blocked, fail-closed, before any window math.
  3. Resolve the recipient’s state from the NANP area code and overlay the federal window with the state’s window (most-restrictive-wins).
  4. Day-of-week check — a banned weekday (e.g. a Florida Sunday) blocks against the intersected window.
  5. Hour check — the recipient-local hour must be ≥ the intersected start and < the intersected end.
  6. Enforcement fork — campaign/dialer: hard block. Ad-hoc: advisory log unless you enabled the voice quiet-hours channel, in which case hard hold.
Because your own tenant gate can only tighten, the pipeline’s lowest bound wins at every step — a block from any wire refuses the call.

5. How the recipient’s state is resolved

Orbit maps a US (+1) number to a USPS state code through its NANP area code. The resolver deliberately keeps single-state assignments only. When a recipient lands in a state with no overlay, the federal 8 AM–9 PM window applies unchanged; the resolved state code is still attached to the decision for telemetry and audit filtering. A recipient falls through to the federal window when:
  • the number is not a +1 NANP number (TCPA jurisdiction is US-only),
  • the area code maps to no state in the table — Canadian and Caribbean NANP area codes, and US area codes not yet mapped,
  • the area code resolves to a state with no overlay (the common case — TX, CA, NY, IL, etc.).
In every fall-through case the federal window applies. A fall-through is not a failed lookup, so it does not trip the timezone-unresolved fail-closed behaviour on the campaign/dialer path.

6. Reading the preview for voice

GET /api/v1/compliance/quiet-hours/preview?phone=<E.164>&channel=voice returns the voice window decision for your tenant as a read — nothing is sent. The reason field names which wire produced the verdict, and for a state block the carried citation names the statute. The stable reason codes for voice: The two paths read the same decision differently: The same read is how the two enforcement paths use each wire: the campaign/dialer path hard-blocks on the federal wire regardless of settings; your opt-in gate (ad-hoc, or quiet-hours send gates) treats both federal and overlay wires as enabled evaluations once the voice channel is on, where the federal hard reference would otherwise be advisory. A blocked preview carries a DST-safe next_allowed_at ISO instant — hand it straight to your scheduler instead of retrying.

Worked example — a Sunday dial to Florida vs. Texas

Dials evaluated at Sunday 8:30 PM recipient-local: Miami, FL (area code 305):
  1. The area-code lookup resolves 305 → FL.
  2. FL carries an overlay: 8 AM–8 PM, Sunday banned (Fla. Stat. § 501.059).
  3. The intersected window is 8 AM–8 PM with Sunday banned.
  4. Sunday → state_blocked_day → blocked. The error details carry Fla. Stat. § 501.059 as the citation plus the next allowed time (Monday 8 AM).
Dallas, TX (area code 214):
  1. The area-code lookup resolves 214 → TX.
  2. TX carries no overlay → the federal 8 AM–9 PM window applies unchanged.
  3. At 8:30 PM the hour is still inside 8 AM–9 PM → the call is allowed. (After 9 PM it would be outside_federal_window.)
On the tenant opt-in gate both outcomes are advisory-only until you enable the voice channel; on the campaign/dialer path only the federal window is hard-blocked by default — so the TX Sunday 8:30 PM dial dispatches in both paths, while the FL one is blocked on the opt-in gate and, once enabled, returns the citation-bearing error above for your campaign tooling to schedule around.

Verification and re-verification

The overlay table was last verified against statute text 2026-05-29. Each entry cites its statute so your counsel can re-verify before a commercial campaign — the table is deliberately small (seven states) to keep that audit cheap. Statutes shift: Florida’s FTSA was amended in 2021 and 2023 without relaxing the time-of-day window, and new mini-TCPA bills land every session. Treat the citations as the audit trail, not a substitute for jurisdiction-specific legal review.