BluetickedDeveloper docs

Tickets

5 endpoints, each with examples that open in the console prefilled.

All resources
GET/api/v1/ticketstickets:readTry in console

List tickets

Sync the work queue: every ticket raised by flows, the team, or the API.

  • Newest first. Page with ?limit= (max 200, default 50) and ?cursor= (the previous page's next_cursor).
  • The opaque cursor includes an id tie-breaker so tickets created at the same instant are not skipped. Pass it back unchanged. Legacy timestamp cursors remain accepted.
  • Filter with ?status= (open | in_progress | resolved), ?priority= (low | normal | high | urgent), ?category=, and ?assigned_to= (a workspace user id, or unassigned).
  • number is the human reference quoted to customers, unique per workspace, not globally.
  • team_id is the workspace team the ticket is routed to (null when none). sla_breached_at is stamped once the ticket outlives the workspace's resolution target (the queue's Overdue chip) and stays null otherwise.
curl -X GET "https://app.blueticked.com/api/v1/tickets" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "data": [
    {
      "category": "Refund request",
      "title": "Order 552 arrived damaged",
      "priority": "high",
      "assigned_to": null,
      "team_id": null,
      "contact_id": "ff506e53-e2f0-4d92-884a-dab77d628bad",
      "conversation_id": "fa3efd47-67b2-428c-b75f-17d1dd2e9790",
      "business_id": "22222222-2222-4222-9222-222222222222",
      "resolved_at": null,
      "sla_breached_at": null,
      "fields": {},
      "created_at": "2026-08-31T09:00:00.000Z",
      "updated_at": "2026-08-31T09:00:00.000Z",
      "id": "89e7776f-f68e-4d24-98de-849d4d296925",
      "number": 12,
      "status": "open"
    }
  ],
  "next_cursor": null,
  "has_more": false,
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
POST/api/v1/ticketstickets:writeTry in console

Raise a ticket

Raise a ticket from your own system: an order problem, a form, an internal tool.

Body parameters
categorystring
titlestring
prioritystring
notestring
contact_idstring
business_idstring
  • Only category is required. Every ticket belongs to a business: conversation_id pins the ticket to a thread and inherits its contact and business; contact_id links a contact without a thread and inherits the contact's business; otherwise pass business_id (a key restricted to exactly one business inherits that one). A ticket that would land without a business is refused with validation_failed, because business-less tickets are visible to workspace admins only.
  • conversation_id, contact_id and business_id must belong to your workspace (404 not_found otherwise; deleted contacts count as missing). A business_id that contradicts the thread's or contact's business is refused; omit it to inherit theirs. A contact_id that is not the conversation's contact is refused with validation_failed; omit it when you pass conversation_id.
  • Fans out a ticket.created webhook and an in-app notification, exactly like a flow-raised ticket.
curl -X POST "https://app.blueticked.com/api/v1/tickets" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "category": "Refund request",
  "title": "Order 552 arrived damaged",
  "priority": "high",
  "note": "Customer sent photos. Refund pre-approved by Sam.",
  "contact_id": "ff506e53-e2f0-4d92-884a-dab77d628bad",
  "business_id": "22222222-2222-4222-9222-222222222222"
}'
Response
{
  "ticket": {
    "category": "Refund request",
    "title": "Order 552 arrived damaged",
    "priority": "high",
    "assigned_to": null,
    "team_id": null,
    "contact_id": "ff506e53-e2f0-4d92-884a-dab77d628bad",
    "conversation_id": null,
    "business_id": "8070c984-41f6-4bfa-900b-1ce8750ad439",
    "resolved_at": null,
    "sla_breached_at": null,
    "fields": {},
    "created_at": "2026-08-31T09:00:00.000Z",
    "updated_at": "2026-08-31T09:00:00.000Z",
    "id": "89e7776f-f68e-4d24-98de-849d4d296925",
    "number": 12,
    "status": "open"
  },
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
GET/api/v1/tickets/{id}tickets:readTry in console

Get a ticket

Fetch one ticket's full state.

  • The ticket is wrapped under ticket.
curl -X GET "https://app.blueticked.com/api/v1/tickets/{id}" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "ticket": {
    "category": "Refund request",
    "title": "Order 552 arrived damaged",
    "priority": "high",
    "assigned_to": "f6326f3e-21e4-45d8-96ae-24a9972359e6",
    "team_id": "61756680-c0c6-4f84-ad85-55f7d498631b",
    "contact_id": "ff506e53-e2f0-4d92-884a-dab77d628bad",
    "conversation_id": null,
    "business_id": "8070c984-41f6-4bfa-900b-1ce8750ad439",
    "resolved_at": null,
    "sla_breached_at": null,
    "fields": {
      "note": "Customer sent photos."
    },
    "created_at": "2026-08-31T09:00:00.000Z",
    "updated_at": "2026-08-31T09:00:00.000Z",
    "id": "89e7776f-f68e-4d24-98de-849d4d296925",
    "number": 12,
    "status": "in_progress"
  },
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
GET/api/v1/tickets/{id}/commentstickets:readTry in console

List ticket comments

Read a ticket's private internal comments and event trail.

  • This is the private internal team trail, not messages sent to a customer. Read access requires tickets:read and the ticket's organisation and business must be allowed by the key.
  • Newest first. Page with ?limit= (default 50, maximum 200) and ?cursor= (the previous page's opaque next_cursor, passed unchanged). Ties use the comment id so no row is skipped.
curl -X GET "https://app.blueticked.com/api/v1/tickets/{id}/comments" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "data": [
    {
      "id": "aabf9513-4d2c-482d-bfa7-84b3738ca23e",
      "ticket_id": "89e7776f-f68e-4d24-98de-849d4d296925",
      "author_user_id": null,
      "body": "Ticket resolved by the team.",
      "kind": "event",
      "created_at": "2026-10-04T08:00:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null,
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
PATCH/api/v1/tickets/{id}tickets:writeTry in console

Update a ticket

Work a ticket from your own tooling: status, priority, title, assignee, team.

Body parameters
statusstring
  • status: open | in_progress | resolved. priority: low | normal | high | urgent. title: a string or null to clear. assigned_to: an ACTIVE workspace member's user id, or null to unassign. team_id: a team in your workspace, or null to clear.
  • The assignee must be able to see the ticket's business: a workspace admin or owner, or a member granted that business. Anyone else is refused with validation_failed (the same rule the dashboard applies), so a ticket can never land on a desk that cannot see it.
  • Resolving fires ticket.resolved (webhook + the ticket.resolved flow event); reopening fires ticket.reopened; an assignee change fires ticket.assigned; other changes (priority, title, team, status to in_progress) fire ticket.updated.
curl -X PATCH "https://app.blueticked.com/api/v1/tickets/{id}" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "status": "resolved"
}'
Response
{
  "ticket": {
    "category": "Refund request",
    "title": "Order 552 arrived damaged",
    "priority": "high",
    "assigned_to": null,
    "team_id": null,
    "contact_id": "ff506e53-e2f0-4d92-884a-dab77d628bad",
    "conversation_id": null,
    "business_id": "8070c984-41f6-4bfa-900b-1ce8750ad439",
    "resolved_at": "2026-08-31T10:00:00.000Z",
    "sla_breached_at": null,
    "fields": {},
    "created_at": "2026-08-31T09:00:00.000Z",
    "updated_at": "2026-08-31T09:00:00.000Z",
    "id": "89e7776f-f68e-4d24-98de-849d4d296925",
    "number": 12,
    "status": "resolved"
  },
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}