Troubleshooting: routing and channel misconfiguration
Three codes on send and export paths refuse because of configuration you own, not a provider fault. All three are deterministic — the same request re-fires the same gate on every attempt — so there is exactly one fix each time, and retrying before the fix is a wasted loop. Find the code in the table below, then jump to its section.Cyclic ring-group chain
On a ring-group create or update,422 INVALID_RING_GROUP_CYCLE means the
members list you submitted would make the group reachable from itself —
either a real loop (group A lists group B, and group B lists group A, in
any direction) or a chain nested deeper than the depth cap that list
members can follow.
The error appears most often when you re-edit existing groups: renaming or
re-ordering members across two groups can silently introduce a cycle that
only shows up at save time. The error.details.cyclePath in the response
lists the member ids that form the loop, for example A → B → A.
Fix — flatten the chain or re-order the members before re-saving:
- Open the group and read
members. Replace anyring_groupmember that closes a loop (a group that leads back to this one, or to a parent of this one) with that group’s concrete destinations — SIP usernames or PSTN numbers — so nesting no longer cycles. - If the chain is acyclic but too long, re-order the members so the
nested
ring_groupchains shorten, or move inner destinations onto the outer group directly. - Re-submit the same
POST /voice/ring-groupsorPATCH /voice/ring-groups/:idonce. The cycle check runs again at write time and passes when the chain terminates in concrete destinations within the depth cap.
No reachable pay-by-link channel
OnPOST /billing/pay-by-link, 422 NO_REACHABLE_CHANNEL means the
request could not pick a delivery channel for the hosted-checkout link:
none of the channels you pass in preferredChannels appears in the
reachableChannels list, so the link has no path to reach the recipient.
The API does not send a letter, a voicemail, or a fallback guess — it
refuses, and you fix the contact first.
Fix — add a reachable channel to the contact before the link is minted:
- Find the contact and check which channels your integration has marked reachable for them (an SMS-capable number, an email address, or whichever channels your channel-resolution step computed).
- Add the channel the contact can actually be reached on — update the
contact record (for example
PATCH /contacts/{id}) with the missing address or number, and run your channel-resolution step again so thereachableChannelsyou pass reflects the corrected contact. - Re-submit
POST /billing/pay-by-linkwith apreferredChannelsentry that now intersectsreachableChannels. The selection picks the first preferred channel the contact is reachable on.
Archival channel not enabled
OnPOST /compliance/archival/export, 409 ARCHIVAL_CHANNEL_NOT_ENABLED
means the export targeted a channel the archival policy does not include
— or archival was never enabled on the org at all. The export refuses
rather than half-collecting a channel the policy excludes, because an
archival bundle that skips an expected channel is worse than no bundle.
Fix — enable the channel in the archival policy, then re-dispatch:
- Read the current policy with
GET /compliance/archivaland checkchannels— the list the export gate crosses. - If archival is off entirely, or the channel is missing, upsert the
policy with
PUT /compliance/archivalnaming the channel the export asked for (thechannelsfield accepts the same channels the export accepts). - Re-run the same
POST /compliance/archival/exportonce. The gate reads the policy on every call, so the same export passes once the channel is enabled.
What not to do
- Do not retry in a loop. Every one of these gates re-fires on every attempt — a 422 or 409 here is deterministic, and only the fix above clears it. A retry loop just replays the same refusal.
- Do not reconfigure a trunk, a provider, or a codec. None of these gates dispatches — the refusal happens before any provider is touched, so no provider change will clear it.
- Do not wait for the gate to expire. Ring-group cycles, pay-by-link reachability, and archival policy gates never age out on their own.
- Do not ask for a second opinion from the error. The
detailsobject on the 422 (thecyclePath) or the named channel on the 409 is the answer — read it, then fix once.
See also
- References: error codes — the error catalog these three codes live in.
- Troubleshooting hub — every runbook grouped by surface; pick the one that matches your code.