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

object string
Always ticket.
id string
The ticket’s conversation id — reply, note, assign and tag with the conversation endpoints.
number integer
Per-workspace number.
title string | null
Ticket title.
state enum
submitted, in_progress, waiting_on_customer or resolved.
category enum
customer, back_office or tracker.
ticketType object | null
{ id, name }.
contact object
{ id, name, email, role }.
assignee object | null
{ id, name }.
team object | null
{ id, name }.
attributes object
Values by ticket attribute key, including the built-in _default_title and _default_description.
conversationState enum
State of the underlying conversation.
createdAt timestamp
When it became a ticket.
updatedAt timestamp
Last change.
Example ticket
{  "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

object string
Always ticket_type.
id string
Unique id.
name string
Name shown to teammates (and customers for customer tickets).
emoji string | null
Icon.
description string | null
What the type is for.
category enum
customer (shared with the customer), back_office (internal work) or tracker (one issue, many conversations).
customerCanCreate boolean
Customers can submit it from the Messenger.
attributes array
{ key, label, type, description, options, requiredForTeammates, requiredForCustomers, visibleToCustomer }.
archived boolean
Archived types can’t be used for new tickets.
createdAt timestamp
Created.
Example ticket_type
{  "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

GET /v1 /tickets tickets:read

Tickets, newest first.

Query parameters

state enum
submitted, in_progress, waiting_on_customer, resolved, unresolved (anything but resolved) or all (default).
ticketTypeId string
One ticket type.
category enum
customer, back_office or tracker.
contactId string
Tickets of this person.
assigneeId string
A teammate id, or unassigned.
limit integer
Items per page, 1–100. Default 25.
cursor string
The nextCursor of 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()
Response · 200 OK
{  "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

GET /v1 /tickets/{id} tickets:read

One ticket by id (its conversation id). A conversation that isn’t a ticket answers 404.

Path parameters

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

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

ticketTypeId string required
A ticket type id.
conversationId string
Convert this conversation instead of creating one.
contactId string
The customer, by id. With externalId and email: send exactly one.
externalId string
The customer, by your user id.
email string
The customer, by email.
title string
Up to 255 characters (stored as _default_title).
description string
Up to 10,000 characters (stored as _default_description).
attributes object
Ticket attribute values by key.
state enum
Initial state. Default submitted.
teammateId string
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()
Response · 201 Created
{  "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

PATCH /v1 /tickets/{id} tickets:write

Change the state, the title or attribute values. Send at least one of them.

Path parameters

id string required
The ticket id.

Body

state enum
submitted, in_progress, waiting_on_customer or resolved.
title string
New title.
attributes object
Values to set, checked against the ticket type’s attributes (others are kept).
teammateId string
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()
Response · 200 OK
{  "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

GET /v1 /ticket-types tickets:read

Every ticket type with its attributes. Archived types are left out unless includeArchived=true. Not paginated.

Query parameters

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

GET /v1 /ticket-types/{id} tickets:read

One ticket type by id.

Path parameters

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