Voice Traffic-Lane and Voice-Classification FAQ
The voice guard runbook documents the federal
dialing-window gate end to end, and the
blocked-call troubleshooting page
walks a call that is already on the floor. Support volume around the guard
is not “why was this call denied” — it is the questions upstream of the
denial: which lane your call resolved, why a destination lookup failed,
what ran before the guard saw your call, and where the verdict landed
afterward. This page answers those four.
Tenant-owned controls, not legal advice. Which laws apply to your
traffic depends on your jurisdiction, your recipients, and what you
send — confirm with qualified counsel before you rely on the wording
here.
1. When is my call marketing vs transactional?
The lane-resolution question. Every outbound voice dispatch — API dial,
softphone click-to-call, campaign, dialer, callback, Flow Builder make _call — resolves to a lane of marketing or transactional before
the federal window is evaluated. transactional dials 24/7; marketing
is governed by the recipient-local 8 AM–9 PM window the moment recovery
is time-based. The federal window answers time; the lane answers
whether time applies.
The resolution rules, in precedence order:
- Artificial or prerecorded voice →
marketing. Any of these on the
call metadata resolves marketing no matter what else is there: a TTS
payload (tts_text, tts_body, message_body), a routed agent
(voice_agent_id), a cloned-voice model (voice_cloned_model_id,
agent_id), or an explicit voice_content_type of "synthetic" or
"cloned". The statute names precisely this — the TCPA federal window
restricts “artificial or prerecorded voice” — so this step is evaluated
before anything else.
- An explicit claim you made —
"traffic_lane": "marketing" on the
request metadata → marketing.
- Campaign / journey / dialer / broadcast origin →
marketing. Any
of these metadata keys resolves marketing: campaign_id,
journey_campaign_id, dialer_campaign_id, broadcast_id,
flow_execution_id. A Flow Builder make_call node dials on an
event, a schedule, or a webhook with no operator on the line, so
flow-origin traffic is governed by default.
- Unattended origination →
marketing. amd_requested (answering-
machine detection) or dynamic_variables (per-recipient substitution)
on the metadata: a dial nobody is attending is an outbound blast, not
a hand-placed one.
- Otherwise →
transactional. A direct API dial or a softphone
click-to-call with none of the above resolves transactional and dials
24/7.
The one-way ratchet. Only traffic_lane: "marketing" is honored.
An explicit traffic_lane: "transactional" claim is ignored and the
inference above runs — a caller can make its own call more governed,
never less. Your metadata blob travels unauthenticated from your request
body through the dispatch path, and honoring a transactional claim off
it would type around the federal gate. If a server-side dispatcher
(verified origin) needs a transactional lane, the platform stamps it on
a trusted internal field — never the caller-supplied metadata bag.
How to claim marketing. When you genuinely want your call governed —
a dialer you run socially but not legally, a campaign where the metadata
shaped by the dispatcher did not yet hit the origin keys — pass
"traffic_lane": "marketing" in the request metadata bag and Orbit
enforces the window. This is the only way a voice caller can opt a call
into governance; the messaging traffic_lane override
(see Message priority traffic lanes)
uses the same name there, but voice rejects the reverse direction on
purpose.
2. Why did the +1 recipient lookup fail and how do I fix it?
The blocked-call troubleshooting page
walks a call that evaluated the guard and lost — this is the lookup
question: your call returned with no federal verdict at all because the
recipient could not be resolved. The lookup sits before the gate:
recipient E.164 → area-code → IANA timezone (for +1), or country-code
prefix for non-+1. When none of that resolves, the voice guard fails
closed by design and returns the dial timezone_unresolved, not a
warning. The split is described on
Number timezone and state resolution;
the voice-specific handling is what this section answers.
Fix: pass an explicit recipientTimezone hint. The lookup chain
runs an explicit-per-request hint first, then the area-code inventory,
then the prefix fallback. If your recipient’s actual timezone is known —
you hold it against your contact’s verified address, or your CRM passes
it forward — set recipientTimezone on the call and the guard honors it
verbatim. That is the only resolution path the platform cannot infer and
you must; an area code says where the number was assigned, not where the
subscriber now lives.
Common resolutions, in order of how often each is the answer:
- Toll-free or non-geographic +1 (800, 888, N11 codes). These carry
no geographic signal and are deliberately unmapped — the dial returns
timezone_unresolved until you pass recipientTimezone.
- New or overlay US area codes. When NANPA assigns a fresh NPA, the
platform’s area-code inventory resolves it within a release cycle, but
until then the area code is unmapped and the dial fails closed. Same
fix — pass the hint.
- Canadian recipients. Canada is in the +1 inventory but it is not a
US jurisdiction; the country resolves and the state reads
null. The
federal window does not apply — the guard allows immediately.
- Non-NANP (+44, +33, …). The guard skips the US federal wire
entirely (
non_us_recipient), and tenant quiet-hours or state
overlays may still apply downstream. The lookup failure is not on the
federal rail; it is on whatever tenant policy layer follows.
If the hint is not available and the recipient and you are both in
coverage, the failure is an inventory update — the code is new and
mapping lands with the next cycle — not a posture the guard needs from
you. Field-specific support for a missing inventory entry is the
platform’s own ticket, not yours.
3. What runs BEFORE the guard?
The dispatcher stamps metadata before the guard ever reads it, and the
order matters: every voice dispatch assigns the class the classifier
names and the lane the guard recovers, in this fixed sequence, at the
dispatch-entry point (the API POST /voice/calls/place route or the
voice-gateway /api/v1/outbound-call handler, whichever ingress your
caller reaches):
- Ingress metadata bag assembled. Your request body and any
server-side dispatch hints (e.g. an
agent_id the route folds into
the bag) compose the metadata the classifier and resolver read.
- Voice-content class stamped. The classifier resolves the
voice_content_type from the metadata in precedence order:
explicit voice_content_type (verbatim) → voice_cloned_model_id
→ voice_agent_id (campaigns canonical key) → agent_id (fallback)
→ tts_text / tts_body → message_body → otherwise human.
The class is stamped on the audit row and forwarded downstream with
the verdict.
- Lane resolved. The traffic-lane resolver sees the same metadata
and the classifier’s voice-content class as its
artificialVoice
signal. The verdict chain above (step 1–5) returns marketing or
transactional.
- Voice-compliance gates, then the federal window. The lane and
class settle first, and then the voice-compliance gates run in
sequence: DNC-suppression, STOP-suppression, FCC 24-17 written-
consent gate, then the federal TCPA window check on
marketing traffic only. A blocked call never loops back to the
window math; each gate is short-circuited and returns its own
reason.
The read-yourverdict consequence: a dial recorded as human +
transactional skips the federal window entirely; the same metadata
bag carrying a TTS payload resolves synthetic and the window is
checked. The class is stamped before the window check runs — the
guard does not infer speech type mid-gate.
4. Where do I read the decision ledger?
Every voice dispatch evaluation — allowed or blocked — lands in your
tenant’s audit chain with the same shape: resolved lane, resolved local
hour, the reason the gate returned, and the resolved voice_content_type.
Read it back with the audit export route
(filter on event_type = 'voice_dial_guard_decision') or the dashboard
compliance ledger (Compliance → Audit ledger, the voice scope). Blocks
report with the recipient number masked.
Roll those events up over a reporting window and you get a posture
history — the SOC 2 evidence-binder convention described on
Audit ledger posture rollup —
with federal-only, federal+state, and federal+state+tenant bands
set per period so a reviewer can attest what gate was active when.
Only the lane and posture bands appear there; the full reason enum a
blocked call returned is on the runbook and the federal window check.
See also