Skip to content

ProjectsApi

Access through client.Projects. This service covers project lifecycle, relationship discovery, boards, tickets, tags, and analytics.

Project lifecycle

Task<Project> GetAsync(string projectId, ...)
Task<Project> UpdateAsync(string projectId, UpdateProjectRequest request, ...)
Task DeleteAsync(string projectId, ...)

Routes: GET/PATCH/DELETE /projects/{project}. Read requires projects:read; updates/deletion require projects:write. Delete is a soft delete.

Relationship discovery

Task<IReadOnlyList<ProjectMember>> ListMembersAsync(string projectId, ...)
Task<IReadOnlyList<ProjectLabel>> ListLabelsAsync(string projectId, ...)
Task<IReadOnlyList<ProjectTag>> ListTagsAsync(string projectId, ...)

These use projects:read and are useful before sending assignee, label, or tag-related automation.

Boards

Task<IReadOnlyList<Board>> ListBoardsAsync(string projectId, ...)
Task<Board> CreateBoardAsync(string projectId, CreateBoardRequest request, ...)
Task<IReadOnlyList<Board>> ReorderBoardsAsync(string projectId, ReorderBoardsRequest request, ...)

Routes are under /projects/{project}/boards. Reads require boards:read; writes require boards:write.

Board creation supports name, nullable color, nullable WIP limit, and IsDone. WIP limit must be null or at least 1.

Tickets

Task<OkatanaPage<Ticket>> ListTicketsAsync(
    string projectId,
    ListTicketsOptions? filters = null, ...)

IAsyncEnumerable<Ticket> EnumerateTicketsAsync(...)

Task<Ticket> CreateTicketAsync(
    string projectId,
    CreateTicketRequest request, ...)

Task ReorderTicketsAsync(
    string projectId,
    ReorderTicketsRequest request, ...)

Listing requires tickets:read; writes require tickets:write.

Ticket listing supports BoardId, free-text Query, and PerPage 1–200. Ticket creation accepts either BoardId or BoardSlug, title, description HTML, priority, nullable due date, assignees, and labels. If both board selectors are omitted, the server can apply its documented default-board rule.

Ticket reorder uses PUT and returns no content. Do not run concurrent reorder writers for the same board without coordination.

Analytics

Task<ProjectAnalytics> GetAnalyticsAsync(string projectId, ...)

Route: GET /projects/{project}/analytics. Scope: analytics:read. The response model exposes common totals and keeps unknown future fields in Extra.