List a team's board rows
GET/api/teams/{team_id}/board
listTeamBoard
The team board's rows: only what a row renders (no description, no author; assignees and labels as ids, resolved against the team's member and label lists; `people` names every account the page's assignee ids reference, so an agent outside the team still renders). Same filters, gate and errors as `GET /api/teams/{team_id}/issues`; an omitted `state` means `all`. ORDER, total and stable, chosen by `state` and `sort` together, every order ending `issue_id` descending. With `state=open` rows are sectioned by status first (in review, in progress, todo, backlog), then: `sort=priority` (the default) by priority (urgent, high, medium, low, none), then newest first; `sort=created` newest first; `sort=updated` most recently updated first. With `state=closed` or `all` there are no sections: `sort=created` (the default) newest first; `sort=priority` by priority, then newest first; `sort=updated` most recently updated first. Pass a response's `next_cursor` back as `cursor`, with the same `state` and `sort`, for the rows after its last one. The cursor names a POSITION in that order, not a row: rows edited, moved, closed or deleted between pages never restart or stall the walk, and every row that stays put is returned exactly once (a row that moves across the cursor's position — under `sort=updated`, any row edited mid-walk — is seen twice or not at all). A malformed or forged cursor, or one from another order (a different `state` tab or `sort`), is a 400. `counts` are exact over the whole board, first page only.
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/board'fetch
fetch("https://neosource.dev/api/teams/TEAM_ID/board", {
method: "GET",
});Path parameters
team_idrequired
Query parameters
qCase-insensitive literal text in the title, description, `#N` issue identifier, or this team's `KEY-N` identifier. Whitespace is trimmed; an empty value is treated as omitted. Values longer than 256 characters are rejected before storage. Re-send it with `cursor` for the next page.
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 50, max 500.
sort`priority`, `created` or `updated`. **Omitted means the tab's default**: `priority` with `state=open`, `created` with `closed` or `all`. Re-send it with `cursor`: a cursor minted under one order is a 400 under another.
Responses
200Board 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
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"
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"