Status and conversations
Track a send with GET /v1/status/{message_id} and read full conversation history with GET /v1/conversations.
Message status
GET https://api.bluereacher.com/v1/status/{message_id}Looks the id up in the drip queue first (text sends), then in the messages table (voice memos and direct sends).
curl https://api.bluereacher.com/v1/status/d_1788116691413_milvzs \
-H "Authorization: Bearer brk_your_api_key"{
"success": true,
"message_id": "d_1788116691413_milvzs",
"type": "drip_queue",
"status": "sent",
"scheduled_for": "2026-08-31T09:14:51.413Z",
"sent_at": "2026-08-31T09:15:02.101Z",
"device_name": "Line 2",
"error": null
}| Field | Meaning |
|---|---|
type | drip_queue, message, or voice_memo |
status | Common values: pending, sent, failed. Additional lifecycle states may appear; treat unknown values as in-flight |
error | Human-readable failure reason when status is failed, else null |
Prefer webhooks over polling: message.sent fires at send confirmation and is usually the definitive event, because US SMS and many iMessage sends never produce a delivery receipt. message.delivered and message.read fire on the first receipt of each kind when the recipient produces one.
With a brk_test_ key, simulated ids progress on a timer: drip pending to sent after about 5 seconds, instant sent to delivered after about 10 seconds.
Conversation history
GET https://api.bluereacher.com/v1/conversationsRequires write permission. Chronological history, oldest first, with per-message delivery channel, tapback reactions and AI attribution. Pass exactly one of phone (1:1 thread) or group_chat_id (group thread).
| Query param | Default | Meaning |
|---|---|---|
phone | E.164 number for a 1:1 thread | |
group_chat_id | Group id from GET /v1/groups | |
limit | 50 | Max 200 |
before | ISO timestamp; return messages created before it | |
device_id | Filter to one line (1:1 only) |
curl "https://api.bluereacher.com/v1/conversations?phone=%2B16465550119" \
-H "Authorization: Bearer brk_your_api_key"{
"success": true,
"phone": "+16465550119",
"messages": [
{
"id": "m_311",
"direction": "outbound",
"message": "Hey Dana, saw you took over ops at Northline. Worth a quick chat?",
"type": "text",
"sent_at": "2026-08-30T14:02:11Z",
"device_name": "Line 2",
"status": "delivered",
"delivery_channel": "imessage",
"reactions": [],
"ai_generated": false
},
{
"id": "m_312",
"direction": "inbound",
"message": "Sure, Thursday works",
"type": "text",
"sent_at": "2026-08-30T14:41:53Z",
"device_name": "Line 2",
"status": "received",
"delivery_channel": "imessage",
"reactions": [
{ "emoji": "❤️", "from_contact": false, "delivered": true, "delivered_at": "2026-08-30T14:42:30Z", "created_at": "2026-08-30T14:42:29Z" }
],
"ai_generated": false
}
],
"has_more": false,
"next_cursor": null
}delivery_channel tells you what actually carried each message: imessage (blue bubble) or sms (green bubble). Paginate by passing the next_cursor value as before until has_more is false.
Group reads swap phone for group_chat_id, add a group summary object, and each message carries from, the sender's phone (null for your own outbound rows).

