MMS
Send multimedia messages (images, GIFs, vCards, PDFs, and other attachments) to NANP (US/Canada) destinations. Orbit exposes two MMS surfaces:- Single MMS —
POST /api/v1/messages/smswithmedia_url/media_urls. The SMS endpoint auto-upgrades the send to MMS as soon as one or more attachments are present. - Group MMS —
POST /api/v1/messages/groupfans a single payload (body + media) out to up to 20 recipients in one call.
Single MMS
There is no dedicated single-MMS endpoint — send through the SMS endpoint and attach media. Whenmedia_url or a non-empty media_urls array is present, the message is automatically upgraded from SMS to MMS by the Telnyx MMS provider.
Media fields
| Field | Type | Notes |
|---|---|---|
media_url | string | A single attachment URL. |
media_urls | string[] | Up to 10 attachment URLs. Both fields may be combined; together they upgrade the send to MMS. |
- Body is optional when at least one attachment is present — an MMS may be media-only.
- Each URL must be HTTPS and resolve through the send-time SSRF allowlist (e.g.
storage.googleapis.com). URLs that fail the allowlist or DNS-rebind check are rejected before dispatch. - Up to 10 attachments per message are forwarded to the provider.
Response
Group MMS
POST /api/v1/messages/group delivers a single MMS payload to up to 20 recipients in one operation (Twilio Notify / Bandwidth group-MMS parity). Each recipient is pre-inserted as a pending row before the per-recipient send pipeline runs, so a pre-send rejection (NANP gate, validation, fraud, quota, sender-validation, media SSRF, compliance) flips that recipient’s row to failed rather than dropping it silently.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
to | string[] | yes | 1–20 E.164 recipients. Duplicates in the same request are rejected. |
from | string | no | MMS-capable sender DID. Resolved through the standard sender chain when omitted. |
body | string | conditional | 1–1600 chars. At least one of body or media_urls must be present. |
media_urls | string[] | conditional | Up to 10 HTTPS attachment URLs (SSRF-allowlisted at send time). |
scheduled_at | string (ISO 8601) | no | Batch-level scheduling — every recipient lands as scheduled and the worker queue picks them up. |
webhook_url | string | no | One-off DLR webhook URL for this group send. |
metadata | object (string→string) | no | Shared metadata merged onto every recipient row. |
Cap: 20 recipients per call. The per-leg idempotency key is
group-mms:{group_id}:{to}. For larger sends use the batch endpoint or the campaigns module.Response — 207 Multi-Status
The group endpoint always returns a per-recipientmessages array and a summary. The HTTP status is:
- 200 OK — every recipient succeeded.
- 207 Multi-Status — any recipient failed (partial or total failure). Inspect the body for per-recipient
status/error_code. - 402 Payment Required — the org balance cannot cover the group floor (pre-flight check).
- 500 — bulk pre-insert failure (no recipients dispatched).
Message Status Flow
queued → sending → sent → delivered (or failed / undelivered)
Subscribe to status updates via webhooks using the message.sent, message.delivered, and message.failed events. For group MMS, one event fires per recipient, each carrying its own message id.
Rate Limits
| Surface | Limit |
|---|---|
Group MMS (POST /messages/group) | 30 requests / minute per tenant |
Single MMS (POST /messages/sms) | Same per-plan throughput as SMS |
Outbound provider
Outbound MMS is delivered via Telnyx, the named exception to Orbit’s outbound-termination policy: voice and SMS exit only via the Devotel softswitch, but MMS (alongside fax/T.38) outbound may use Telnyx because the softswitch does not support MT MMS. Orbit routes all MMS — single and group — through the standard messaging router; there is no provider bypass.Pricing
MMS is billed per message (not per attachment) and varies by destination. Check the pricing page or query theGET /api/v1/pricing/messaging?country=<ISO> endpoint for real-time rates (the returned channels array includes mms).