Skip to main content

MMS

Send multimedia messages (JPEG, PNG, GIF, and WebP images, plus a set of carrier-accepted audio and video formats) to NANP (US/Canada) destinations. Each attachment is capped at 5 MB. Orbit exposes two MMS surfaces:
  1. Single MMSPOST /api/v1/messages/sms with media_url / media_urls. The SMS endpoint auto-upgrades the send to MMS as soon as one or more attachments are present.
  2. Group MMSPOST /api/v1/messages/group fans a single payload (body + media) out to up to 20 recipients in one call.
An end-to-end recipe — send → 202 → the delivery webhook → the NANP / media-type error branch — is in the MMS recipe of the thin-channel pack.
Coverage: MMS is delivered to NANP (US/Canada, E.164 +1) numbers only. Non-NANP recipients are rejected per-message with MMS_NANP_ONLY. For non-NANP destinations send picture content as a WhatsApp or RCS message instead.

Single MMS

There is no dedicated single-MMS endpoint — send through the SMS endpoint and attach media. When media_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

  • 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.

Supported media types and size limit

Each attachment is content-type-checked and size-checked at send time (Orbit issues an HTTPS HEAD request against the URL). Attachments outside this allowlist, or larger than 5 MB, are rejected before the message is dispatched — the carrier MMSC and the underlying provider reject them, so the send fails fast with a 422 rather than silently dropping the media.
  • Maximum size: 5 MB per attachment (hard limit). For the most reliable delivery across carriers, keep each attachment under 1 MB — larger images are frequently down-rendered or dropped by individual carrier gateways even under the 5 MB ceiling.
  • Not supported: documents (PDF), contact cards (vCard), and other content types outside the table above. To deliver those, link to an HTTPS-hosted file in the message body, or send the content over WhatsApp or RCS instead.

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

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 — 200 / 207

The group endpoint always returns a per-recipient messages 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).

Error recovery: pre-filter NANP recipients

MMS rejects non-NANP (non-+1) recipients per-message with MMS_NANP_ONLY. Filter them out before you call the endpoint to avoid a 207 per-recipient failure for what is a known non-deliverable.
When a fanout does report MMS_NANP_ONLY on a recipient, treat it as a routing hint rather than a retryable error: send picture and video content to that recipient over WhatsApp or RCS instead. To page through the group result and re-drive a retryable failure class, use the cursor pagination recipe — it covers the meta.pagination.cursor walk for list endpoints and generalises to any paged surface. queuedsendingsentdelivered (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

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.

Limits

Consolidated caps enforced at send time:

Deciding when to use MMS

MMS is one answer to “I need to send rich content to a US/Canada mobile number.” Pick the right surface before you build:
  • Inline image, video, or audio — use MMS. Attach up to 10 files, 5 MB each, on the SMS endpoint or the group endpoint. NANP recipients only.
  • Contact card, document, or anything outside the media table — MMS rejects it with a 422. Prefer an HTTPS link in the message body (vCard files, PDFs, boarding passes, receipts): host the file, send the URL. The recipient taps through and no carrier media filter can down-grade it.
  • Non-NANP recipients — MMS stops at US/Canada. Route picture and video traffic to WhatsApp or RCS for international numbers. A recipient that soft-fails with MMS_NANP_ONLY is telling you to switch channels, not retry.
  • Text-only copy — use plain SMS. If the body carries the whole message and there is no attachment, SMS is the cheaper and simpler surface; MMS only buys you the media fields. A rejected MMS (media-type or size rejection) also does not silently fall back to SMS — re-send on the right surface.

Still not delivering?

If a message is accepted but never reaches the handset, walk the delivery tree:
  1. Confirm the message is in delivered state, not sentsent means the carrier accepted it, not that the device received it. The message status model maps every state transition and what each one proves.
  2. For undelivered or failed states, use the undelivered / failed message guide — it covers the carrier-rejection and handset-rejection classes that MMS specifically raises (MMS_NANP_ONLY, media-type rejection, size rejection, destination unreachable).
  3. For inbound MMS that sends but never arrives in your webhook, check inbound channel routing.
Group MMS fans out one status event per recipient, so a group send with 20 recipients produces 20 delivery traces — diagnose them one at a time, not as a batch.

Pricing

MMS is billed per message (not per attachment) and varies by destination. Check the pricing page or query the GET /api/v1/pricing/messaging?country=<ISO> endpoint for real-time rates (the returned channels array includes mms).