POST /v1/messages with message_type: MESSAGE and a text body. Classification into Basic or Single depends on content:
| Condition | Billing unit |
|---|---|
| Text ≤ 160 UTF-8 chars, no suggestions, no rich body | Basic Message |
| Text > 160 chars, or any suggestions, or rich content | Single Message |
traffic_type (for example TRANSACTION, PROMOTION) is required and must reflect the regulatory classification of your use case.
Request
Path params / headers
Bearer <api_key> — see Authentication.UUID to prevent duplicate sends on retry — see Conventions.
Body — Basic text (no suggestions)
Destination phone number in international format (e.g.
+4917612345678).Approved production agent id (
ag_live_…). Must be in APPROVED state.MESSAGE for one-shot sends.Message body in UTF-8. Maximum 3,072 characters. Keep ≤ 160 characters with no suggestions to stay on Basic pricing.
Regulatory classification of the message content. Must match the agent’s approved
use_case.| Value | Use when |
|---|---|
AUTHENTICATION | One-time passwords and authentication codes (OTP agents) |
TRANSACTION | Transactional alerts related to an existing customer relationship |
PROMOTION | Marketing and promotional content |
SERVICEREQUEST | Service messages the user has explicitly consented to receive |
ACKNOWLEDGEMENT | Confirming receipt of a user’s unsubscribe or opt-out request |
Delivery expiry as a duration string (for example
"3600s"). Message is automatically revoked if not delivered within this window.Body — Text with suggestions (Single Message)
Anysuggestions array forces Single Message classification, regardless of text length:
Array of suggestion chips. Maximum 11 suggestions per message. Any non-empty
suggestions array triggers Single Message billing.Each item is one of:reply— quick reply chip:{ "text": "...", "postback_data": "..." }. Text max 25 chars.postback_datamust be base64-encoded; max 2048 chars.action— native action chip:{ "text": "...", "fallback_url": "...", "<action_type>": { ... } }. Text max 25 chars.fallback_urlis optional; opens in browser on devices that don’t support the native action.
| Action type | Required fields | Notes |
|---|---|---|
dial | phone_number | International format (e.g. +4930123456) |
open_url | url | https:// or http:// only — tel:, mailto:, and sms: schemes rejected since Nov 2025 |
open_url_in_webview | url, view_mode (FULL, HALF, TALL) | Requires device support for ACTION_OPEN_URL_IN_WEBVIEW |
view_location | lat + long + optional label; or query string | Opens map app |
share_location | (no fields) | Lets user share their location back |
create_calendar_event | title (max 100 chars), description (max 500 chars), start_time, end_time | Opens calendar pre-filled |
Responses
- 200 OK
- 402 Insufficient balance
- 403 Forbidden
- 404 Not capable
- 429 Rate limited
Message accepted; dispatch is async. Poll
GET /v1/messages/{id} or listen for message.* webhooks.Unique message id. Use with
GET /v1/messages/{id}, DELETE, and for webhook correlation.Initial state — always
queued on accept. Final state arrives via webhook or GET.ISO 8601 UTC timestamp when the send was accepted.
Cost snapshot for this send.
Related
- RCS rich card — always Single Message
- Billing (RCS) — Basic vs Single rules in detail
- Revoke & status —
GETandDELETEfor this message