Linq’s iMessage Apps Bring Payments, Tickets, Flights, and Games to the iMessage Bubble with the imessage_app component

Linq developers can now build iMessage apps. These are small interactive apps that run within an iMessages conversation.
A user can shop, play a game, book a flight, or pay. None of it needs to leave the iMessage thread. No external browser deep linking. There is no ‘tap here to exit the app.’
Previously, the main option for the agent API was to send a link. The user then followed it elsewhere. iMessage Apps removes that hand.
The TL;DR
- The new Linq
imessage_appThe segment offers portable, interactive cards directly within the iMessage thread. - One card handles a full workflow: games, payments, tickets, flights, music, and dating.
- Cards are updated locally with
/messages/{id}/updateso changes of state redraw the same bubble. - An
interactiveflag converts the live action to only static captionslayoutcard. - Only iMessage doesn’t have SMS/RCS fallback, and the rich offer requires your app to be installed.
iMessage apps
The iMessage App is a tap card that unlocks interactive experiences in the environment. The card becomes your app inside the bubble.
Technically, it’s a new message part with type: "imessage_app". This replaces the text, mediaagain link parts you already use. The embedded messages extension pulls rich content from a url he provides.
Linq is the first messaging infrastructure behind the API. Its platform allows AI agents to send messages to users via iMessage, RCS, and SMS.
How It Works
A few details determine whether your first card works properly.
The application ID is the key to issue: I app thing carries team_id again bundle_id. Those fields tell Messages which extension is issuing the card. team_id 10-character application identifier. You usually pass ownership of your application.
There is one common failure mode here. Anonymous identities are silently interpreted as plain text. If team_id again bundle_id is not the same as the installed extension, the card returns to your caption. No error was thrown.
You control the captions; the app controls the image: I layout the object holds the text drawn on the card. There is no photo field. An image, icon, and interactive UI appear in your extension.
layout field |
Position |
|---|---|
caption |
top left, main label in bold |
subcaption |
left, below caption |
trailing_caption |
top right |
trailing_subcaption |
right, below trailing_caption |
At least one field must be set. Otherwise the card acts as an empty bubble. Messages handle i url as opaque, so change the file url it changes what the card shows.
An interactive live vs. static flag controls. It goes without saying true. With trueRecipients with your app see the live card. Set it to false always showing static layout instead of a card.
Put the condition and the flag together and determine the result. Three outcomes are possible:
- It has your application,
interactive: true→ the extension offers a rich card from yoursurl. - It has your application,
interactive: false→ receiver sees staticlayoutcard. - No app → recipient sees yours
layouta summary. Set upapp_store_idto add a Get the app to pay.
Implementation: Sending and Updating the Card
Send a card via Create a Chator send it to an existing chat no Send a message.
curl -X POST
-H "Authorization: Bearer $LINQ_API_KEY"
-H "Content-Type: application/json"
-d '{
"from": "+12052535597",
"to": ["+12052532136"],
"message": {
"parts": [
{
"type": "imessage_app",
"app": {
"name": "Example App",
"team_id": "A1B2C3D4E5",
"bundle_id": "com.example.app.MessageExtension"
},
"url": "
"fallback_text": "Open in Example App",
"layout": {
"caption": "Example App",
"subcaption": "You said: hello"
}
}
]
}
}'
The reviews are an interesting classic. The delivered card can be replaced by referring to the original message. This is how the game move redraws the board.
curl -X POST
-H "Authorization: Bearer $LINQ_API_KEY"
-H "Content-Type: application/json"
-d '{
"url": "
"fallback_text": "Score update",
"layout": { "caption": "Score: 2 - 1" }
}'
A few rules govern reviews. Only url, fallback_text, interactiveagain layout he can change. Application ownership remains intact for the life of the card. The card must already be so delivered.
You can only update the imessage_app the card you sent. Incoming cards cannot be updated, and the call returns 400. A 409 means the card has not arrived yet. Try again after message.delivered webhook.
Each update is delivered as a new message with its own ID. I interactive The flag is not inherited, so resubmit it each time. To update again, refer to the new message ID.
You can also get cards. Incoming messages include i imessage_app part in message.received webhook.
What You Can Build
Linq does this as examples, not a static menu. Try each one yourself in the interactive demo below (created by Marktechpost).
- Games: Send a move and redraw the board. A live game becomes a sequence of updates in a single bubble.
- Payments: Send a checkout or request payment as a card. The recipient completes it without redirecting.
- Tickets: The card can go from “Travel / Non-Travel” to an existing confirmed ticket.
- Flight booking: Check the fare, allow the user to select a seat, and update the card into a boarding pass.
- Music. Put a track on and let people play it in line. The card is the player, not the link.
- Dating: Let users swipe profiles and check matches where they are already talking.



