Languages: every operation supports cURL, Node.js (TypeScript), Python, Go, Ruby, and PHP. The first 15 operations on this page show all six languages; the remaining 20 show cURL and TypeScript — the two most-used.
RCS API
RCS endpoints exposed by the Devotel CPaaS API Base path:/api/v1/rcs
Endpoint count: 35
title: “Worked request and response samples” description: “Worked samples for RCS onboarding: register a bot, check its reach, and read template analytics. Each sample shows the request, the success envelope, and the error envelope to expect.”
Worked request and response samples
Copy a request body as written, substitute your own ids, and compare the response envelope. Errors follow Devotel Orbit’s{ error, meta } envelope, shown once below under Error envelope.
Create an RCS bot
POST /api/v1/rcs/botsScan reach for a segment
POST /api/v1/rcs/reach-scanList RCS templates for a bot
GET /api/v1/rcs/templatesstring
required
The bot whose templates you list.
Error envelope
422
Get RCS daily analytics
GET /api/v1/rcs/analytics/dailydate (YYYY-MM-DD) with sent, delivered and read counts. Pass days to set the window (1 to 90, default 30). Use it to chart send volume over time, to spot a delivery dip after a bot or template change, or to reconcile a billing period. Days inside the window with no traffic are omitted rather than returned as zeros, so pad the series client-side before plotting it.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get RCS template analytics
GET /api/v1/rcs/analytics/templatestemplate_name with sent, delivered, read and clicked counts plus the delivery_rate, read_rate and click_rate percentages derived from them, ordered by volume. Pass days to set the window (1 to 90, default 30). Use it to find which card or carousel earns taps before you scale a campaign onto it. Messages sent without a template are grouped under (no template), and a window with no RCS traffic returns an empty array.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List RCS bots
GET /api/v1/rcs/botscursor plus limit (defaults to 25, capped at 200). Use it to populate a bot picker, or to poll where each bot sits in the create → verify → launch sequence. An account with no bots yet gets an empty page rather than an error.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get RCS bot
GET /api/v1/rcs/bots/{id}dotgoBotId returned in the list, not the local record id), including its brand, contact and legal details, its status and verificationStatus, the per-carrier carrierStatuses map and a templateCount of the templates registered against it. Use it to render a bot detail page or to confirm a verification or launch submission has moved the bot on. Returns 404 when no bot with that id belongs to your account.
string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List RCS tester devices
GET /api/v1/rcs/bots/{id}/devicescursor plus limit (defaults to 25, capped at 200), where the cursor is the device id or phone number to continue after. A bot with no testers gets an empty page rather than an error.
string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get RCS bot quality
GET /api/v1/rcs/bots/{id}/qualitystatus and verification_status, whether it is launched on at least one carrier, and the per-carrier carrier_statuses map with carriers_launched out of carriers_total. Use it to drive a sender-health card, or to check reach before a campaign — a bot launched on only some carriers cannot reach subscribers on the rest. Returns 404 when no bot with that id belongs to your account.
string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List RCS templates
GET /api/v1/rcs/bots/{id}/templatescursor plus limit, where the cursor is the template name to continue after. Use it to populate a template picker or to audit which templates are still waiting on approval. A sync_warning field appears next to the envelope when the background approval-status refresh could not run — the templates are still returned. A bot with no templates, or a tenant whose template storage is not provisioned yet, gets an empty page rather than an error.
string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get RCS template
GET /api/v1/rcs/bots/{id}/templates/{name}string
required
—
string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List RCS brands
GET /api/v1/rcs/brandscursor plus limit, capped at 200 rows a page). The list projection carries brand name, website, logo, industry, country, the contact’s display name, status and rejection reason; the full KYC contact and address block is only returned by the single-brand read. Use it to render a brand picker before creating a bot. A tenant with no brands — or one whose database is still being provisioned — gets an empty page rather than an error.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get RCS brand
GET /api/v1/rcs/brands/{id}string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get RCS brand summary
GET /api/v1/rcs/brands/summarytotal, approved and pending — instead of the full list, so a readiness banner or a prerequisite check can decide whether this tenant has a usable brand without pulling every brand’s KYC contact and address payload. pending counts every brand that is neither approved nor rejected, so a brand still in draft is included in it. This is an always-up read: a tenant with no brands, or one whose database is still being provisioned, gets zeroes rather than an error.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Check RCS capability
GET /api/v1/rcs/capability/{botId}/{phone}fallback: "sms" when the handset is not RCS-capable — so a caller can route the message down the SMS path in the same round trip. botId is the bot’s provider id and must belong to the calling tenant; phone is the recipient in E.164 form.
string
required
—
string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List RCS commerce catalog
GET /api/v1/rcs/commerce/catalogstring (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get RCS test account status
GET /api/v1/rcs/test-account/statusstring (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Create RCS bot
POST /api/v1/rcs/botsbrand_id pointing at an approved brand, a display_name, a description of 100 characters or fewer, tos_url and privacy_policy_url as HTTPS links, at least one of contact_phone or contact_email, and a non-empty carrier_mccmnc list of the 5–6-digit MCC/MNC carrier codes the agent should target; carriers reject a submission missing any of them. Optional bot_type (OTP, Transactional, Promotional or Multi-Use, case-sensitive), region, platform, and billing_category shape how the bot is routed. Create the bot first, then submit it for verification and launch. Returns 409 when the referenced brand is not approved yet, and 422 when a field is off-contract.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Add RCS tester device
POST /api/v1/rcs/bots/{id}/devices{ phone } in E.164 form. Add your own device here first when you are building a rich-card flow — an unlaunched bot cannot message any other number. To send the handset an on-device opt-in prompt instead of registering it directly, use the tester-invite endpoint. Returns 201 with the registration result.
string
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Submit RCS bot for launch
POST /api/v1/rcs/bots/{id}/launchverified first — launching earlier returns 409 INVALID_LAUNCH_STATE. Send an optional { carrier_mccmnc } list of MCCMNC ids to stage the rollout across a subset of networks, and an optional comment (up to 2000 characters) that carriers see with the request. The bot moves to pending_launch immediately; each carrier’s decision arrives later and updates the bot’s carrier_statuses, so poll the bot or its quality endpoint rather than expecting a launched bot back from this call.
string
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Create RCS template
POST /api/v1/rcs/bots/{id}/templates{ rich_template_data } holding the rich-card or carousel definition, including the name that identifies the template on later reads, updates and sends. Any rich deep-link action in it needs a valid deepLink and fallbackUrl — a malformed one is rejected with a 422 before the template reaches the RCS platform. The template is submitted for approval and stored with a pending approval status so you can track the outcome. Returns 201 with the submission result.
string
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Send RCS tester invite
POST /api/v1/rcs/bots/{id}/tester-invite{ phone } in E.164 form. The invite lands on the handset as a tester request; once it is accepted, the bot can exchange messages with that number while it is still unlaunched, which is how you preview cards and suggested actions on a real device. Returns 503 with a retryable message when the upstream RCS platform is briefly unavailable, so a failed invite is safe to retry.
string
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Submit RCS bot for verification
POST /api/v1/rcs/bots/{id}/verifymultipart/form-data with the conversation screenshots carriers ask for (screenImages[], up to 10), the KYC documents (kycdocs[], up to 5) and an optional brandLogoImage, each file up to 5MB, plus an optional JSON data field that overrides values otherwise filled in from the linked brand. A JSON-only body carrying just data is accepted for the same payload, but a submission without files is normally refused by the carrier. On success the bot moves to pending_verification and the submission is recorded on its history. Returns 409 when the bot and its brand do not carry enough detail to build a complete submission.
string
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Create RCS brand
POST /api/v1/rcs/brandsdraft status. A brand carries the identity and KYC details carriers ask for before they let a bot message their subscribers — brand name, website, logo, industry vertical, a contact person with email and phone, the postal address, and optionally a tax id or legal entity name. Creating a brand does not start the review; patch it until it is complete, then submit it. Returns 201 with the stored brand, or 422 listing the fields that failed validation.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Submit RCS brand for approval
POST /api/v1/rcs/brands/{id}/submitpending_review and is queued for the Devotel review team — carrier brand registration is a manual workflow rather than an instant approval, so wait for the status to change before you rely on the brand for a bot. Accepted from draft, from rejected once you have corrected what the reviewer called out, and from pending_review, where it is a safe re-send: if the review has already moved on, the call re-syncs your view of the brand instead of restarting it. Any other status returns 409 naming the status that blocked the submission, and an id that is not a brand in this tenant returns 404.
string
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Send RCS catalog carousel
POST /api/v1/rcs/commerce/send-catalogproduct_ids to send the whole catalog — the renderer caps it at the RBM carousel ceiling. At least two usable products are required; fewer returns a validation error. Use it to turn a product list into a shoppable conversation.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.string
Recipient phone number in E.164 format.
string[]
Catalog product (retailer) ids to include. Omit to use the whole catalog.
string
Optional message text rendered above the carousel.
string
HTTPS URL opened by the message-level checkout suggested action.
string (enum: SMALL|MEDIUM)
Carousel card width.
string
Override label for the per-card add-to-cart suggested action.
string
Override label for the message-level checkout suggested action.
Scan RCS reach for a segment
POST /api/v1/rcs/reach-scansample_size contacts from the segment, probes each number’s RBM capability, and returns the capable share plus a recommended channel mix (rcs, mixed, or sms). Use it to decide between an RCS-only send and an SMS fallback split. Owner / admin / developer only — it reads contact phone numbers and fans out billable capability lookups. An unknown bot or segment returns 404 rather than a misleading 0% reach.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.string
Provider bot id to probe reach for. Must belong to this tenant.
string
Contact segment whose members are sampled.
any
How many segment members to probe (defaults to 50, capped at the platform sample ceiling).
Combined first RCS setup (brand + first bot)
POST /api/v1/rcs/setupbot_contact_phone / bot_contact_email, a non-empty carrier_mccmnc list of the 5–6-digit MCC/MNC carrier codes the agent should target — the RCS provider rejects an agent without a carrier list — and optional bot_type / region / platform / billing_category). The server creates the brand, marks it submitted (observe-only — there is NO blocking platform approval step), then submits the bot to the RCS directory with the brand bundled in the same combined registration, because the RCS provider has no standalone brand-creation API and receives the brand ONLY alongside the bot. Returns 201 with { brand, bot } on success. This endpoint is for the FIRST setup only — a tenant that already has a brand reuses it with POST /rcs/bots (passing its brand_id); sending setup with an existing brand returns 422. 422 when a field fails validation; 502 with the provider’s rejection reason verbatim when the directory refuses the combined submission; 500 when the local record could not be saved after the provider accepted (try again — our team is notified).
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Change RCS test account number
POST /api/v1/rcs/test-account/change-numberstring
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Send RCS test account OTP
POST /api/v1/rcs/test-account/send-otpverification_id until the invite is accepted on the handset. Formatting characters are stripped, but the number must resolve to E.164; a handset with no RCS support is rejected instead of being registered. Owner / admin / developer only, limited to a few attempts per 10-minute window per organization.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.string
Handset to verify, in E.164 format (spaces, dashes, dots, and parentheses are stripped first).
Verify RCS test account OTP
POST /api/v1/rcs/test-account/verify-otpverification_id. This is a poll, not a manual code submit: verification finishes when the tester invite is accepted on the handset, which this endpoint re-checks on every call. While the invite is still waiting to be accepted it answers 425 PENDING_ACCEPTANCE — keep polling (the dashboard polls every few seconds for up to ten minutes). A declined invite returns 422 INVITE_DECLINED, and an unknown or expired session returns 422 — in both cases start again with send-otp. code is accepted for backwards compatibility and ignored. Owner / admin / developer only, rate-limited per minute to match the polling cadence.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.string
The
verification_id returned by send-otp.string
Deprecated. Accepted for older clients and ignored — acceptance happens on the handset.
Update RCS bot
PUT /api/v1/rcs/botsbrand_id, which must still point at an approved brand. Use it to correct a display name, description, legal URLs or contact details before verification, or to widen carrier_mccmnc afterwards. Changes to a verified bot may require re-verification by the carriers. Returns 409 when the brand is not approved and 404 when the brand has no bot.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Update RCS template
PUT /api/v1/rcs/bots/{id}/templates/{name}{ rich_template_data } — the update overwrites the stored card rather than merging individual fields — and keep the same name so existing references stay valid. Rich deep-link actions are validated the same way as on create. The template returns to pending approval after the change, so publish updates before a campaign depends on them.
string
required
—
string
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Update RCS brand
PATCH /api/v1/rcs/brands/{id}draft or rejected, which is what lets you correct the details a reviewer called out and resubmit; any other status returns 409 with the status that blocked the edit. Returns the updated brand, 404 when the id is not a brand in this tenant, or 422 listing the fields that failed validation.
string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Delete RCS bot
DELETE /api/v1/rcs/bots/{id}string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.204 No Content
Remove RCS tester device
DELETE /api/v1/rcs/bots/{id}/devices{ phone } in E.164 form as the request body rather than in the path. The handset stops receiving messages from an unlaunched bot straight away; a launched bot still reaches it as an ordinary subscriber. Returns 204 with no body, and 403 when the bot does not belong to your account.
string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.204 No Content
Delete RCS template
DELETE /api/v1/rcs/bots/{id}/templates/{name}string
required
—
string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.204 No Content
Delete RCS brand
DELETE /api/v1/rcs/brands/{id}draft or rejected can be deleted — one in review, already sent to the carrier directory, approved or suspended returns 409, so a brand backing a live bot cannot disappear underneath it. Bots linked to the brand are not deleted; they are unlinked and stay in place for you to re-link or remove. Returns 204 with no body, or 404 when the id is not a brand in this tenant.
string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.204 No Content