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.development
Fetch YouTube transcripts, search videos, browse channels, and extract playlists via TranscriptAPI — no yt-dlp, no Google API key, works from any cloud server.
development
Passive income portfolio analysis — activate when user asks about dividend yields, Treasury rates, REIT income, monthly passive income goals, or portfolio yield optimization. Scans 4 asset classes, ranks by risk-adjusted return, and builds allocations targeting a specific monthly income.
devops
End-to-end production QA, build verification, and launch-readiness checklist for fullstack Next.js apps. Covers TypeScript, linting, tests, build, SEO tags, route regression, and sitemap validation.
development
Safe production cleanup and hardening for vibe-coded fullstack apps (Next.js, React, Node.js, etc.). Removes dead imports, unused files, and broken references without breaking routes or APIs.