Send an iMessage from your code in one call

One POST, one bearer header, and the message lands as a blue bubble with RCS then SMS fallback behind it. Replies come back over signed webhooks. No A2P registration, no carrier desk, nothing to provision.

One call, three languages

Authenticate with a bearer key and post a message. Sends are paced by default so lines stay deliverable; pass send_mode instant when it has to go now.

curl -X POST https://api.bluereacher.com/v1/messages \
  -H "Authorization: Bearer $BLUEREACHER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"to":"+15551234567","message":"Hi Alex, worth a quick chat this week?"}'

Every endpoint

19 endpoints under https://api.bluereacher.com/v1. Request and response schemas for every one of them are in the OpenAPI spec and the docs.

Messaging

POST /messagesSend a text or media message
POST /voice-memosDeliver audio as a native voice memo
GET /status/{message_id}Delivery status of a queued item

Conversations

GET /conversationsConversation history for a number or group
GET /groupsList group chats

Lines

GET /devicesList sending lines with live capacity

Signals

POST /reactionsSend a native iMessage tapback
DELETE /reactionsTake back a tapback
POST /typingShow or clear the native typing bubble
POST /readClear unread state, optionally with a native read receipt

Contacts

GET /contactsSearch and list contacts
POST /contactsCreate a contact (upsert by phone)
PATCH /contacts/{contact_id}Update a contact, including opt-out
GET /opt-outRead a contact's opt-out state
POST /opt-outOpt a contact out, or back in with explicit confirmation
GET /botRead whether the AI assistant will reply to a contact
POST /botPause, hand off, or autopilot the AI assistant for one contact

Utility

POST /capabilityiMessage vs SMS capability for phone numbers
GET /usageUsage by key and endpoint

Webhooks

Subscribe an HTTPS endpoint and events arrive signed with an HMAC header, retried with backoff for 24 hours.

{
  "event": "message.received",
  "from": "+15551234567",
  "content": "Tuesday works, send the link",
  "channel": "imessage",
  "message_id": "msg_8814"
}

MCP, for agents

The same surface as tools, over HTTP with bearer auth and nothing to install: 22 tools, hosted. The messaging tools share validation and response shapes with the REST API, and four human-gated calling tools are MCP-only. The server card is at /.well-known/mcp.json.

{
  "mcpServers": {
    "bluereacher": {
      "type": "http",
      "url": "https://api.bluereacher.com/v1/mcp",
      "headers": { "Authorization": "Bearer $BLUEREACHER_API_KEY" }
    }
  }
}

Works in Claude Code, Claude Desktop, Cursor and any MCP-capable client. The full tool list is on the MCP page.

Limits and pacing

New conversations50 opted-in / 30 cold per line per day
Counts brand-new contacts only: anyone who has ever replied, and anyone you have messaged before, is unlimited. The thresholds track Apple's enforcement rather than a number we invented, and they scale up as a line's reply rates prove out.
Replies in an open threadUnlimited
No per-message fee and no segment metering, so a heavy month costs the same as a quiet one.
Instant sends10 per minute, 75 per day per key
Drip is the default and is paced by the platform to stay conversational; instant dispatches immediately from an online line for the messages that cannot wait.
Group threads25 recipients
iMessage only: send into an existing group thread, or create a new group iMessage from 2 to 25 numbers in the send call itself.
Pagination50 default, 200 maximum
Cursor-based. Pass the previous page's next_cursor.
Rate limiting429 with Retry-After
The header carries the wait in seconds. Per-key ceilings are published in the docs.

Every machine-readable surface

Everything below is served from bluereacher.com with no key and no form.

Developer questions

Do I need A2P 10DLC registration?

No. iMessage is not carrier SMS, so there is no brand registration, no campaign approval queue and no per-message carrier surcharge. TCPA consent and opt-out rules still apply, and STOP detection is built in.

What happens when the recipient is not on iMessage?

The platform falls back to RCS, then SMS, from the same number, automatically. The channel that carried each message comes back on the message record and on the status webhook.

How do I avoid sending the same message twice?

Pass external_id. Retrying a request with an external_id you have already used returns the original message rather than sending again, so a retry after a timeout is safe.

Is there a sandbox?

Line provisioning is white-glove rather than self-serve, so a key is issued against a real line during onboarding. The OpenAPI spec is published openly, so you can generate a client and write the integration before the line exists.

What are the rate limits?

New conversations are capped at 50 opted-in / 30 cold per line per day, which is Apple's limit and applies to every provider. Replies inside an open thread are unlimited. Per-key request ceilings return 429 with a Retry-After header and are published in the docs.

Get an API key

Setup is done for you: a 15-minute call, then a dedicated line wired to your stack. The spec is published either way.

Book a demo