List issues belonging to a team
GET/api/teams/{team_id}/issues
listTeamIssues
Newest-first, keyset-paginated. Pass a previous response's `next_cursor` back as `cursor` for the next (older) page. Filters are optional and combine conjunctively; an omitted `state` means `all`. `counts` are exact over the WHOLE board regardless of the filters and are returned on the first page only — that is what lets a client tell "this team has filed nothing" from "this tab is empty". The board lists the team's TICKETS (`KEY-N`); a repo-bound issue lives on its repo's issue list and is never a board row, so a cursor naming one is a 400. An unparseable `assignee_id`/`label_id`/`cycle_id` is a 400; a well-formed id that names nothing is a 200 with no rows.
Authentication is not described for this operation in the spec — that does not mean it is public. Check tokens and scopes.
curl
curl -X GET 'https://neosource.dev/api/teams/TEAM_ID/issues'fetch
fetch("https://neosource.dev/api/teams/TEAM_ID/issues", {
method: "GET",
});Path parameters
team_idrequired
Query parameters
state`open`, `closed` or `all`. **Omitted means `all`** — this endpoint returned every state before it had filters, and defaulting to `open` would silently drop closed rows from callers that send nothing.
statusOnly issues with this exact status.
blockedOnly blocked (`true`) or unblocked (`false`) issues.
priorityOnly issues with this exact priority.
assignee_idOnly issues assigned to this account (UUID). An id that parses but names nothing returns an empty page, not an error.
label_idOnly issues carrying this label (UUID).
cycle_idOnly issues bound to this cycle (UUID).
cursorOpaque pagination cursor from a previous response's `next_cursor`.
limitPage size; default 500, max 500.
Responses
200Issue page
application/json
403Forbidden — one of: forbidden, needs_scope
application/json
Standard errors
Bodies documented once for the whole API — see standard errors.
- 400Bad Request — one of: invalid_input
- 404Not Found — one of: not_found
- 429Rate limited — retry after the `Retry-After` header
- 500Internal server error
- 503Service temporarily unavailable / at capacity — retry after the `Retry-After` header
- 504Gateway timeout — the request exceeded the server's handling budget
Schemas
Referenced above. Listed here rather than expanded inline, so the same definition is not repeated at every level.
TeamIssueCountCell
One `(status, blocked)` cell of [`TeamIssueCounts`]. Only non-empty cells are returned.
blockedrequiredcountrequiredstatusrequired
IssueAssigneeResponse
One assignee, resolved to something renderable. This used to be a bare `account_id` string; a UUID is not a UI, and every consumer would otherwise have to fan out to the account store itself.
account_idrequireddisplay_namerequiredhandlerequired
AccountKind
Rust mirror of the Pg `account_kind` enum (`accounts.kind`). `Ghost` rows are imported-author placeholders (GitHub metadata import, plans/github-metadata-import.md §6): `handle = gh-<github-id>`, `personal_workspace_id` NULL, no password, no sessions. They must never flow through `get_account*` (`AccountRow::into_record` CorruptData-errors on the NULL workspace) — author rendering goes through `PgGithubImportStore::authors_projection`, and claim-by-proof later promotes or merges them.
"human""bot""service""runner""ghost"
LabelResponse
colorrequiredcreated_atrequireddescriptionrequiredlabel_idrequirednamerequiredrepo_idteam_id
IssuePriority
Linear-style priority. Stored as the `issue_priority` Postgres enum; surfaces as a domain enum so callers never juggle magic ints.
"none""urgent""high""medium""low"
IssueStatus
"backlog""todo""in_progress""in_review""done""cancelled""duplicate"