Reference
Conversations
A conversation is what a person sees: one thread with one handle, or a group. Distinct from the message list, which is a log.
Every conversation on your project's numbers, most recent first.
unread is always 0 for a key. A key is not a person and has no place in a conversation it has read up to, so reporting every inbound message ever would have read as a backlog nobody has.
curl -X GET https://api.missblue.dev/v1/threads \
-H "Authorization: Bearer $MISS_BLUE_KEY"Response
{
"total": 2,
"data": [
{
"chat_id": "iMessage;-;+15555550100",
"handle": "+15555550100",
"is_group": false,
"last_text": "Perfect, see you then",
"last_at": "2026-08-23T09:12:04Z",
"last_direction": "inbound",
"message_count": 14,
"unread": 0,
"last_replied_by": "Sam Okafor"
}
]
}Tell the customer their message was seen.
The "Read" that appears under their message on their phone. Distinct from POST /v1/threads/{chat_id}/read, which records where a person has read to so their own unread count is right and which nobody outside this system sees. Nothing sends this automatically: it is a claim that a human looked, and a receipt that fired because a dashboard was open is a lie told at scale.
| chat_id* | string | The conversation to acknowledge. |
| read | boolean | Defaults to true. False marks it unread again. |
curl -X POST https://api.missblue.dev/v1/read-receipts \
-H "Authorization: Bearer $MISS_BLUE_KEY" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "iMessage;-;+15555550100",
"read": true
}'- 404No such conversation on a number your key holds.
- 503The Mac is offline. Nothing was acknowledged.
Show or hide the typing bubble in a conversation.
Do not block a reply on this. A bubble that arrives after the message it was meant to precede is worse than no bubble — send it, ignore the outcome, and reply. There is no guaranteed stop either: Messages.app clears it on its own after a few seconds of silence, which is the behaviour to rely on.
| chat_id* | string | The conversation. Not a bare handle — guessing which of several threads was meant would show a stranger that somebody is typing. |
| active | boolean | true to start, false to stop. |
curl -X POST https://api.missblue.dev/v1/typing \
-H "Authorization: Bearer $MISS_BLUE_KEY" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "iMessage;-;+15555550100",
"active": true
}'- 404No such conversation on a number your key holds.