Templates and campaigns are created in the dashboard, not through the API. The API lets you send messages (with inline content or a
template_id), trigger and pause campaigns, and retrieve message history — but the flow builder and template editor are dashboard-only tools. See Identifiers to find template and campaign IDs for use in API calls.How messaging works
Every message follows the same lifecycle regardless of channel:You send — POST /v1/messages
Your server calls
POST /v1/messages with your content and recipient. The platform validates your balance, verifies the channel is active, and places a billing hold. You receive a message_id immediately.Platform queues and dispatches
The message is dispatched to the channel provider (the carrier network for RCS/SMS, the email infrastructure for email). This is asynchronous — the API returns
queued straight away, not delivered.You receive delivery events — via webhook
As the message moves through its lifecycle, events fire to your registered webhook endpoint:
message.delivered, message.read, message.failed, etc. This is how you know the message was delivered — not from the original send response.For RCS: user replies come in as webhook events too
When the user replies to your RCS message, the reply arrives at your webhook as a
conversation.started event. A 24-hour session is now open for that agent + phone number pair. You can then send follow-up messages using message_type: CONVERSATION within that window.Email is one-directional from the API perspective — you send, and you receive delivery status events (delivered, bounced, opened, clicked). There is no inbound email reply flow through this API.
Send a message
| Channel | Key discriminators |
|---|---|
channel_id + to (email address) | |
| RCS | agent_id + to (phone number) |
| SMS | channel_id + to (phone number) |
Required headers
Bearer <api_key> — see Authentication.A UUID to prevent duplicate sends on retry. Always include this for message sends.
application/jsonSend response
The API responds immediately.status: "queued" means the message was accepted — not that it was delivered. Delivery confirmation comes via webhook.
Save this. Use it to track status via
GET /v1/messages/{id} and to correlate incoming webhook events.Always
queued on the send response. Final states (delivered, failed, etc.) arrive via webhook or GET /v1/messages/{id}.Balance reserved until delivery resolves. Released on failure; charged on success.
Expected unit price for this message classification and tier. Equal to
hold_amount on queued sends.Send errors
| Status | Meaning | What to do |
|---|---|---|
| 400 | Invalid payload | Check details[] for field-level errors |
| 402 | Insufficient balance | Top up via topup_url in the response |
| 403 | Channel not authorised | Sending domain not verified or RCS agent not approved |
| 404 | Device not RCS-capable | Device capability is checked automatically at send time |
| 422 | Consent / suppression | Missing or revoked consent, or recipient suppressed — see Consent API |
| 429 | Rate limit | Back off using retry_after seconds |
Track delivery
Option A — Webhooks (recommended)
Register a webhook endpoint and subscribe to delivery events. The platform pushes updates to your URL as they happen. Every event uses the same envelope:RCS and SMS delivery events use
message.* names. Email delivery events use email.* names — email.delivered, email.bounced, email.opened, email.clicked. Subscription names matter: an endpoint subscribed to message.delivered will not receive email.delivered. See the Event types catalogue for the full list.| Event | Meaning |
|---|---|
message.delivered | Confirmed delivery to the device |
message.read | User opened the message (RCS only) |
message.failed | Permanent failure — hold released, not charged |
message.expired | TTL elapsed before delivery — hold released |
| Event | Meaning |
|---|---|
email.delivered | Accepted by recipient mail server |
email.bounced | Hard or soft bounce received |
email.opened | Open tracking pixel fired |
email.clicked | Tracked link clicked |
Option B — Poll GET /v1/messages/{id}
Poll the status endpoint to get the current state and full event timeline. Useful for debugging or one-off checks, but webhooks are more efficient for production.
Receive user replies (RCS only)
When an RCS user replies to your message, the platform fires a webhook event to your endpoint. You do not poll for replies — they are pushed to you.message_type: CONVERSATION. Sends within this window use Conversation billing — see RCS conversation for the full session model.
Choose your send type
Action-based email
MESSAGE — triggered by a user action or system event. No consent required beyond channel setup.Subscription email
NEWSLETTER — opted-in list sends. Consent enforced at send time.RCS
Text
Plain text — Basic or Single depending on length and chips.
Rich card
Image, title, description, action chips — always Single.
Carousel
2–10 cards in a horizontal scroll.
Conversation
Reply within a 24-hour session opened by a user reply — Conversation billing.
Newsletter
Opted-in bulk sends — MAU billing per subscriber per month.
SMS
SMS send is coming soon. Phone numbers (Mobile and Landline) can be purchased today via the dashboard — see SMS overview.
Revoke & status
Cancel a queued message or check its full delivery timeline.
Related
Webhooks
Register endpoints, verify signatures, and see the full event catalogue.
RCS platform
Agents, messaging, and delivery tracking.
Billing units
How message types map to billing charges.
Conventions
Rate limits, idempotency, and error envelopes.