---
title: "Raise a ticket"
method: POST
path: "/api/v1/tickets"
tags: ["tickets"]
---

# Raise a ticket

`POST /api/v1/tickets`

## Request

- Base URL: `https://app.blueticked.com`
- URL: `https://app.blueticked.com/api/v1/tickets`
- Auth: HTTP bearer

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

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.

## Request body

- object
  - `category` string
  - `title` string
  - `priority` 'low' | 'normal' | 'high' | 'urgent'
  - `note` string
  - `contact_id` string, uuid
  - `business_id` string, uuid

## Response `201`

Success

- object
  - `ticket` object, required
    - `category` string, required
    - `title` string, nullable, required
    - `priority` 'low' | 'normal' | 'high' | 'urgent', required
    - `assigned_to` string, nullable, required
    - `team_id` string, nullable, required
    - `contact_id` string, nullable, required
    - `conversation_id` string, nullable, required
    - `business_id` string, nullable, required
    - `resolved_at` string, nullable, required
    - `sla_breached_at` string, nullable, required
    - `fields` object, required
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
    - `id` string, uuid, required
    - `number` number, required
    - `status` 'open' | 'in_progress' | 'resolved', required
  - `request_id` string, required

## Other responses

- `400`: Validation failed
- `401`: Unauthorized: missing or invalid API key
- `402`: Insufficient wallet balance
- `403`: Forbidden: scope, plan limit, or suspension
- `404`: Not found
- `409`: Conflict (idempotency-key reuse or resource in use)
- `413`: Request body above the endpoint's size limit
- `422`: Understood but refused: the request is well-formed, the action is not permitted for this resource
- `429`: Rate limited
- `500`: Internal error
- `502`: An upstream provider refused or failed the request
- `503`: Channel or send queue unavailable

---

[API](https://skmtc.dev/blueticked/apis/blueticked-api.md) · [All operations](https://skmtc.dev/blueticked/apis/blueticked-api/llms.txt) · [OpenAPI document](https://skmtc.dev/blueticked/apis/blueticked-api/revisions/07132284f4ff?raw)
