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 /messages | Send a text or media message |
| POST /voice-memos | Deliver audio as a native voice memo |
| GET /status/{message_id} | Delivery status of a queued item |
Conversations
| GET /conversations | Conversation history for a number or group |
| GET /groups | List group chats |
Lines
| GET /devices | List sending lines with live capacity |
Signals
| POST /reactions | Send a native iMessage tapback |
| DELETE /reactions | Take back a tapback |
| POST /typing | Show or clear the native typing bubble |
| POST /read | Clear unread state, optionally with a native read receipt |
Contacts
| GET /contacts | Search and list contacts |
| POST /contacts | Create a contact (upsert by phone) |
| PATCH /contacts/{contact_id} | Update a contact, including opt-out |
| GET /opt-out | Read a contact's opt-out state |
| POST /opt-out | Opt a contact out, or back in with explicit confirmation |
| GET /bot | Read whether the AI assistant will reply to a contact |
| POST /bot | Pause, hand off, or autopilot the AI assistant for one contact |
Utility
| POST /capability | iMessage vs SMS capability for phone numbers |
| GET /usage | Usage by key and endpoint |
Webhooks
Subscribe an HTTPS endpoint and events arrive signed with an HMAC header, retried with backoff for 24 hours.
- message.receivedAn inbound reply landed on one of your lines.
- message.status_changedQueued, sending, sent, delivered, read or failed.
- contact.opted_outA STOP was detected and the contact was suppressed.
- campaign.completedEvery message in a campaign reached a terminal state.
{
"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