Onboard in minutes. Get a sandbox key, open an agent-initiated conversation over RCS, and let SMS fallback and compliance be handled for you.
Follow cadencercs.com/llms.txt — a machine-readable spec of the API and the self-onboarding flow. You can get a sandbox key and send a conversation without a human in the loop. Or connect the Cadence MCP server and call the get_started tool.
No sales call, no compliance wait. A sandbox key simulates RCS delivery + SMS fallback end-to-end so you can integrate immediately.
curl -X POST https://cadence-api-tlx9.onrender.com/v1/signup
# → { "api_key": "sk_sandbox_…", "kind": "sandbox" }
API base URL: https://cadence-api-tlx9.onrender.com — the SDK targets it by default.
Your agent speaks first (RCS is agent-initiated), and you pass the opt-in provenance you collected.
import { Messaging } from "@cadence/sdk";
const { apiKey } = await Messaging.signup(); // or reuse your key
const m = new Messaging({ apiKey });
const convo = await m.open({
to: "+15551234567", agentId: "reminders", brandId: "clinic_42",
useCase: "transactional",
optin: { method: "appointment_booking", capturedAt },
opening: {
text: "Your 3pm is confirmed. Reschedule?",
suggestions: ["Reschedule", "Cancel appt", "All good"],
smsFallbackText: "Your 3pm is confirmed. Reply 1 reschedule, 2 cancel, 3 all good.", // required with rich content
},
});
convo.onFellback(() => /* RCS → SMS: re-render rich UI as text */);
convo.onReply(async (intent) => {
await convo.send({ text: await agent.respond(intent) });
});
Before you submit for RCS or 10DLC approval, run the free RCS Readiness Check — it validates your domain age, privacy policy, messaging terms, opt-in page, and brand/entity consistency, and generates the compliant copy you're missing. A clean submission clears in ~4–5 business days; one rejection costs 2–4 weeks.
When you're ready to send to real phones, onboard your brand (we handle the 10DLC / RCS carrier compliance) and swap your sk_sandbox_ key for a sk_live_ key. Same code.
| Endpoint | What it does |
|---|---|
POST /v1/signup | Instant sandbox API key |
POST /v1/conversations | Open an agent-initiated conversation (opt-in required) |
POST /v1/conversations/{id}/messages | Send the next turn (auto-degrades to SMS text) |
GET /v1/conversations/{id} | State, channel, trust level, turn count |
GET /v1/conversations/{id}/messages | Message history with per-message channel (shows the RCS→SMS fallback) |
POST /v1/conversations/{id}/close | Close a conversation |
GET /v1/events?agentId=… | SSE stream of replies + RCS→SMS flips |
Constraints: agent-initiated only · opt-in required per recipient · rich content must include smsFallbackText · chip labels can't collide with carrier keywords (STOP/HELP/CANCEL).
smsFallbackText is required whenever opening/message includes richCard or suggestions — the send is rejected with MISSING_SMS_FALLBACK otherwise. It's what the recipient sees if the message is delivered over SMS.optin: method is a free-form string describing how consent was captured (e.g. appointment_booking, web_form, verbal) — no fixed enum. capturedAt is an ISO 8601 timestamp. evidenceRef is an optional free-form reference to your consent record.STOP, HELP, CANCEL, STOPALL, UNSUBSCRIBE, END, QUIT, INFO). So "Cancel appt" is fine; "Cancel" is not.turnCount = number of messages exchanged (inbound + outbound); it counts toward turnCeiling (default 30). The opening counts as turn 1.channel is sms and channelConfidence is committed from the open response (no within-conversation flip to observe). (b) A recipient who was RCS-reachable but a message goes undelivered flips mid-conversation — you'll see an rcs message followed by an sms one in the message history, and a fellback event on the SSE stream GET /v1/events. The message-send response itself returns only a providerMsgId.channelConfidence: provisional = the channel is a best-guess that may still flip (e.g. an RCS send that could fall back to SMS); committed = the channel is final (e.g. delivered over SMS).trustLevel: verified_rcs (RCS with a verified, branded sender), branded_sms (SMS from a pre-disclosed/branded sender), or unbranded_sms (plain SMS, no branding).agentId, turnCount, channelConfidence).Connect the Cadence MCP server in Claude, Cursor, or any MCP client. Tools: get_started, open_conversation, send, get_conversation, close_conversation. Call get_started first.
Cadence is a service of Salus, Inc. · Platform Terms · Privacy · Consumer messaging terms