Linq builders can now construct iMessage Apps. These are interactive mini-apps that run inside a iMessages dialog.
A person can store, play a recreation, e book a flight, or pay. None of it requires leaving the iMessage thread. There is no such thing as a deep hyperlink to an exterior browser. There is no such thing as a ‘faucet right here to complete within the app.’
Beforehand, an agent’s predominant API possibility was to ship a hyperlink. The person then needed to comply with it some place else. iMessage Apps take away that handoff.
TL;DR
- Linq’s new
imessage_apphalf renders tappable, interactive playing cards straight inside an iMessage thread. - One card handles full workflows: video games, funds, tickets, flights, music, and courting.
- Playing cards replace in place through
/messages/{id}/replace, so state modifications redraw the identical bubble. - An
interactiveflag toggles the stay expertise versus a static caption-onlyformatcard. - It’s iMessage-only with no SMS/RCS fallback, and wealthy rendering wants your app put in.
iMessage Apps
An iMessage App is a tappable card that opens an interactive expertise in place. The cardboard turns into your app contained in the bubble.
Technically, it’s a new message half with sort: "imessage_app". This replaces the textual content, media, and hyperlink components you already use. An put in Messages extension attracts the wealthy content material from a url you present.
Linq is the messaging-infrastructure startup behind the API. Its platform lets AI brokers message customers over iMessage, RCS, and SMS.
How It Works
A couple of particulars determine whether or not your first card renders accurately.
The app id is the rendering key: The app object carries team_id and bundle_id. These fields inform Messages which extension renders the cardboard. team_id is the app’s 10-character uppercase identifier. You normally move your personal app’s id.
There may be one frequent failure mode right here. An unrecognized id silently renders as plain textual content. If team_id and bundle_id don’t match an put in extension, the cardboard falls again to your caption. No error is thrown.
You management captions; the app controls the picture: The format object holds the textual content drawn on the cardboard. There is no such thing as a picture subject. The picture, icon, and interactive UI come out of your extension.
format subject |
Place |
|---|---|
caption |
top-left, daring main label |
subcaption |
left, under caption |
trailing_caption |
top-right |
trailing_subcaption |
proper, under trailing_caption |
A minimum of one subject should be set. In any other case the cardboard renders as an empty bubble. Messages treats the url as opaque, so altering the url modifications what the cardboard exhibits.
An interactive flag controls stay versus static. It defaults to true. With true, recipients who’ve your app see the stay card. Set it to false to all the time present the static format card as a substitute.
Set up state and the flag collectively determine the outcome. Three outcomes are potential:
- Has your app,
interactive: true→ the extension renders the wealthy card out of yoururl. - Has your app,
interactive: false→ the recipient sees the staticformatcard. - No app → the recipient sees your
formatcaptions. Setapp_store_idso as to add a Get the app affordance.
Implementation: Sending and Updating a Card
Ship a card with Create Chat, or submit it into an present chat with Ship Message.
curl -X POST https://api.linqapp.com/api/companion/v3/chats
-H "Authorization: Bearer $LINQ_API_KEY"
-H "Content material-Sort: software/json"
-d '{
"from": "+12052535597",
"to": ["+12052532136"],
"message": {
"components": [
{
"type": "imessage_app",
"app": {
"name": "Example App",
"team_id": "A1B2C3D4E5",
"bundle_id": "com.example.app.MessageExtension"
},
"url": "https://app.example.com/card?id=abc123",
"fallback_text": "Open in Example App",
"layout": {
"caption": "Example App",
"subcaption": "You said: hello"
}
}
]
}
}'
Updates are the fascinating primitive. A delivered card might be changed in place by referencing the unique message. That is how a recreation transfer redraws a board.
curl -X POST https://api.linqapp.com/api/companion/v3/messages/{messageId}/replace
-H "Authorization: Bearer $LINQ_API_KEY"
-H "Content material-Sort: software/json"
-d '{
"url": "https://app.instance.com/card?recreation=7f3a&transfer=2",
"fallback_text": "Rating replace",
"format": { "caption": "Rating: 2 - 1" }
}'
A couple of guidelines govern updates. Solely url, fallback_text, interactive, and format can change. The app id stays mounted for the cardboard’s life. The cardboard should already be delivered.
You’ll be able to replace solely an imessage_app card you despatched. Inbound playing cards can’t be up to date, and the decision returns 400. A 409 means the cardboard is just not delivered but. Retry after the message.delivered webhook.
Every replace is delivered as a brand new message with its personal ID. The interactive flag is just not inherited, so resend it every time. To replace once more, reference the brand new message ID.
You can even obtain playing cards. Inbound messages embody an imessage_app half within the message.obtained webhook.
What You Can Construct
Linq frames these as examples, not a set menu. Strive every one your self within the interactive demo under (created by Marktechpost).
- Video games: Ship a transfer and redraw the board. A stay match turns into a sequence of updates to at least one bubble.
- Funds: Ship a checkout or request-to-pay as a card. The recipient completes it and not using a redirect.
- Tickets: A card can transfer from “Going / Not going” to a confirmed ticket in place.
- Flight reserving: Floor a fare, let the person decide a seat, then replace the cardboard to a boarding move.
- Music. Drop a monitor and let individuals play it inline. The cardboard is a participant, not a hyperlink.
- Relationship: Let customers swipe profiles and discover matches the place they already discuss.
