REST API reference
Tickets
Create tickets, convert conversations, move them through states and read ticket types.
A ticket is a conversation with a ticket type, a state and ticket attributes, so its id works with every conversation endpoint for replies, notes, assignment and tags. Reads need tickets:read; changes need tickets:write.
State changes on customer tickets are shown to the customer in the Messenger’s Tickets space and fire ticket.state.updated.
The ticket object
Returned by every ticket endpoint.
Fields
-
objectstring - Always
ticket. -
idstring - The ticket’s conversation id — reply, note, assign and tag with the conversation endpoints.
-
numberinteger - Per-workspace number.
-
titlestring | null - Ticket title.
-
stateenum submitted,in_progress,waiting_on_customerorresolved.-
categoryenum customer,back_officeortracker.-
ticketTypeobject | null { id, name }.-
contactobject { id, name, email, role }.-
assigneeobject | null { id, name }.-
teamobject | null { id, name }.-
attributesobject - Values by ticket attribute key, including the built-in
_default_titleand_default_description. -
conversationStateenum - State of the underlying conversation.
-
createdAttimestamp - When it became a ticket.
-
updatedAttimestamp - Last change.
{ "object": "ticket", "id": "0199c521-4c5d-7e6f-9a7b-8c9d0e1f2a3b", "number": 1043, "title": "Refund the duplicate charge", "state": "in_progress", "category": "customer", "ticketType": { "id": "0199a8f4-6a7b-7c8d-8e9f-0a1b2c3d4e5f", "name": "Billing question" }, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "attributes": { "_default_title": "Refund the duplicate charge", "_default_description": "We were charged twice for October.", "invoice_number": "INV-4412" }, "conversationState": "open", "createdAt": "2026-10-02T15:31:12.000Z", "updatedAt": "2026-10-02T15:48:40.000Z"} The ticket type object
Configured under Settings → Ticket types.
Fields
-
objectstring - Always
ticket_type. -
idstring - Unique id.
-
namestring - Name shown to teammates (and customers for customer tickets).
-
emojistring | null - Icon.
-
descriptionstring | null - What the type is for.
-
categoryenum customer(shared with the customer),back_office(internal work) ortracker(one issue, many conversations).-
customerCanCreateboolean - Customers can submit it from the Messenger.
-
attributesarray { key, label, type, description, options, requiredForTeammates, requiredForCustomers, visibleToCustomer }.-
archivedboolean - Archived types can’t be used for new tickets.
-
createdAttimestamp - Created.
{ "object": "ticket_type", "id": "0199a8f4-6a7b-7c8d-8e9f-0a1b2c3d4e5f", "name": "Billing question", "emoji": "🧾", "description": "Refunds, invoices and payment problems.", "category": "customer", "customerCanCreate": true, "attributes": [ { "key": "_default_title", "label": "Title", "type": "string", "description": null, "options": null, "requiredForTeammates": true, "requiredForCustomers": true, "visibleToCustomer": true }, { "key": "_default_description", "label": "Description", "type": "multiline", "description": null, "options": null, "requiredForTeammates": false, "requiredForCustomers": false, "visibleToCustomer": true }, { "key": "invoice_number", "label": "Invoice number", "type": "string", "description": "As printed on the invoice, e.g. INV-4412.", "options": null, "requiredForTeammates": false, "requiredForCustomers": true, "visibleToCustomer": true } ], "archived": false, "createdAt": "2025-03-01T09:00:00.000Z"} List tickets
/v1 /tickets tickets:read Tickets, newest first.
Query parameters
-
stateenum submitted,in_progress,waiting_on_customer,resolved,unresolved(anything but resolved) orall(default).-
ticketTypeIdstring - One ticket type.
-
categoryenum customer,back_officeortracker.-
contactIdstring - Tickets of this person.
-
assigneeIdstring - A teammate id, or
unassigned. -
limitinteger - Items per page, 1–100. Default
25. -
cursorstring - The
nextCursorof the previous page.
curl https://api.rabbitblaze.com/v1/tickets?state=unresolved&category=customer \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/tickets?state=unresolved&category=customer", { headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.get( "https://api.rabbitblaze.com/v1/tickets", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, params={ "state": "unresolved", "category": "customer", },)res.raise_for_status()data = res.json() { "items": [ { "object": "ticket", "id": "0199c521-4c5d-7e6f-9a7b-8c9d0e1f2a3b", "number": 1043, "title": "Refund the duplicate charge", "state": "in_progress", "category": "customer", "ticketType": { "id": "0199a8f4-6a7b-7c8d-8e9f-0a1b2c3d4e5f", "name": "Billing question" }, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "attributes": { "_default_title": "Refund the duplicate charge", "_default_description": "We were charged twice for October.", "invoice_number": "INV-4412" }, "conversationState": "open", "createdAt": "2026-10-02T15:31:12.000Z", "updatedAt": "2026-10-02T15:48:40.000Z" } ], "nextCursor": "WyIyMDI2LTEwLTAyVDE0OjA1OjMxLjAwMFoiLCIwMTk5YzUyMC03ZThmIl0"} Retrieve a ticket
/v1 /tickets/{id} tickets:read One ticket by id (its conversation id). A conversation that isn’t a ticket answers 404.
Path parameters
-
idstring required - The ticket id.
curl https://api.rabbitblaze.com/v1/tickets/0199c521-4c5d-7e6f-9a7b-8c9d0e1f2a3b \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/tickets/0199c521-4c5d-7e6f-9a7b-8c9d0e1f2a3b", { headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.get( "https://api.rabbitblaze.com/v1/tickets/0199c521-4c5d-7e6f-9a7b-8c9d0e1f2a3b", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},)res.raise_for_status()data = res.json() { "object": "ticket", "id": "0199c521-4c5d-7e6f-9a7b-8c9d0e1f2a3b", "number": 1043, "title": "Refund the duplicate charge", "state": "in_progress", "category": "customer", "ticketType": { "id": "0199a8f4-6a7b-7c8d-8e9f-0a1b2c3d4e5f", "name": "Billing question" }, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "attributes": { "_default_title": "Refund the duplicate charge", "_default_description": "We were charged twice for October.", "invoice_number": "INV-4412" }, "conversationState": "open", "createdAt": "2026-10-02T15:31:12.000Z", "updatedAt": "2026-10-02T15:48:40.000Z"} Create a ticket
/v1 /tickets tickets:write Either opens a new ticket for a person (any category), or converts an existing conversation with conversationId (customer ticket types only; a conversation that’s already a ticket answers 409).
Body
-
ticketTypeIdstring required - A ticket type id.
-
conversationIdstring - Convert this conversation instead of creating one.
-
contactIdstring - The customer, by id. With
externalIdandemail: send exactly one. -
externalIdstring - The customer, by your user id.
-
emailstring - The customer, by email.
-
titlestring - Up to 255 characters (stored as
_default_title). -
descriptionstring - Up to 10,000 characters (stored as
_default_description). -
attributesobject - Ticket attribute values by key.
-
stateenum - Initial state. Default
submitted. -
teammateIdstring - Who created it (event parts); default Rabbitblaze.
curl -X POST https://api.rabbitblaze.com/v1/tickets \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ticketTypeId": "0199a8f4-6a7b-7c8d-8e9f-0a1b2c3d4e5f", "email": "[email protected]", "title": "Refund the duplicate charge", "description": "We were charged twice for October.", "attributes": { "invoice_number": "INV-4412" }}' const res = await fetch("https://api.rabbitblaze.com/v1/tickets", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ ticketTypeId: "0199a8f4-6a7b-7c8d-8e9f-0a1b2c3d4e5f", email: "[email protected]", title: "Refund the duplicate charge", description: "We were charged twice for October.", attributes: { invoice_number: "INV-4412", }, }),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/tickets", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "ticketTypeId": "0199a8f4-6a7b-7c8d-8e9f-0a1b2c3d4e5f", "email": "[email protected]", "title": "Refund the duplicate charge", "description": "We were charged twice for October.", "attributes": { "invoice_number": "INV-4412", }, },)res.raise_for_status()data = res.json() { "object": "ticket", "id": "0199c521-4c5d-7e6f-9a7b-8c9d0e1f2a3b", "number": 1043, "title": "Refund the duplicate charge", "state": "submitted", "category": "customer", "ticketType": { "id": "0199a8f4-6a7b-7c8d-8e9f-0a1b2c3d4e5f", "name": "Billing question" }, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "assignee": null, "team": null, "attributes": { "_default_title": "Refund the duplicate charge", "_default_description": "We were charged twice for October.", "invoice_number": "INV-4412" }, "conversationState": "open", "createdAt": "2026-10-02T15:31:12.000Z", "updatedAt": "2026-10-02T15:48:40.000Z"} Update a ticket
/v1 /tickets/{id} tickets:write Change the state, the title or attribute values. Send at least one of them.
Path parameters
-
idstring required - The ticket id.
Body
-
stateenum submitted,in_progress,waiting_on_customerorresolved.-
titlestring - New title.
-
attributesobject - Values to set, checked against the ticket type’s attributes (others are kept).
-
teammateIdstring - Who made the change.
curl -X PATCH https://api.rabbitblaze.com/v1/tickets/0199c521-4c5d-7e6f-9a7b-8c9d0e1f2a3b \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "state": "in_progress", "teammateId": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d"}' const res = await fetch("https://api.rabbitblaze.com/v1/tickets/0199c521-4c5d-7e6f-9a7b-8c9d0e1f2a3b", { method: "PATCH", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ state: "in_progress", teammateId: "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", }),})const data = await res.json() import osimport requests res = requests.patch( "https://api.rabbitblaze.com/v1/tickets/0199c521-4c5d-7e6f-9a7b-8c9d0e1f2a3b", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "state": "in_progress", "teammateId": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", },)res.raise_for_status()data = res.json() { "object": "ticket", "id": "0199c521-4c5d-7e6f-9a7b-8c9d0e1f2a3b", "number": 1043, "title": "Refund the duplicate charge", "state": "in_progress", "category": "customer", "ticketType": { "id": "0199a8f4-6a7b-7c8d-8e9f-0a1b2c3d4e5f", "name": "Billing question" }, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "attributes": { "_default_title": "Refund the duplicate charge", "_default_description": "We were charged twice for October.", "invoice_number": "INV-4412" }, "conversationState": "open", "createdAt": "2026-10-02T15:31:12.000Z", "updatedAt": "2026-10-02T15:48:40.000Z"} List ticket types
/v1 /ticket-types tickets:read Every ticket type with its attributes. Archived types are left out unless includeArchived=true. Not paginated.
Query parameters
-
includeArchivedboolean - Include archived types.
curl https://api.rabbitblaze.com/v1/ticket-types \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/ticket-types", { headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.get( "https://api.rabbitblaze.com/v1/ticket-types", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},)res.raise_for_status()data = res.json() { "items": [ { "object": "ticket_type", "id": "0199a8f4-6a7b-7c8d-8e9f-0a1b2c3d4e5f", "name": "Billing question", "emoji": "🧾", "description": "Refunds, invoices and payment problems.", "category": "customer", "customerCanCreate": true, "attributes": [ { "key": "_default_title", "label": "Title", "type": "string", "description": null, "options": null, "requiredForTeammates": true, "requiredForCustomers": true, "visibleToCustomer": true }, { "key": "_default_description", "label": "Description", "type": "multiline", "description": null, "options": null, "requiredForTeammates": false, "requiredForCustomers": false, "visibleToCustomer": true }, { "key": "invoice_number", "label": "Invoice number", "type": "string", "description": "As printed on the invoice, e.g. INV-4412.", "options": null, "requiredForTeammates": false, "requiredForCustomers": true, "visibleToCustomer": true } ], "archived": false, "createdAt": "2025-03-01T09:00:00.000Z" } ], "nextCursor": null} Retrieve a ticket type
/v1 /ticket-types/{id} tickets:read One ticket type by id.
Path parameters
-
idstring required - The ticket type id.
curl https://api.rabbitblaze.com/v1/ticket-types/0199a8f4-6a7b-7c8d-8e9f-0a1b2c3d4e5f \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/ticket-types/0199a8f4-6a7b-7c8d-8e9f-0a1b2c3d4e5f", { headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.get( "https://api.rabbitblaze.com/v1/ticket-types/0199a8f4-6a7b-7c8d-8e9f-0a1b2c3d4e5f", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},)res.raise_for_status()data = res.json() { "object": "ticket_type", "id": "0199a8f4-6a7b-7c8d-8e9f-0a1b2c3d4e5f", "name": "Billing question", "emoji": "🧾", "description": "Refunds, invoices and payment problems.", "category": "customer", "customerCanCreate": true, "attributes": [ { "key": "_default_title", "label": "Title", "type": "string", "description": null, "options": null, "requiredForTeammates": true, "requiredForCustomers": true, "visibleToCustomer": true }, { "key": "_default_description", "label": "Description", "type": "multiline", "description": null, "options": null, "requiredForTeammates": false, "requiredForCustomers": false, "visibleToCustomer": true }, { "key": "invoice_number", "label": "Invoice number", "type": "string", "description": "As printed on the invoice, e.g. INV-4412.", "options": null, "requiredForTeammates": false, "requiredForCustomers": true, "visibleToCustomer": true } ], "archived": false, "createdAt": "2025-03-01T09:00:00.000Z"}