Skip to content

List handoff tickets for a project

GET
/projects/{id}/tickets
curl --request GET \
--url 'https://example.com/api/projects/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/tickets?status=open&role=frontend&slim=0&limit=1000&offset=0' \
--header 'Authorization: Bearer <token>'

Returns project handoff tickets (HO-* refs). Supports filters, offset/limit pagination, and cursor pagination (cannot combine cursor with role filter). Pass slim=1 to omit heavy text fields from each ticket row.

id
required
string format: uuid

Project UUID

stage
string

Comma-separated stage filter (backlog, up_next, in_progress, validation, live)

status
string
Allowed values: open closed
role
string
Allowed values: frontend backend test design devops qa other
ship
string

Comma-separated ship filters (merged, deployed, deploy_failed, deploying)

milestone
string

Milestone UUID or none for unassigned

q
string

Search title, description, or ticket number

cursor
string

Base64url cursor from prior next_cursor

slim
string
Allowed values: 0 1

When 1, omit heavy ticket text fields from each row

limit
integer
default: 1000 >= 1 <= 2000
offset
integer
0

Project tickets

Media type application/json
object
tickets
required
Array

Kanban/list row. Default mode includes full ticket fields; slim=1 omits heavy text (description, contracts, notes) per handler.

object
id
required
string format: uuid
project_id
required
string format: uuid
billing_account_id
string format: uuid
milestone_id
string | null format: uuid
source
string
number
required
integer
title
required
string
description

Full ticket body; omitted from list rows when slim=1

string
request_type
required
string
Allowed values: bug clarification_needed decision_needed feature_request
status
required
string
Allowed values: open closed
stage
required
string
Allowed values: backlog up_next in_progress validation live
priority
required
string
Allowed values: low medium high
blocking
required
boolean
created_at
required
string format: date-time
updated_at
required
string | null format: date-time
merge_sha
string | null
deployed_at
string | null format: date-time
deploy_failed_at
string | null format: date-time
resolution_type
string | null
reported_by_user_id
string | null format: uuid
suggested_resolution
string | null
implementation_notes

Requester-provided implementation guidance for the assignee

string | null
resolution_note
string | null
resolved_at
string | null format: date-time
evidence
object | null
category

Alias of request_type

string
severity

Alias of priority

string
suggested_backend_change

Alias of suggested_resolution

string | null
roles
required

Assigned ticket roles

Array<object>

Row from handoff_request_roles embedded on ticket list/detail responses.

object
id
required
string format: uuid
handoff_request_id
required
string format: uuid
role
required
string
Allowed values: frontend backend test design devops qa other
status
required
string
Allowed values: pending in_progress done skipped
assignee_user_id
string | null format: uuid
assignee_note
string | null
blocking_reason
string | null
work_started_note
string | null
agent_origin
string | null
started_at
string | null format: date-time
completed_at
string | null format: date-time
created_at
required
string format: date-time
updated_at
required
string format: date-time
summary
required

Present on list responses

string
ticket_ref
required

Present on list responses (HO-{number}-{project-slug})

string
number
required
integer
blocking
required
boolean
stage
required
string
updated_at
required
string format: date-time
roles
required
Array<object>

Row from handoff_request_roles embedded on ticket list/detail responses.

object
id
required
string format: uuid
handoff_request_id
required
string format: uuid
role
required
string
Allowed values: frontend backend test design devops qa other
status
required
string
Allowed values: pending in_progress done skipped
assignee_user_id
string | null format: uuid
assignee_note
string | null
blocking_reason
string | null
work_started_note
string | null
agent_origin
string | null
started_at
string | null format: date-time
completed_at
string | null format: date-time
created_at
required
string format: date-time
updated_at
required
string format: date-time
summary
required
string
ticket_ref
required
string
Example
HO-42-my-project
total
required

Total rows matching filters (PostgREST count)

integer
canTriage
required

Whether the current user can triage tickets (billing admin or superadmin)

boolean
next_cursor

Present when more pages exist (cursor mode only)

string
_meta
required
object
schema_version
required
string
Example
tickets.v2
generated_at
required
string format: date-time
ETag
string

Weak validator for conditional GET (304 when If-None-Match matches)

Not modified (If-None-Match matched)

Invalid request

Media type application/json
object
error
required

Human-readable error message

string
code

Stable machine-readable error code for client branching

string
fieldErrors

First validation message per field path

object
key
additional properties
string
issues

Structured validation issues (Zod)

Array<object>
object
path
required
string
message
required
string
retryAfter

Seconds until rate limit resets (429 responses)

number

Not authenticated

Media type application/json
object
error
required

Human-readable error message

string
code

Stable machine-readable error code for client branching

string
fieldErrors

First validation message per field path

object
key
additional properties
string
issues

Structured validation issues (Zod)

Array<object>
object
path
required
string
message
required
string
retryAfter

Seconds until rate limit resets (429 responses)

number
reconnect

True if re-linking GitHub may fix the issue

boolean

Forbidden

Media type application/json
object
error
required

Human-readable error message

string
code

Stable machine-readable error code for client branching

string
fieldErrors

First validation message per field path

object
key
additional properties
string
issues

Structured validation issues (Zod)

Array<object>
object
path
required
string
message
required
string
retryAfter

Seconds until rate limit resets (429 responses)

number