Linq: iMessage, RCS, and SMS from one Partner API logoLinq: iMessage, RCS, and SMS from one Partner API
You want a blue bubble in Messages, not another SMS gateway. Linq is REST for that. Token from a Linq rep. V3, not V2.
devrels.xyz/a/263You want to text people in Messages, not ship them another app. Linq is a REST API for iMessage, RCS, and SMS. It is not a Solana program. You get a bearer token from a Linq rep, one or more numbers, and you send.
Docs: docs.linqapp.com. Product: linqapp.com. Treat access as provisioned. There is a sandbox. There is not a public key on npm.
Use V3
New work goes to https://api.linqapp.com/api/partner/v3 with Authorization: Bearer …. V2 is a different world: X-LINQ-INTEGRATION-TOKEN and /api/partner/v2. If you copy an old snippet and wonder why 401, that is why.
V3 is the one with delivery receipts, trace_id, explicit protocol, effects, custom emoji reactions, and message.failed / message.delivered webhooks. Stay on V2 only long enough to migrate.
First message
POST /v3/messages. Recipients and parts. Leave from off. Linq picks a sending line, reuses a chat when those people are already in one, and rotates new numbers into the pool without a code change.
export LINQ_API_KEY="…" # from Linq, never commit
curl -sS -X POST https://api.linqapp.com/api/partner/v3/messages \
-H "Authorization: Bearer $LINQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": ["+14155559876"],
"message": {
"parts": [{ "type": "text", "value": "Hi from the Partner API." }]
}
}'Numbers are E.164. The response tells you from, chat_id, whether it opened a new chat, and (later)service. On the first response service can be null. For iMessage and RCS, delivery is confirmed on the message.delivered webhook. SMS does not get that receipt. Log the X-Trace-ID header on every call.
POST /v3/chats with an explicit from still works when you must pin a line. Prefer /messages without from if you want Linq to load-balance.
Protocols
Default chain is iMessage, then RCS, then SMS. Set preferred_service on the message only when you mean it.iMessage with no fallback fails if the person is not on iMessage. Do not pin iMessage for a mixed Android book.
| Need | iMessage | RCS | SMS |
|---|---|---|---|
| Text | Yes | Yes | Yes |
| Images / video | Yes | Yes | MMS |
| Read / delivery receipts | Yes | Yes | No |
| Typing | Yes | No | No |
| Reactions | Yes | Yes | No |
| Effects (confetti, slam, ink) | Yes | No | No |
| Thread replies | Yes | No | No |
Groups, rich media up to 100MB, voice memos, and tapbacks live in the same API. They will not show up on a pure SMS fallback. Read service before you tell a user you sent confetti.
SDKs
Official clients: npm i @linqapp/sdk, pip install linq-python, go get github.com/linq-team/linq-go. CLI: npm i -g @linqapp/cli then linq login --token …. There is also a coding-agent plugin (linq-team/linq-ai). Useful after the token works. Still know the HTTP so you can see what the agent called.
Webhooks
Subscribe an HTTPS URL. Failed deliveries retry (docs: up to 10 times over about 25 minutes). Deduplicate on the event id. Verify webhook-id, webhook-timestamp, webhook-signature (Standard Webhooks). Legacy X-Webhook-* headers still ship. Secrets look like whsec_…. An unverified endpoint is a forged inbound iMessage.
People and links
| What | Where |
|---|---|
| Docs | docs.linqapp.com |
| Quickstart | getting-started/quickstart |
| V2 to V3 | migration guide |
| GitHub | github.com/linq-team |
| X | @thelinqapp |
Keep reading
Fund a task. Agents compete. You pay the receipt you accept. Five modes. 7.5% platform fee. Production API api.taskmarket.dev on Base 8453.
One key, chainid per chain. MCP for live data. Docs MCP needs no key. CLI: brew install etherscan/etherscan-cli/etherscan.
Give an agent live web context with POST https://api.exa.ai/search, or point MCP at mcp.exa.ai/mcp.
Get new articles in your inbox
Technical deep-dives on Solana tooling, infrastructure, and ecosystem. No noise.
