Skip to content

Tickets API

Ticket-level operations are on client.tickets. Project-level ticket list/create/reorder operations are on client.projects.

Ticket priority

TicketPriority is:

'lowest' | 'low' | 'normal' | 'high' | 'highest' | 'critical'

get()

get(ticketId: string, options?: CallOptions): Promise<Ticket>

GET /tickets/{ticket} — scope tickets:read.

update()

update(ticketId: string, input: UpdateTicketInput, options?: CallOptions): Promise<Ticket>

PATCH /tickets/{ticket} — scope tickets:write.

Supported fields:

  • title, maximum 500 characters;
  • descriptionHtml, nullable, maximum 200,000;
  • priority;
  • dueAt, nullable date-time;
  • assigneeIds;
  • labelIds;
  • archived.
await client.tickets.update(ticketId, {
  title: 'Design and review deployment runbook',
  priority: 'highest',
  dueAt: null,
  archived: false,
});

Because the serializer removes only undefined, the explicit dueAt: null is preserved on the wire.

delete()

delete(ticketId: string, options?: CallOptions): Promise<void>

DELETE /tickets/{ticket} — scope tickets:write, response 204. The endpoint is a soft delete.

move()

move(ticketId: string, input: MoveTicketInput, options?: CallOptions): Promise<Ticket>

POST /tickets/{ticket}/move — scope tickets:write.

const moved = await client.tickets.move(ticketId, {
  boardId: deployedBoardId,
  position: 2000,
});

position is optional and must be an integer of at least 0 when supplied. The public Okatana guide states that omitting it appends the ticket to the destination board.

A 422 can indicate an invalid destination board or WIP limit failure.

createComment()

createComment(
  ticketId: string,
  input: CreateTicketCommentInput,
  options?: CallOptions,
): Promise<TicketComment>

POST /tickets/{ticket}/comments — scope comments:write.

await client.tickets.createComment(ticketId, {
  bodyHtml: '<p>Deployment validation is complete.</p>',
});

bodyHtml is limited to 200,000 characters by the supplied OpenAPI schema. The endpoint guide states that Okatana records the API credential as the audit actor rather than impersonating a browser user.