Conversations API
List CRM conversations for the unified inbox and load a per-contact message timeline — api.misar.io/reach.
Conversations power MisarReach's unified inbox. Each conversation is a per-lead, per-channel thread with a last-message snippet; the full message timeline for a contact is loaded separately. Both endpoints require the deals:read scope and are scoped to the authenticated user.
Base URL: https://api.misar.io/reach — pass Authorization: Bearer msr_your_key_here on every request.
List conversations
/api/conversationsReturns the caller's conversations for the inbox list, most-recently-active first. Powers the left-hand conversation list on the inbox.
Query parameters
statusstringquerydefault: allFilter by thread status: "active" | "closed" | "snoozed" | "all".
channelstringqueryFilter by channel: "email" | "whatsapp" | "sms" | "linkedin". Omit for all channels.
qstringqueryCase-insensitive search over lead_name and lead_email (max 100 characters).
limitnumberquerydefault: 100Maximum conversations to return (1–200).
Response fields
conversations[].idstringConversation UUID.
conversations[].channelstringChannel of the thread: email | whatsapp | sms | linkedin.
conversations[].lead_namestringLead's display name. May be null.
conversations[].lead_emailstringLead's email — the key used to load the timeline (see below).
conversations[].last_messagestringSnippet of the most recent message in the thread.
conversations[].last_message_atstringISO timestamp of the last message. Threads are ordered by this, newest first.
conversations[].intentstringDetected conversation intent, when classified. May be null.
conversations[].statusstringThread status: active | closed | snoozed.
curl "https://api.misar.io/reach/api/conversations?status=active&channel=email&limit=50" \
-H "Authorization: Bearer msr_your_key_here"{
"conversations": [
{
"id": "c1a2…",
"channel": "email",
"lead_name": "Priya Sharma",
"lead_email": "priya@example.com",
"last_message": "Sounds good — can we do Thursday?",
"last_message_at": "2026-07-12T15:04:00Z",
"intent": "meeting_request",
"status": "active",
"created_at": "2026-07-10T09:00:00Z"
}
]
}Get a conversation timeline
/api/conversations/:emailReturns every conversation the caller has with a given contact (matched by lead_email), each expanded with its full ordered message timeline. Threads are newest-active first; messages within a thread are oldest-first. Returns an empty array when there is no conversation with that address.
Path parameters
emailstringpathrequiredThe contact's email address (URL-encode it). Matches lead_email on the caller's conversations.
Response fields
conversations[].messages[].senderstringWho sent the message (e.g. the lead vs. the account holder).
conversations[].messages[].messagestringMessage body.
conversations[].messages[].channelstringChannel the individual message was sent on.
conversations[].messages[].created_atstringISO timestamp; messages are returned in ascending order.
curl "https://api.misar.io/reach/api/conversations/priya%40example.com" \
-H "Authorization: Bearer msr_your_key_here"{
"conversations": [
{
"id": "c1a2…",
"channel": "email",
"lead_name": "Priya Sharma",
"lead_email": "priya@example.com",
"last_message": "Sounds good — can we do Thursday?",
"last_message_at": "2026-07-12T15:04:00Z",
"intent": "meeting_request",
"created_at": "2026-07-10T09:00:00Z",
"messages": [
{ "id": "m1", "conversation_id": "c1a2…", "sender": "agent", "message": "Hi Priya, …", "channel": "email", "created_at": "2026-07-10T09:00:00Z" },
{ "id": "m2", "conversation_id": "c1a2…", "sender": "lead", "message": "Sounds good — can we do Thursday?", "channel": "email", "created_at": "2026-07-12T15:04:00Z" }
]
}
]
}{ "conversations": [] }Status codes
200— conversations (or timeline) returned. An unknown email is not an error — it returns{ "conversations": [] }.500— failed to load conversations.