Blue Reacher
Status and conversations14 / 50

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
}
FieldMeaning
typedrip_queue, message, or voice_memo
statusCommon values: pending, sent, failed. Additional lifecycle states may appear; treat unknown values as in-flight
errorHuman-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/conversations

Requires 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 paramDefaultMeaning
phoneE.164 number for a 1:1 thread
group_chat_idGroup id from GET /v1/groups
limit50Max 200
beforeISO timestamp; return messages created before it
device_idFilter 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).

On this page