REST API reference
Conversations
Start conversations, reply, add notes, assign, tag, snooze and close — exactly like a teammate.
Every change goes through the same services as the inbox: teammates see it live, event parts are written, Blaze and workflows react, and webhooks fire. Reads need conversations:read; actions need conversations:write.
Actions accept an optional teammateId to say who did them. Replying as a teammate and adding notes require one — the reply is delivered through the conversation’s channel (Messenger or email) under that teammate’s name.
The conversation object
Lists return this object; the detail adds parts and partsNextCursor.
Fields
-
objectstring - Always
conversation. -
idstring - Unique id (UUID).
-
numberinteger - Per-workspace number shown in the inbox (#1042).
-
stateenum open,snoozedorclosed.-
channelenum messenger,email,apiorworkflow.-
subjectstring | null - Email subject.
-
titlestring | null - Title set by teammates, AI or a ticket.
-
isPriorityboolean - Marked as priority.
-
contactobject - The customer:
{ id, name, email, role }. -
companyIdstring | null - Company the conversation is about.
-
assigneeobject | null - Assigned teammate
{ id, name }. -
teamobject | null - Assigned team
{ id, name }. -
tagsarray - Tags as
{ id, name }. -
customAttributesobject - Conversation data attributes by key.
-
waitingSincetimestamp | null - Since when the customer waits for a reply.
-
snoozedUntiltimestamp | null - When a snoozed conversation reopens.
-
closedAttimestamp | null - Last time it was closed.
-
lastMessageAttimestamp - Latest message.
-
firstContactMessageAttimestamp | null - Customer’s first message.
-
firstTeammateReplyAttimestamp | null - First reply from your team.
-
aiAgentStateenum | null - Blaze AI Agent involvement:
active,handed_off,resolvedorconfirmed_resolved. -
ratingobject | null - CSAT:
{ rating (1–5), remark, ratedAt }. -
slaobject | null { status: active | met | breached | paused, dueAt }.-
ticketobject | null - Set for tickets:
{ ticketTypeId, ticketTypeName, category, state }. -
messageCountinteger - Customer-visible messages.
-
createdAttimestamp - Started.
-
updatedAttimestamp - Last change.
{ "object": "conversation", "id": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "number": 1042, "state": "open", "channel": "messenger", "subject": null, "title": "Invoice shows the wrong VAT number", "isPriority": false, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "customAttributes": { "invoice_number": "INV-4412" }, "waitingSince": null, "snoozedUntil": null, "closedAt": null, "lastMessageAt": "2026-10-02T14:11:08.000Z", "firstContactMessageAt": "2026-10-02T14:05:31.000Z", "firstTeammateReplyAt": "2026-10-02T14:11:08.000Z", "aiAgentState": "handed_off", "rating": null, "sla": { "status": "met", "dueAt": null }, "ticket": null, "messageCount": 4, "createdAt": "2026-10-02T14:05:31.000Z", "updatedAt": "2026-10-02T14:11:08.000Z"} The conversation part object
A message, an internal note or an event in a conversation’s timeline.
Fields
-
objectstring - Always
conversation_part. -
idstring - Unique id.
-
conversationIdstring - The conversation.
-
typeenum comment(a message the customer sees),note(internal) orevent(assignment, state, tag…).-
channelenum - Channel the part was sent through.
-
authorobject { type: contact | user | ai_agent | workflow | system, id, name }.-
bodyHtmlstring | null - Sanitized HTML (null for events).
-
bodyTextstring | null - Plain text of the body.
-
attachmentsarray { id, name, size, contentType, url }. URLs are signed and valid for at least 7 days.-
eventobject | null - For
eventparts:assigned,state_changed,priority_changed,tag_added,tag_removed,ticket_created,ticket_state_changed,ai_handoff,rated… with who did it inby. -
createdAttimestamp - Sent.
{ "object": "conversation_part", "id": "0199c520-9a21-7c32-8d43-5e54f6a7b8c9", "conversationId": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "type": "comment", "channel": "messenger", "author": { "type": "user", "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "bodyHtml": "<p>Thanks Lena — I’ve updated the VAT number and reissued invoice <strong>INV-4412</strong>.</p>", "bodyText": "Thanks Lena — I’ve updated the VAT number and reissued invoice INV-4412.", "attachments": [], "event": null, "createdAt": "2026-10-02T14:11:08.000Z"} List conversations
/v1 /conversations conversations:read Newest first (order=created) or most recently changed first (order=updated, handy for syncing). Spam and merged conversations are left out.
Query parameters
-
stateenum open,snoozed,closedorall(default).-
assigneeIdstring - A teammate id, or
unassigned. -
teamIdstring - A team id, or
none. -
contactIdstring - Conversations with this person.
-
tagIdstring - Conversations with this tag.
-
channelenum messenger,email,apiorworkflow.-
isTicketboolean truefor tickets only,falseto leave them out.-
createdAftertimestamp - ISO-8601 lower bound on
createdAt. -
updatedAftertimestamp - ISO-8601 lower bound on
updatedAt. -
orderenum created(default) orupdated.-
limitinteger - Items per page, 1–100. Default
25. -
cursorstring - The
nextCursorof the previous page.
curl https://api.rabbitblaze.com/v1/conversations?state=open&teamId=0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e&order=updated \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/conversations?state=open&teamId=0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e&order=updated", { headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.get( "https://api.rabbitblaze.com/v1/conversations", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, params={ "state": "open", "teamId": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "order": "updated", },)res.raise_for_status()data = res.json() { "items": [ { "object": "conversation", "id": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "number": 1042, "state": "open", "channel": "messenger", "subject": null, "title": "Invoice shows the wrong VAT number", "isPriority": false, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "customAttributes": { "invoice_number": "INV-4412" }, "waitingSince": null, "snoozedUntil": null, "closedAt": null, "lastMessageAt": "2026-10-02T14:11:08.000Z", "firstContactMessageAt": "2026-10-02T14:05:31.000Z", "firstTeammateReplyAt": "2026-10-02T14:11:08.000Z", "aiAgentState": "handed_off", "rating": null, "sla": { "status": "met", "dueAt": null }, "ticket": null, "messageCount": 4, "createdAt": "2026-10-02T14:05:31.000Z", "updatedAt": "2026-10-02T14:11:08.000Z" } ], "nextCursor": "WyIyMDI2LTEwLTAyVDE0OjA1OjMxLjAwMFoiLCIwMTk5YzUyMC03ZThmIl0"} Retrieve a conversation
/v1 /conversations/{id} conversations:read The conversation with its first 100 parts (oldest first). Fetch the rest with list parts and partsNextCursor, or pass parts=false for the conversation alone.
Path parameters
-
idstring required - The conversation id.
Query parameters
-
partsboolean - Include parts. Default
true.
curl https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", { headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.get( "https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},)res.raise_for_status()data = res.json() { "object": "conversation", "id": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "number": 1042, "state": "open", "channel": "messenger", "subject": null, "title": "Invoice shows the wrong VAT number", "isPriority": false, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "customAttributes": { "invoice_number": "INV-4412" }, "waitingSince": null, "snoozedUntil": null, "closedAt": null, "lastMessageAt": "2026-10-02T14:11:08.000Z", "firstContactMessageAt": "2026-10-02T14:05:31.000Z", "firstTeammateReplyAt": "2026-10-02T14:11:08.000Z", "aiAgentState": "handed_off", "rating": null, "sla": { "status": "met", "dueAt": null }, "ticket": null, "messageCount": 4, "createdAt": "2026-10-02T14:05:31.000Z", "updatedAt": "2026-10-02T14:11:08.000Z", "parts": [ { "object": "conversation_part", "id": "0199c520-7f10-7b21-9c32-4d43e5f6a7b8", "conversationId": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "type": "comment", "channel": "messenger", "author": { "type": "contact", "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer" }, "bodyHtml": "<p>Hi! Our October invoice shows our old VAT number. Can you reissue it?</p>", "bodyText": "Hi! Our October invoice shows our old VAT number. Can you reissue it?", "attachments": [], "event": null, "createdAt": "2026-10-02T14:05:31.000Z" }, { "object": "conversation_part", "id": "0199c520-9c43-7e54-8f65-7a76b8c9d0e1", "conversationId": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "type": "event", "channel": "messenger", "author": { "type": "user", "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "bodyHtml": null, "bodyText": null, "attachments": [], "event": { "type": "assigned", "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "by": { "type": "user", "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" } }, "createdAt": "2026-10-02T14:10:52.000Z" }, { "object": "conversation_part", "id": "0199c520-9a21-7c32-8d43-5e54f6a7b8c9", "conversationId": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "type": "comment", "channel": "messenger", "author": { "type": "user", "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "bodyHtml": "<p>Thanks Lena — I’ve updated the VAT number and reissued invoice <strong>INV-4412</strong>.</p>", "bodyText": "Thanks Lena — I’ve updated the VAT number and reissued invoice INV-4412.", "attachments": [], "event": null, "createdAt": "2026-10-02T14:11:08.000Z" }, { "object": "conversation_part", "id": "0199c520-9b32-7d43-9e54-6f65a7b8c9d0", "conversationId": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "type": "note", "channel": "messenger", "author": { "type": "user", "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "bodyHtml": "<p>Checked in Stripe: VAT id updated on the customer record.</p>", "bodyText": "Checked in Stripe: VAT id updated on the customer record.", "attachments": [], "event": null, "createdAt": "2026-10-02T14:11:08.000Z" } ], "partsNextCursor": null} List conversation parts
/v1 /conversations/{id}/parts conversations:read The timeline, oldest first: messages, notes and events.
Path parameters
-
idstring required - The conversation id.
Query parameters
-
limitinteger - Items per page, 1–100. Default
50. -
cursorstring - The
nextCursorof the previous page.
curl https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/parts?limit=2 \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/parts?limit=2", { headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.get( "https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/parts", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, params={ "limit": "2", },)res.raise_for_status()data = res.json() { "items": [ { "object": "conversation_part", "id": "0199c520-7f10-7b21-9c32-4d43e5f6a7b8", "conversationId": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "type": "comment", "channel": "messenger", "author": { "type": "contact", "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer" }, "bodyHtml": "<p>Hi! Our October invoice shows our old VAT number. Can you reissue it?</p>", "bodyText": "Hi! Our October invoice shows our old VAT number. Can you reissue it?", "attachments": [], "event": null, "createdAt": "2026-10-02T14:05:31.000Z" }, { "object": "conversation_part", "id": "0199c520-9c43-7e54-8f65-7a76b8c9d0e1", "conversationId": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "type": "event", "channel": "messenger", "author": { "type": "user", "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "bodyHtml": null, "bodyText": null, "attachments": [], "event": { "type": "assigned", "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "by": { "type": "user", "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" } }, "createdAt": "2026-10-02T14:10:52.000Z" } ], "nextCursor": "WyIyMDI2LTEwLTAyVDE0OjA1OjMxLjAwMFoiLCIwMTk5YzUyMC03ZThmIl0"} Create a conversation
/v1 /conversations conversations:write Starts a conversation with a person — as if they wrote in (default, e.g. from your own contact form), or from a teammate (from: "teammate"), which assigns it to that teammate and delivers the message by Messenger or email.
Body
-
contactIdstring - The person, by id. Send exactly one of
contactId,externalIdoremail. -
externalIdstring - The person, by your user id.
-
emailstring - The person, by email.
-
bodystring - Plain text. Blank lines start paragraphs. Send
bodyorbodyHtml. -
bodyHtmlstring - HTML, sanitized like a teammate’s reply (links, lists, formatting; no scripts or styles).
-
fromenum contact(default) orteammate.-
teammateIdstring - Required with
from: "teammate". -
channelenum messenger(default) oremail. Email needs an address on the person.-
subjectstring - Email subject — required for teammate emails.
Blocked people answer 409 conflict. Teammates with the viewer role can’t send messages (400).
curl -X POST https://api.rabbitblaze.com/v1/conversations \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Idempotency-Key: 6f1c2d4e-0a7b-4c1d-9e2f-3a4b5c6d7e8f" \ -H "Content-Type: application/json" \ -d '{ "externalId": "usr_48213", "body": "Hi! Our October invoice shows our old VAT number. Can you reissue it?"}' const res = await fetch("https://api.rabbitblaze.com/v1/conversations", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Idempotency-Key": "6f1c2d4e-0a7b-4c1d-9e2f-3a4b5c6d7e8f", "Content-Type": "application/json", }, body: JSON.stringify({ externalId: "usr_48213", body: "Hi! Our October invoice shows our old VAT number. Can you reissue it?", }),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/conversations", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}", "Idempotency-Key": "6f1c2d4e-0a7b-4c1d-9e2f-3a4b5c6d7e8f"}, json={ "externalId": "usr_48213", "body": "Hi! Our October invoice shows our old VAT number. Can you reissue it?", },)res.raise_for_status()data = res.json() { "object": "conversation", "id": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "number": 1042, "state": "open", "channel": "messenger", "subject": null, "title": null, "isPriority": false, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "assignee": null, "team": null, "tags": [], "customAttributes": {}, "waitingSince": "2026-10-02T14:05:31.000Z", "snoozedUntil": null, "closedAt": null, "lastMessageAt": "2026-10-02T14:05:31.000Z", "firstContactMessageAt": "2026-10-02T14:05:31.000Z", "firstTeammateReplyAt": null, "aiAgentState": null, "rating": null, "sla": null, "ticket": null, "messageCount": 1, "createdAt": "2026-10-02T14:05:31.000Z", "updatedAt": "2026-10-02T14:05:31.000Z"} Reply to a conversation
/v1 /conversations/{id}/reply conversations:write Adds a message. As a teammate (default) it goes to the customer through the conversation’s channel; as: "contact" records a message from the customer (for example one you received elsewhere). Returns the new part.
Path parameters
-
idstring required - The conversation id.
Body
-
bodystring - Plain text. Blank lines start paragraphs. Send
bodyorbodyHtml. -
bodyHtmlstring - HTML, sanitized like a teammate’s reply (links, lists, formatting; no scripts or styles).
-
asenum teammate(default) orcontact.-
teammateIdstring - Required when replying as a teammate.
curl -X POST https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/reply \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "teammateId": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "bodyHtml": "<p>Thanks Lena — I’ve updated the VAT number and reissued invoice <strong>INV-4412</strong>.</p>"}' const res = await fetch("https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/reply", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ teammateId: "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", bodyHtml: "<p>Thanks Lena — I’ve updated the VAT number and reissued invoice <strong>INV-4412</strong>.</p>", }),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/reply", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "teammateId": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "bodyHtml": "<p>Thanks Lena — I’ve updated the VAT number and reissued invoice <strong>INV-4412</strong>.</p>", },)res.raise_for_status()data = res.json() { "object": "conversation_part", "id": "0199c520-9a21-7c32-8d43-5e54f6a7b8c9", "conversationId": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "type": "comment", "channel": "messenger", "author": { "type": "user", "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "bodyHtml": "<p>Thanks Lena — I’ve updated the VAT number and reissued invoice <strong>INV-4412</strong>.</p>", "bodyText": "Thanks Lena — I’ve updated the VAT number and reissued invoice INV-4412.", "attachments": [], "event": null, "createdAt": "2026-10-02T14:11:08.000Z"} Add a note
/v1 /conversations/{id}/notes conversations:write An internal note only teammates see. Returns the new part.
Path parameters
-
idstring required - The conversation id.
Body
-
bodystring - Plain text. Blank lines start paragraphs. Send
bodyorbodyHtml. -
bodyHtmlstring - HTML, sanitized like a teammate’s reply (links, lists, formatting; no scripts or styles).
-
teammateIdstring required - Who wrote it.
curl -X POST https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/notes \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "teammateId": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "body": "Checked in Stripe: VAT id updated on the customer record."}' const res = await fetch("https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/notes", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ teammateId: "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", body: "Checked in Stripe: VAT id updated on the customer record.", }),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/notes", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "teammateId": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "body": "Checked in Stripe: VAT id updated on the customer record.", },)res.raise_for_status()data = res.json() { "object": "conversation_part", "id": "0199c520-9b32-7d43-9e54-6f65a7b8c9d0", "conversationId": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "type": "note", "channel": "messenger", "author": { "type": "user", "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "bodyHtml": "<p>Checked in Stripe: VAT id updated on the customer record.</p>", "bodyText": "Checked in Stripe: VAT id updated on the customer record.", "attachments": [], "event": null, "createdAt": "2026-10-02T14:11:08.000Z"} Assign a conversation
/v1 /conversations/{id}/assign conversations:write Sets the teammate and/or team. null unassigns. Send at least one of them.
Path parameters
-
idstring required - The conversation id.
Body
-
assigneeIdstring | null - A teammate id, or
null. -
teamIdstring | null - A team id, or
null. -
teammateIdstring - Attribute the action to this teammate (event parts, reports). Without it the action is shown as made by Rabbitblaze.
curl -X POST https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/assign \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "assigneeId": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "teamId": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e"}' const res = await fetch("https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/assign", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ assigneeId: "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", teamId: "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", }),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/assign", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "assigneeId": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "teamId": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", },)res.raise_for_status()data = res.json() { "object": "conversation", "id": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "number": 1042, "state": "open", "channel": "messenger", "subject": null, "title": "Invoice shows the wrong VAT number", "isPriority": false, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "customAttributes": { "invoice_number": "INV-4412" }, "waitingSince": null, "snoozedUntil": null, "closedAt": null, "lastMessageAt": "2026-10-02T14:11:08.000Z", "firstContactMessageAt": "2026-10-02T14:05:31.000Z", "firstTeammateReplyAt": "2026-10-02T14:11:08.000Z", "aiAgentState": "handed_off", "rating": null, "sla": { "status": "met", "dueAt": null }, "ticket": null, "messageCount": 4, "createdAt": "2026-10-02T14:05:31.000Z", "updatedAt": "2026-10-02T14:11:08.000Z"} Close a conversation
/v1 /conversations/{id}/close conversations:write Closes it (fires conversation.closed). When you close as a teammate (teammateId), conversation attributes marked “required to close” must be filled in first — otherwise 422 unprocessable lists the missing keys in fields.
Path parameters
-
idstring required - The conversation id.
Body
-
teammateIdstring - Attribute the action to this teammate (event parts, reports). Without it the action is shown as made by Rabbitblaze.
curl -X POST https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/close \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "teammateId": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d"}' const res = await fetch("https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/close", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ teammateId: "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", }),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/close", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "teammateId": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", },)res.raise_for_status()data = res.json() { "object": "conversation", "id": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "number": 1042, "state": "closed", "channel": "messenger", "subject": null, "title": "Invoice shows the wrong VAT number", "isPriority": false, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "customAttributes": { "invoice_number": "INV-4412" }, "waitingSince": null, "snoozedUntil": null, "closedAt": "2026-10-02T14:20:00.000Z", "lastMessageAt": "2026-10-02T14:11:08.000Z", "firstContactMessageAt": "2026-10-02T14:05:31.000Z", "firstTeammateReplyAt": "2026-10-02T14:11:08.000Z", "aiAgentState": "handed_off", "rating": null, "sla": { "status": "met", "dueAt": null }, "ticket": null, "messageCount": 4, "createdAt": "2026-10-02T14:05:31.000Z", "updatedAt": "2026-10-02T14:11:08.000Z"} Reopen a conversation
/v1 /conversations/{id}/open conversations:write Reopens a closed or snoozed conversation.
Path parameters
-
idstring required - The conversation id.
Body
-
teammateIdstring - Attribute the action to this teammate (event parts, reports). Without it the action is shown as made by Rabbitblaze.
curl -X POST https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/open \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{}' const res = await fetch("https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/open", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({}),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/open", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={},)res.raise_for_status()data = res.json() { "object": "conversation", "id": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "number": 1042, "state": "open", "channel": "messenger", "subject": null, "title": "Invoice shows the wrong VAT number", "isPriority": false, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "customAttributes": { "invoice_number": "INV-4412" }, "waitingSince": null, "snoozedUntil": null, "closedAt": null, "lastMessageAt": "2026-10-02T14:11:08.000Z", "firstContactMessageAt": "2026-10-02T14:05:31.000Z", "firstTeammateReplyAt": "2026-10-02T14:11:08.000Z", "aiAgentState": "handed_off", "rating": null, "sla": { "status": "met", "dueAt": null }, "ticket": null, "messageCount": 4, "createdAt": "2026-10-02T14:05:31.000Z", "updatedAt": "2026-10-02T14:11:08.000Z"} Snooze a conversation
/v1 /conversations/{id}/snooze conversations:write Snoozes until a time in the future (at least 30 seconds ahead). It reopens by itself then, or earlier when the customer writes.
Path parameters
-
idstring required - The conversation id.
Body
-
untiltimestamp required - ISO-8601 with a timezone.
-
teammateIdstring - Attribute the action to this teammate (event parts, reports). Without it the action is shown as made by Rabbitblaze.
curl -X POST https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/snooze \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "until": "2026-10-05T08:00:00+02:00"}' const res = await fetch("https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/snooze", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ until: "2026-10-05T08:00:00+02:00", }),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/snooze", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "until": "2026-10-05T08:00:00+02:00", },)res.raise_for_status()data = res.json() { "object": "conversation", "id": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "number": 1042, "state": "snoozed", "channel": "messenger", "subject": null, "title": "Invoice shows the wrong VAT number", "isPriority": false, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "customAttributes": { "invoice_number": "INV-4412" }, "waitingSince": null, "snoozedUntil": "2026-10-05T06:00:00.000Z", "closedAt": null, "lastMessageAt": "2026-10-02T14:11:08.000Z", "firstContactMessageAt": "2026-10-02T14:05:31.000Z", "firstTeammateReplyAt": "2026-10-02T14:11:08.000Z", "aiAgentState": "handed_off", "rating": null, "sla": { "status": "met", "dueAt": null }, "ticket": null, "messageCount": 4, "createdAt": "2026-10-02T14:05:31.000Z", "updatedAt": "2026-10-02T14:11:08.000Z"} Tag a conversation
/v1 /conversations/{id}/tags conversations:write Adds a tag. Remove one with DELETE /conversations/{id}/tags/{tagId} (optional ?teammateId=).
Path parameters
-
idstring required - The conversation id.
Body
-
tagIdstring required - A tag id.
-
teammateIdstring - Attribute the action to this teammate (event parts, reports). Without it the action is shown as made by Rabbitblaze.
curl -X POST https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/tags \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "tagId": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c"}' const res = await fetch("https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/tags", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ tagId: "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", }),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d/tags", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "tagId": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", },)res.raise_for_status()data = res.json() { "object": "conversation", "id": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "number": 1042, "state": "open", "channel": "messenger", "subject": null, "title": "Invoice shows the wrong VAT number", "isPriority": false, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "customAttributes": { "invoice_number": "INV-4412" }, "waitingSince": null, "snoozedUntil": null, "closedAt": null, "lastMessageAt": "2026-10-02T14:11:08.000Z", "firstContactMessageAt": "2026-10-02T14:05:31.000Z", "firstTeammateReplyAt": "2026-10-02T14:11:08.000Z", "aiAgentState": "handed_off", "rating": null, "sla": { "status": "met", "dueAt": null }, "ticket": null, "messageCount": 4, "createdAt": "2026-10-02T14:05:31.000Z", "updatedAt": "2026-10-02T14:11:08.000Z"} Update a conversation
/v1 /conversations/{id} conversations:write Mark or unmark as priority and set conversation data attributes (values are checked against each attribute’s type).
Path parameters
-
idstring required - The conversation id.
Body
-
isPriorityboolean - Priority flag.
-
customAttributesobject - Values by conversation attribute key.
-
teammateIdstring - Attribute the action to this teammate (event parts, reports). Without it the action is shown as made by Rabbitblaze.
curl -X PATCH https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "isPriority": true, "customAttributes": { "invoice_number": "INV-4412" }}' const res = await fetch("https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", { method: "PATCH", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ isPriority: true, customAttributes: { invoice_number: "INV-4412", }, }),})const data = await res.json() import osimport requests res = requests.patch( "https://api.rabbitblaze.com/v1/conversations/0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "isPriority": True, "customAttributes": { "invoice_number": "INV-4412", }, },)res.raise_for_status()data = res.json() { "object": "conversation", "id": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "number": 1042, "state": "open", "channel": "messenger", "subject": null, "title": "Invoice shows the wrong VAT number", "isPriority": true, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "customAttributes": { "invoice_number": "INV-4412" }, "waitingSince": null, "snoozedUntil": null, "closedAt": null, "lastMessageAt": "2026-10-02T14:11:08.000Z", "firstContactMessageAt": "2026-10-02T14:05:31.000Z", "firstTeammateReplyAt": "2026-10-02T14:11:08.000Z", "aiAgentState": "handed_off", "rating": null, "sla": { "status": "met", "dueAt": null }, "ticket": null, "messageCount": 4, "createdAt": "2026-10-02T14:05:31.000Z", "updatedAt": "2026-10-02T14:11:08.000Z"}