bundled-skills/sendblue/sendblue-api/SKILL.md
Send and receive iMessage, SMS, and RCS from application code via the Sendblue HTTP API — text, media, group messages, send styles, reactions, typing indicators, status callbacks, and inbound webhooks.
npx skillsauth add FrancoStino/opencode-skills-antigravity sendblue-apiInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Sendblue is a REST API that sends iMessage (blue bubbles), SMS, and RCS from a provisioned phone number. Everything is plain JSON over HTTPS — no SDK is required. The API covers outbound 1:1 and group sends, iMessage effects, reactions, typing indicators, status callbacks, and inbound webhooks.
https://api.sendblue.com
Every request needs two headers:
sb-api-key-id: <YOUR_API_KEY_ID>
sb-api-secret-key: <YOUR_API_SECRET>
Content-Type: application/json
Keep both values server-side — never ship them to a browser or mobile client.
curl -X POST https://api.sendblue.com/api/send-message \
-H "sb-api-key-id: $KEY_ID" \
-H "sb-api-secret-key: $SECRET" \
-H 'Content-Type: application/json' \
-d '{
"number": "+15551234567",
"from_number": "+1YOUR_SENDBLUE_NUMBER",
"content": "Hello from the API!"
}'
Phone numbers must be E.164. from_number must be a line you own — list yours with GET /api/lines.
The synchronous response includes a message_handle (Apple GUID — persist this; you need it for reactions and replies) and a status from REGISTERED, PENDING, QUEUED, ACCEPTED, SENT, DELIVERED, DECLINED, ERROR. Only DELIVERED means it landed. Use status_callback instead of polling /api/status.
Configure webhook URLs in the dashboard or via POST /api/account/webhooks. Sendblue POSTs JSON to your endpoint. Respond with 2xx promptly — non-2xx triggers retries and duplicate deliveries. Event types: receive, outbound, typing_indicator, call_log, line_blocked, line_assigned, contact_created.
| Method | Path | Purpose |
|--------|------|---------|
| POST | /api/send-message | Send a 1:1 message (text and/or media) |
| POST | /api/send-group-message | Send to multiple recipients |
| POST | /api/create-group | Create a named group thread |
| POST | /api/send-reaction | Send a tapback (love/like/dislike/laugh/emphasize/question) |
| POST | /api/send-typing-indicator | Show "typing…" in the recipient's thread |
| POST | /api/mark-read | Send a read receipt |
| POST | /api/upload-file / /api/upload-media-object | Upload media (direct or from URL) |
| GET | /api/status | Poll a message's delivery status |
| GET | /api/evaluate-service | Check whether a number is on iMessage |
| GET | /api/v2/messages / /api/v2/messages/:id | Read message history |
| GET / POST / PUT / DELETE | /api/v2/contacts[...] | Manage contacts |
| GET | /api/lines | List your Sendblue phone numbers |
| POST | /api/account/webhooks | CRUD webhook subscriptions |
POST /api/send-message
{
"number": "+15551234567",
"from_number": "+1YOUR_SENDBLUE_NUMBER",
"content": "Optional text",
"media_url": "https://example.com/img.jpg",
"send_style": "celebration",
"status_callback": "https://yourapp.com/sendblue/status"
}
content and/or media_url is required. send_style is iMessage-only — valid values: celebration, shooting_star, fireworks, lasers, love, confetti, balloons, spotlight, echo, invisible, gentle, loud, slam. Ignored on SMS. Text up to 18,996 chars; media up to 100 MB on iMessage, 5 MB on SMS.
POST /api/send-group-message
{
"numbers": ["+15551234567", "+15557654321"],
"from_number": "+1YOUR_SENDBLUE_NUMBER",
"content": "Hey team"
}
The response returns a group_id — persist it to send follow-ups into the same thread instead of creating a new one each time.
POST /api/send-reaction
{
"from_number": "+1YOUR_SENDBLUE_NUMBER",
"message_handle": "<message_handle from prior send>",
"reaction": "love"
}
Reactions only work on iMessage and need the original message's message_handle. Valid values: love, like, dislike, laugh, emphasize, question.
receive){
"accountEmail": "[email protected]",
"content": "Reply text",
"media_url": "https://...",
"is_outbound": false,
"number": "+15551234567",
"from_number": "+1YOUR_SENDBLUE_NUMBER",
"service": "iMessage",
"group_id": "...",
"date_sent": "2024-01-01T12:00:00Z"
}
Status callback payloads (outbound) mirror the send-message response and update as the message moves through SENT → DELIVERED (or ERROR).
message_handle on every send. You need it for reactions, replies, and correlating status callbacks.status_callback over polling. It's lower-cost and more accurate than GET /api/status./api/evaluate-service before relying on iMessage-only features for a recipient.sb-api-key-id / sb-api-secret-key to a client. They are server-side credentials./api/send-message as delivery. It only means "accepted".status_callback or GET /api/status.send_style silently no-ops on SMS (green-bubble recipients).sb-api-key-id and sb-api-secret-key server-side. They are not safe in browser, mobile, or CI logs.message_handle may arrive more than once.5551234567 or (555) 123-4567 will fail — always send +15551234567.from_number must be one of your lines. A spoofed or unprovisioned number returns an error.send_style silently no-ops on SMS. If the recipient is green-bubble, effects don't render — check service first with /api/evaluate-service if it matters.message_handle. You need it for reactions, replies, and correlating status callbacks back to your records./api/send-message means accepted, not delivered. Use status_callback rather than blocking on the synchronous response.@sendblue-cli — Shell wrapper for shell-context outbound (scripts, cron, agent hooks). Use it when you don't need a full HTTP integration.@sendblue-notify — Patterns and copy rules for outbound "text me when X is done" notifications layered on top of the API or CLI./api/send-carousel), FaceTime/contact-card sharing, advanced webhook filtering, contacts API beyond basic CRUD — see the docs site.data-ai
Snapshot a site's SEO state and detect ranking, indexation, metadata, canonical, robots, schema, and on-page regressions over time.
development
Coordinate focused subagents on substantial work, keep their ownership non-overlapping, and integrate verified results. Use for large-scope Codex tasks; keep trivial work with the coordinator.
data-ai
Use when an owner asks to find a cofounder or project partner. Assess only that agent's own owner and rank only approved profiles other agents posted for their own owners.
devops
Install, configure, verify, repair, update, and uninstall Hyprland on Fedora Linux with GPU-aware detection (NVIDIA/AMD/Intel).