Send iMessage via API
What is actually possible, what you need, and the exact request. SendiMessage sends over iMessage where the recipient and line support it, with SMS fallback where configured — through one POST.
What's possible
Apple does not offer a public server-side iMessage API for sending business messages from your application, and does not partner with or endorse third-party providers for this. SendiMessage is an independent product that operates managed messaging lines and exposes them through one REST API — iMessage where the recipient and line support it, with SMS fallback where configured.
So "send iMessage via API" in practice means sending through a managed provider that operates a line for you. With SendiMessage you make one authenticated POST and we handle routing, delivery, and fallback.
Before you begin
You need a SendiMessage organization, an active managed line, an API key + secret (server-side only), and a test recipient. Lines and credentials are provisioned by our team after a use-case review — there is no public self-signup.
The request
curl -X POST "https://api.sendimessage.com/v1/send-message" \-H "Content-Type: application/json" \-H "X-API-Key: $SENDIMESSAGE_API_KEY" \-H "X-API-Secret: $SENDIMESSAGE_API_SECRET" \-d '{ "number": "+14155550123", "content": "Your order shipped." }'
The response (201)
{"status": "QUEUED","message_handle": "4e828182-a640-483f-bfe9-17ffcaa51d48","from": "+15555550100","to": "+14155550123","content": "Your order shipped.","media_url": null,"service": null,"is_outbound": true,"error_message": null,"date_created": "2026-08-21T09:07:34+00:00","date_sent": null}
Sending is asynchronous. Keep the message_handle to poll GET /status or correlate the outbound webhook. Numbers are E.164, e.g. +14155550123. Omit line_handle to use any active line.
Can recipients reply?
Yes. Replies arrive on your line, are threaded into conversations, and are delivered to your application as the signed receive webhook event.
Limits
Lines carry per-line hourly and daily sending caps plus a daily new-recipient cap, set at provisioning and visible via GET /lines. Messaging an existing contact does not count against the new-recipient cap. iMessage is never guaranteed for every recipient — SMS fallback covers the rest where configured.
See the full reference
Every field, status, and error is documented, with copy-paste examples.