Skip to main content
POST
Create Ai Ticket

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Headers

authorization
string | null
x-ankra-organisation-id
string | null
idempotency-key
string | null

Optional idempotency key (max 200 characters). Repeated submissions with the same key return the already-filed live ticket instead of duplicating it. Equivalent to the client_token body field; when both are sent they must match.

Body

application/json
title
string
required
body
string | null
kind
string | null
priority
string | null
cluster_id
string<uuid> | null
parent_ticket_id
string<uuid> | null
labels
string[] | null
staffing
enum<string> | null

'auto' (default) lets the AI team staff, mirror and escalate the ticket. 'manual' files it as human-owned: no agent is assigned, it is not mirrored into the bound Slack/Teams thread, and it is never escalated as stale. A sub-ticket inherits its parent's staffing when this is omitted.

Available options:
auto,
manual
due_at
string | null

Optional due date as an RFC 3339 timestamp.

source_kind
string | null

Optional dedupe-key half; one of 'alert', 'external'. Must be provided together with source_id.

source_id
string | null

Optional dedupe-key half (at most 200 characters). While a live ticket exists for the same (source_kind, source_id), re-filing bumps its recurrence and returns it with status 200.

alert_id
string<uuid> | null
client_token
string | null

Optional idempotency key (max 200 characters); the body equivalent of the Idempotency-Key header.

Response

Existing live ticket for the same (source_kind, source_id) returned with its recurrence bumped

id
string<uuid>
required
ticket_number
integer
required
title
string
required
body
string
required
kind
string
required
status
string
required
priority
string
required
assignee_agent_task_id
string<uuid> | null
required
assignee_agent_name
string | null
required
assignee_user_id
string | null
required
assignee_user_email
string | null
required
assignee_user_name
string | null
required
parent_ticket_id
string<uuid> | null
required
parent_ticket_number
integer | null
required
sub_ticket_count
integer
required
open_sub_ticket_count
integer
required
cluster_id
string<uuid> | null
required
cluster_name
string | null
required
cluster_archived
boolean
required
alert_id
string<uuid> | null
required
source_kind
string | null
required
source_id
string | null
required
plan_document
string | null
required
plan_status
string
required
workspace_id
string<uuid> | null
required
slack_channel_id
string | null
required
slack_thread_ts
string | null
required
teams_conversation_id
string | null
required
labels
string[]
required
staffing
enum<string>
required

Who works this ticket: 'auto' (the AI team may staff it, mirror it into the organisation's bound Slack/Teams thread, and escalate it when stale) or 'manual' (a human owns it; all three automatic lanes skip it).

Available options:
auto,
manual
due_at
string<date-time> | null
required

Advisory due date. No loop reads it; it is metadata for the humans on the board.

created_by_kind
string
required
created_by
string
required
resolution
string | null
required
recurrence_count
integer
required
last_event_sequence
integer
required
created_at
string<date-time>
required
updated_at
string<date-time>
required
closed_at
string<date-time> | null
required
status_changed_at
string<date-time>
required
decision_request
AiTicketDecisionRequest · object | null
required

Set while the ticket is blocked on a choice the agent offered; null otherwise. Answer it with POST /ai-tickets/{ticket_id}/decision.