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

object string
Always conversation.
id string
Unique id (UUID).
number integer
Per-workspace number shown in the inbox (#1042).
state enum
open, snoozed or closed.
channel enum
messenger, email, api or workflow.
subject string | null
Email subject.
title string | null
Title set by teammates, AI or a ticket.
isPriority boolean
Marked as priority.
contact object
The customer: { id, name, email, role }.
companyId string | null
Company the conversation is about.
assignee object | null
Assigned teammate { id, name }.
team object | null
Assigned team { id, name }.
tags array
Tags as { id, name }.
customAttributes object
Conversation data attributes by key.
waitingSince timestamp | null
Since when the customer waits for a reply.
snoozedUntil timestamp | null
When a snoozed conversation reopens.
closedAt timestamp | null
Last time it was closed.
lastMessageAt timestamp
Latest message.
firstContactMessageAt timestamp | null
Customer’s first message.
firstTeammateReplyAt timestamp | null
First reply from your team.
aiAgentState enum | null
Blaze AI Agent involvement: active, handed_off, resolved or confirmed_resolved.
rating object | null
CSAT: { rating (1–5), remark, ratedAt }.
sla object | null
{ status: active | met | breached | paused, dueAt }.
ticket object | null
Set for tickets: { ticketTypeId, ticketTypeName, category, state }.
messageCount integer
Customer-visible messages.
createdAt timestamp
Started.
updatedAt timestamp
Last change.
Example conversation
{  "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

object string
Always conversation_part.
id string
Unique id.
conversationId string
The conversation.
type enum
comment (a message the customer sees), note (internal) or event (assignment, state, tag…).
channel enum
Channel the part was sent through.
author object
{ type: contact | user | ai_agent | workflow | system, id, name }.
bodyHtml string | null
Sanitized HTML (null for events).
bodyText string | null
Plain text of the body.
attachments array
{ id, name, size, contentType, url }. URLs are signed and valid for at least 7 days.
event object | null
For event parts: assigned, state_changed, priority_changed, tag_added, tag_removed, ticket_created, ticket_state_changed, ai_handoff, rated… with who did it in by.
createdAt timestamp
Sent.
Example conversation_part
{  "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

GET /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

state enum
open, snoozed, closed or all (default).
assigneeId string
A teammate id, or unassigned.
teamId string
A team id, or none.
contactId string
Conversations with this person.
tagId string
Conversations with this tag.
channel enum
messenger, email, api or workflow.
isTicket boolean
true for tickets only, false to leave them out.
createdAfter timestamp
ISO-8601 lower bound on createdAt.
updatedAfter timestamp
ISO-8601 lower bound on updatedAt.
order enum
created (default) or updated.
limit integer
Items per page, 1–100. Default 25.
cursor string
The nextCursor of 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()
Response · 200 OK
{  "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

GET /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

id string required
The conversation id.

Query parameters

parts boolean
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()
Response · 200 OK
{  "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

GET /v1 /conversations/{id}/parts conversations:read

The timeline, oldest first: messages, notes and events.

Path parameters

id string required
The conversation id.

Query parameters

limit integer
Items per page, 1–100. Default 50.
cursor string
The nextCursor of 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()
Response · 200 OK
{  "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

POST /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

contactId string
The person, by id. Send exactly one of contactId, externalId or email.
externalId string
The person, by your user id.
email string
The person, by email.
body string
Plain text. Blank lines start paragraphs. Send body or bodyHtml.
bodyHtml string
HTML, sanitized like a teammate’s reply (links, lists, formatting; no scripts or styles).
from enum
contact (default) or teammate.
teammateId string
Required with from: "teammate".
channel enum
messenger (default) or email. Email needs an address on the person.
subject string
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()
Response · 201 Created
{  "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

POST /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

id string required
The conversation id.

Body

body string
Plain text. Blank lines start paragraphs. Send body or bodyHtml.
bodyHtml string
HTML, sanitized like a teammate’s reply (links, lists, formatting; no scripts or styles).
as enum
teammate (default) or contact.
teammateId string
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()
Response · 201 Created
{  "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

POST /v1 /conversations/{id}/notes conversations:write

An internal note only teammates see. Returns the new part.

Path parameters

id string required
The conversation id.

Body

body string
Plain text. Blank lines start paragraphs. Send body or bodyHtml.
bodyHtml string
HTML, sanitized like a teammate’s reply (links, lists, formatting; no scripts or styles).
teammateId string 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()
Response · 201 Created
{  "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

POST /v1 /conversations/{id}/assign conversations:write

Sets the teammate and/or team. null unassigns. Send at least one of them.

Path parameters

id string required
The conversation id.

Body

assigneeId string | null
A teammate id, or null.
teamId string | null
A team id, or null.
teammateId string
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()
Response · 200 OK
{  "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

POST /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

id string required
The conversation id.

Body

teammateId string
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()
Response · 200 OK
{  "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

POST /v1 /conversations/{id}/open conversations:write

Reopens a closed or snoozed conversation.

Path parameters

id string required
The conversation id.

Body

teammateId string
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()
Response · 200 OK
{  "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

POST /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

id string required
The conversation id.

Body

until timestamp required
ISO-8601 with a timezone.
teammateId string
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()
Response · 200 OK
{  "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

POST /v1 /conversations/{id}/tags conversations:write

Adds a tag. Remove one with DELETE /conversations/{id}/tags/{tagId} (optional ?teammateId=).

Path parameters

id string required
The conversation id.

Body

tagId string required
A tag id.
teammateId string
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()
Response · 200 OK
{  "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

PATCH /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

id string required
The conversation id.

Body

isPriority boolean
Priority flag.
customAttributes object
Values by conversation attribute key.
teammateId string
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()
Response · 200 OK
{  "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"}