Troubleshooting: RCS tester invite 425 PENDING_ACCEPTANCE and 422 INVITE_DECLINED
Your poll ofPOST /api/v1/rcs/test-account/verify-otp is returning
425 PENDING_ACCEPTANCE or 422 INVITE_DECLINED, and it reads like a
failure. It is not: both are states of the tester-invite flow, and the
difference between “waiting”, “declined”, and “actually broken” is the whole
of this page.
The three-step flow and what each state means
- Send the invite.
POST /api/v1/rcs/test-account/send-otpwith{ "phone": "+14155552671" }checks the handset’s RCS capability, registers it as a tester device on Devotel’s shared bot, and delivers the tester invite. It returnsverification_id,expires_in: 600, andverification_mode: "tester_invite_acceptance"— there is no numeric code to type; the tap on the handset is the verification. - Poll until accepted.
POST /api/v1/rcs/test-account/verify-otpwith{ "verification_id" }. While the invite sits untapped on the handset, every poll answers425 PENDING_ACCEPTANCE. That is the waiting state, not an error — keep polling. The dashboard polls every ~4 seconds for up to 10 minutes, and your integration should do the same. Once the recipient accepts, the same call returns{ "verified": true, "phone" }. - Read the boundary.
GET /api/v1/rcs/test-account/statusshowsverified,verified_phone,daily_remaining,lifetime_remaining, andsuspended— check it before concluding anything is broken.
There is no server-side acceptance ETA: acceptance happens when the person
holding the handset taps, and nothing you send accelerates it. If the
10-minute window expires first, the session is gone — start over from
send-otp.
The handset side of the Dotgo RBM tester invite
The invite lands as an RCS message from the shared bot (“Orbit by Devotel agent has invited you to be a tester”) with native Make me tester / Decline buttons, in Google Messages on an Android handset with RCS chat features turned on. Until the tap happens the device is registered but unverified, and every verify-otp poll 425s.send-otp registers the number as a tester device before it invites, so a
handset that cannot participate in RCS is rejected at that first step: an
iPhone, an Android without Google Messages / Chat features, or a number the
RBM directory has no reachable entry for returns 422 RCS_NOT_SUPPORTED
(“Use an Android phone with Google Messages and RCS chat features turned
on”). That refusal is definitive for the handset — switch to an RCS-capable
Android device rather than retrying the same number. A 503 from send-otp,
by contrast, is a transient upstream blip — a retry after a moment is safe.
Rate limits
Every
429 RATE_LIMITED body carries retry_after in seconds: the time left
in the window, not a suggestion. Honor it instead of retrying — an immediate
repeat fails identically and keeps you inside the window. A 429 mid-poll on
verify-otp is harmless to the flow: because the window is per-minute, it
clears in under a minute and the next tick resumes where it left off.
The demo boundary counters
The test account is a demo surface with two counters, both per organization:- 20 demo sends per day — resets when the UTC date rolls over.
- 200 demo sends per account lifetime.
POST /api/v1/rcs/test-account/change-number: re-verifying a new handset
does not reset either one, because the boundary caps demo usage, not
handsets. So if daily_remaining or lifetime_remaining on
GET /api/v1/rcs/test-account/status reads 0, re-running send-otp /
verify-otp or changing the number will not “fix” the quota — wait for the
daily reset, or move to your own approved brand and launched bot
(RCS onboarding guide). A send past either counter
returns 429 RATE_LIMIT_EXCEEDED naming the limit it hit.
What not to do
- Do not treat
425 PENDING_ACCEPTANCEas a fault or stop polling on it — it is the flow working as designed; alerting on it pages you for a waiting human. - Do not re-fire
send-otpto speed acceptance up. Acceptance happens on the handset; a resend only spends one of your hourly sends and re-notifies the recipient. - Do not retry
422 INVITE_DECLINEDor an expired session with the sameverification_id. A declined or expired session can never flip to accepted — restart fromsend-otp. - Do not re-verify to restore quota. The counters survive
change-numberby design.
When to escalate
Escalate to support@devotel.io when a503
persists across retries, when the invite never arrives on a handset that is
verifiably RCS-capable, or when verify-otp 425s for the full 10-minute window
although the recipient did tap Make me tester. Include:
- The
verification_idreturned bysend-otp. - Your organization id (dashboard → Settings → Organization, or
organizationIdonGET /api/v1/me). - The verbatim
codeandmessagefrom the failing response, plus the handset model and messaging app on the receiving side.
See also
- RCS channel guide — test account — the flow and its quotas as reference
- RCS channel guide — tester devices — per-bot tester registration once you have your own bot
- RCS onboarding guide — the path from the demo to your own approved brand and launched bot
- RCS questions, answered — the FAQ’s RCS section