Send Gates
Beyond consent and suppression, several regulatory checks run at send time. Orbit groups them as send gates: each one can hold or drop a message or call before it dispatches. This page covers the gates you configure or query directly. All endpoints below are rooted athttps://api.orbit.devotel.io/api/v1/compliance.
BAA — the HIPAA send gate
When your organization opts into HIPAA mode (you handle PHI), every outbound send — one-to-one messages and campaign blasts alike — is blocked until an executed, in-term Business Associate Agreement (BAA) is on file. Executing the BAA is the first step in the HIPAA sequence; the send gate is the enforcement backstop that cannot be bypassed. A blocked send returns422 HIPAA_BAA_REQUIRED with a reason of pending, expired, or
not_signed, and the docs_url in the error payload points at the
BAA execution flow. A 500 HIPAA_BAA_GATE_DB_FAIL means the gate
couldn’t verify BAA status — it fails closed (sends stay blocked)
rather than risk a PHI transmission it can’t check. Retry shortly; if
the issue persists contact support.
The gate checks the audit trail too: when the BAA status read can’t
be validated, the send is blocked and the failure is logged to PHI
audit rather than allowed through silently.
Quiet hours
Quiet-hours rules block messages and calls that would land outside a recipient’s permitted local hours (e.g. the TCPA 8 am–9 pm window). Orbit resolves the recipient’s local time from their phone number’s region.GET /quiet-hours/preview tells you whether a send is allowed right
now, and when the next allowed time is — use it to schedule around the
window.
Quiet-hours gating is opt-in per channel and organization — every
channel ships with the toggle off, so a new tenant’s SMS, WhatsApp, and
other sends are not held by quiet hours until you enable the gate for
that channel. Turn it on per channel from your organization’s
quiet-hours settings in the Orbit dashboard; the listed windows then
apply automatically.
Once enabled, the windows are 08:00–21:00 (recipient-local) for
SMS/voice and 09:00–21:00 for WhatsApp/Meta channels unless you set
your own
start_hour/end_hour. Email, fax, and push are not
quiet-hours gated.
US voice TCPA window: advisory for ad-hoc dials, a hard block for
campaigns. For outbound voice calls to US (+1) recipients, Orbit
evaluates the federal TCPA 8 am–9 pm recipient-local dialing window on
every call — but how it enforces the result depends on the call path:
- Ad-hoc 1:1 dialing from the dashboard is advisory by default. A call outside the window records a structured advisory log but still dispatches. To hold these calls instead, enable the voice quiet-hours toggle for your organization; enabling it applies the 8 am–9 pm window as a hard hold.
- Campaign and dialer voice traffic is always hard-blocked outside
the window, regardless of your tenant settings. A campaign or dialer
call placed outside 8 am–9 pm recipient-local is rejected with
422 TCPA_FEDERAL_DIALING_WINDOW_BLOCKED— there is no per-organization opt-out for automated or bulk voice, and the voice quiet-hours toggle does not relax it. If the recipient’s timezone cannot be resolved, the call fails closed and is also blocked.
GET /quiet-hours/preview to find the next allowed time.DNC — Do Not Call
GET /dnc/check reports whether a number is on a Do-Not-Call list
before you dial or text it. For the end-to-end posture — sources,
freshness, and the fail-open caveat — see
DNC Scrubbing.
source indicates which layer flagged the number (your contact
DNC flag, the DNC list, the suppression list, or a consent opt-out).
The gate applies only while no Do-Not-Call feed is synced. In
that state the endpoint is held behind the org setting
dnc_sync_enabled (default off) and returns
403 DNC_SYNC_NOT_ENABLED until you opt in — acknowledging that
Orbit isn’t yet scrubbing against a federal register for you, so a
number only on the FTC list reads back as on_dnc: false.Once Orbit has a federal, state, or TCR snapshot synced, the
dnc_sync_enabled gate is bypassed: the endpoint serves directly
and federal_feeds_synced returns true. Read that field on every
response to confirm whether a federal scrub is actually backing the
result.Batch pre-flight
POST /dnc/scrub runs the same chain against a whole list in one call
— up to 500 E.164 numbers per request, with an optional country
jurisdiction filter. It returns per-number verdicts plus on_dnc /
clear summary counts, is rate-limited to 10 requests per minute per
organization, and sits behind the same gate described above.
Troubleshooting a gated call
When either DNC endpoint holds at403 DNC_SYNC_NOT_ENABLED:
- Confirm the gate state without running a check — call
GET /dnc/availability. It reports the exact gate both endpoints enforce:available, yourorg_opt_in, andfederal_feeds_synced. - Enable the org acknowledgment — turn on
dnc_sync_enabledin your dashboard compliance settings. The flag is per organization and fails closed: a flag never set, a value stored as a string or number instead of booleantrue, or a settings lookup that fails all resolve to OFF — an org that has never visited compliance settings always gets the 403. - Or wait for the snapshot — once the platform syncs a federal,
state, or TCR feed, the gate retires by itself and
federal_feeds_syncedflips totrue; the acknowledgment is no longer consulted. - Separate the look-alikes —
401is authentication,422is a malformed phone, and429on/dnc/scrubis its 10-requests-per- minute rate limit, not the gate.
RND — Reassigned Numbers Database
US phone numbers get reassigned to new people. The FCC’s Reassigned Numbers Database lets you check whether a number was disconnected after the date you obtained consent — a “safe harbor” against texting or calling the wrong person.GET /rnd/check takes the phone and the consent_date
(YYYY-MM-DD):
feed_synced is false this is the only response the endpoint
returns, whatever the phone and consent_date — no disconnect dates are
on record yet, so every verdict degrades to no_data.
status is one of yes, no, or no_data — the FCC database’s verdict
for the (phone, consent_date) pair:
safe_harbor is true only when status is no. last_disconnect_date
is the most-recent permanent-disconnect date on record (null when none),
and feed_synced is false until RND feed ingestion is configured — while
it is false every verdict is no_data.
Gated behind rnd_scrub_enabled (default off); returns
403 RND_SCRUB_NOT_ENABLED while disabled.
Enabling and disabling RND scrubbing
UsePUT /api/v1/compliance/rnd/settings to control the rnd_scrub_enabled flag:
RND_FEED_NOT_CONFIGURED until the FCC Reassigned Numbers Database feed (SomosGov’s reassigned.us feed) is connected to your deployment. Turning the feature on before the feed is ingested would create a compliance control that performs no actual reassigned-number screening — you’d flip the flag, but every /rnd/check lookup would still return no_data. The 409 block prevents this false sense of protection.
Disabling (enabled: false) is always permitted, even if no feed is yet connected.
RMD — Robocall Mitigation Database
US voice originators must file a Robocall Mitigation Database registration describing their STIR/SHAKEN status and mitigation plan. Orbit stores and tracks your filing.GET /rmd— read your registration plus arecertificationblock withrenewal_deadlineandaction_required.POST /rmd— create or update the filing.POST /rmd/submit→ statussubmitted.POST /rmd/certify→ statusactive.POST /rmd/remediation(with areason) → statusremediation_required.POST /rmd/resolve→ back toactive.POST /rmd/withdraw→ statuswithdrawn.
stir_shaken_status is complete, partial, or none. A
mitigation_plan is required unless status is complete. The
lifecycle is draft → submitted → active → remediation_required → active | withdrawn.
Emergency stop
The emergency stop is an org-wide kill switch that immediately halts all outbound SMS, MMS, voice, and dialer traffic — use it during an incident (a misconfigured campaign, a compromised key, a content mistake). For the full operator runbook, see the emergency stop guide.GET /emergency-stop returns the current active flag plus
activated_at, activated_by, and reason. Activation and
deactivation require an admin/owner key.
Emergency short-code block (VOICE)
Every outbound voice call resolves its destination against the platform-wide emergency short-code table before any SIP leaves the platform — US 911, EU 112, UK 999, AU 000. A destination that matches any of them is rejected pre-dispatch:- Error code:
422 EMERGENCY_CALLING_NOT_SUPPORTED - Reason payload: the
detailscarry the redacted destination and the matched short code (to,emergency_code) plus adocs_urlpointer to the emergency-calling page; a campaign, an ad-hoc dial, and a SIP-trunk origination all take the identical block. - Tenant knob: none — the table is a fixed platform constant and the reject is a hard guard. No tenant setting, support request, or API parameter lifts it, and because the block fires pre-flight, no carrier dispatch happens and nothing is billed.
Do-Not-Originate caller-id reject (VOICE)
After the destination passes the emergency check, the resolved caller-id (thefrom you present) is screened against the
Do-Not-Originate (DNO) list — numbers that must never appear as a
calling-party number because they are invalid, unallocated, or
inbound-only (spoofed government, bank, or IRS lines; inbound-only
toll-free; unassigned ranges). A from matching a DNO entry is
hard-rejected at origination time, before dispatch:
- Error code:
422 VOICE_DNO_BLOCKED - Reason payload: a 422 at origination time, before any SIP goes out; matching is prefix-based, so a full E.164 entry matches exactly that number while a shorter prefix matches an unallocated or inbound-only range.
- Tenant knob: opt-in at the organization level. The platform baseline ships empty by default — there is no universally-safe DNO set, and a bad default would block legitimate caller-ids — so the check is a cheap no-op until you opt in. You curate the list through your organization settings with the same extend / replace / subtract override modes the blocked-prefix layer uses. A settings lookup failure fails open to the (usually empty) platform baseline, deliberately: a transient DB blip must not hold every outbound call.
Per-country voice rate window (VOICE)
Outbound voice also passes a per-destination-country sliding-window rate guard. A burst concentrated on one high-cost country trips the cap even when no single call looked excessive, and the call is rejected:- Error code:
429 VOICE_COUNTRY_RATE_LIMITED - Reason payload: the body names the country, its per-minute
limit, and the window, e.g.{ "limit": 60, "country": "GB", "window": "1m" }. The window is sliding (the current minute weighted against the tail of the previous minute), not a hard block. - Tenant knob: none to toggle — this is a voice-traffic rail, not a compliance control, and there is no allow-list to edit. Smoothing the send clears it without a config change; the rejected call can dial again as soon as the window rolls over.
Preference center
The preference center is a public, token-signed page where a contact manages their own channel opt-ins, message frequency, and (if enabled) requests data deletion — without logging in. Updates flow straight into consent, suppression, and the STOP-fence. Configure it once, then generate a per-contact link. The full walkthrough — every config field, link placement, and the update-flow surfaces — is in the preference center guide:POST /preference-center(admin/owner) — set branding, thechannelsoffered, frequency options, and the GDPR-delete toggle.GET /preference-center— read the current config.POST /preference-center/linkwith{ "contactId": "cnt_…" }— mint a signed link (HMAC-SHA256, 30-day TTL) to email or text to the contact.
GET/PUT /compliance/preferences/{token}) to view and update their
preferences. Opting out here records a consent revocation, adds a
suppression entry, and sets the STOP-fence; opting back in reverses
it.
Country rules
GET /country-rules is the read-only regulatory reference behind
these gates — per country and channel it reports the allowed sender
types, whether Sender-ID registration is none / recommended /
required, STOP-keyword requirements, two-way support, DLR support,
and default throughput.
Related references
- Compliance Posture FAQ — “I enabled the toggle — why is nothing blocked yet?” and the fail-open versus fail-closed summary for every gate on this page.
- TCPA Known-Litigator Gate — the recipient-provenance check against the platform’s list of TCPA professional plaintiffs, with its tenant toggle, consented-bypass audit trail, and fail-open mode.
- Emergency Calling — the E911 rationale, operator disclosure obligations, and full behaviour behind the emergency short-code block.
- Do-Not-Originate (DNO) Caller-ID Blocking — configure the extend/replace/subtract org override for the origination-time caller-id reject.
-
Troubleshooting: Voice Destination and Emergency Blocks —
triage
422 EMERGENCY_CALLING_NOT_SUPPORTED,422 VOICE_DNO_BLOCKED, and429 VOICE_COUNTRY_RATE_LIMITEDpre-flight rejects. - Configure Your Tenant’s Posture Before the First Send — the runbook that walks these gates in configuration order, with the default and the consequence for each.
- US State Calling Windows — per-state mini-TCPA overlays on top of the federal dialing window and how a block traces back to a statute.
- Country Compliance Requirements — per-country sender types, registration, and documentation.
- Restricted & Prohibited Industries — which industries and content are restricted or banned.
- Voice Destination Auto-Blocks — the automatic per-destination voice blocks applied on a traffic-pumping or Wangiri burst, and where to read them before a legitimate call to that number is rejected.
- Opt-Out & Suppression Lists — the suppression layer DNC and the preference center feed.
- Consent Management — the consent records updated by the preference center.
-
Sender-ID Registration — the
registration
country-rulesreports as required. - API Reference → Compliance — full request/response schemas (regenerated from the live API).