← Articles
Linq: iMessage, RCS, and SMS from one Partner API logo
linq

Linq: iMessage, RCS, and SMS from one Partner API

· AUG 26, 2026 ·Updated AUG 28, 2026
Read
Share

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/263

You 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.

bash
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.

What each protocol actually does
NeediMessageRCSSMS
TextYesYesYes
Images / videoYesYesMMS
Read / delivery receiptsYesYesNo
TypingYesNoNo
ReactionsYesYesNo
Effects (confetti, slam, ink)YesNoNo
Thread repliesYesNoNo

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

Keep reading

Get new articles in your inbox

Technical deep-dives on Solana tooling, infrastructure, and ecosystem. No noise.