iMessage + SMS API

Your own dedicated line for iMessage and SMS.

One REST endpoint to send, one signed webhook to receive. A dedicated business number that texts customers over iMessage and SMS — wired up in minutes.

iMessageSMS
POST /v1/messages
curl https://api.msgbubbles.com/v1/messages \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "from_handle": "+14155550123",
    "to": "+14155550199",
    "channel": "imessage",
    "text": "Your order has shipped"
  }'

From zero to your first text in three steps.

No per-channel SDKs, no juggling providers. Authenticate, send, and start receiving replies on one webhook.

01

Get your API key

Every /v1 request takes your secret key as a bearer token. The plaintext is shown once at mint time.

Authorization
# Test keys in dev, live keys in prod.
Authorization: Bearer sk_live_...
02

Send a message

POST a from_handle, a recipient, a channel, and your text. Switch from SMS to iMessage by changing one field.

POST /v1/messages
curl https://api.msgbubbles.com/v1/messages \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "from_handle": "+14155550123",
    "to": "+14155550199",
    "channel": "imessage",
    "text": "Your order has shipped"
  }'
03

Receive replies

Point one webhook at your app. Inbound messages and delivery updates arrive in a single, typed shape.

message.received
{
  "type": "message.received",
  "data": {
    "id": "msg_8x2k4d",
    "direction": "inbound",
    "channel": "sms",
    "from_handle": "+14155550199",
    "to": "+14155550123",
    "text": "Where's my order?"
  }
}

Built for coding agents.

The whole API fits in a prompt. Tell Claude Code — or any coding agent — what you're building, and it can integrate msgbubbles end to end without you reading a spec.

Fits in one context window

One endpoint to send, one webhook to receive, one response shape. An agent can hold the whole API in its head.

Errors agents can branch on

Stable error codes and a request ID in every response — no parsing prose to figure out what went wrong.

Point it at the docs

Hand Claude Code the docs, describe your flow, and let it wire up sending and receiving in a single prompt.

Everything you need to ship texting.

A dedicated line for iMessage and SMS, with the developer surface to match. Write one integration and move on.

A dedicated business line

Your own number for iMessage and SMS — not a shared shortcode or a borrowed sender.

One endpoint to send

A single POST /v1/messages call texts over iMessage or SMS. Flip one field to switch channels.

One webhook to receive

Inbound replies and delivery receipts arrive at one URL with a predictable, typed payload.

Signed, verifiable webhooks

Every delivery carries an HMAC-SHA256 signature so you can trust the payload before you parse it.

Idempotent by design

Replay a send with the same Idempotency-Key and get the original result back — never a double text.

Delivery status built in

Track queued, sent, delivered, and read events across iMessage and SMS in real time.

Ship texting in one prompt.

One number, one endpoint, one webhook. Tell us what you're building and we'll get you an API key.