API Reference
Public REST endpoints reachable with a personal access token.
Authentication
Issues
/issuesReturns a page of issues the token owner can see, newest first. Every filter is optional; limit is clamped to 1000 server-side.
| Name | In | Required | Type | Description |
|---|---|---|---|---|
allocatable | query | Optional | string | `true` or `1` to drop issues whose status cannot receive a resource allocation. Adds to any `excludeStatuses` you pass rather than replacing it. |
assignedToMe | query | Optional | string | `true` or `1` to narrow to issues assigned to the caller. Applied outside `q`, so an `OR` in `q` cannot widen past it. |
assigneeId | query | Optional | string | Narrow to one assignee, by user id — or the literal `unassigned` for issues with nobody assigned. |
excludeStatuses | query | Optional | string | Comma-separated statuses to exclude. Parsed exactly like `statuses`. |
facets | query | Optional | string | Comma-separated dimensions to count over the same filters, returned as `meta.facets`: `status`, `priority`, `assignee`, `project`, `sprint`, `type`, `epic`, `milestone`. Each dimension is counted without its own filter. |
filteredFacets | query | Optional | string | Like `facets`, but each dimension is counted under the FULL query, its own filter included — how many of the matching issues carry each value. Returned as `meta.filteredFacets`. In both, a bucket is `{ groupId, groupValue, totalCount }`; an `epic` bucket other than `no-epic` also carries `epicStatus`, the status of the epic issue itself; a `milestone` bucket other than `none` also carries the milestone `status` (`open` / `closed`) and its `position` in the project order. A `filteredFacets` bucket also carries `storyPoints`, the points of the bucket under the estimate rule in force: the own points of its members; with `advanced.features.leafEstimateRollup` on, the points of the members that are estimate leaves among ALL the matching issues (a sub-issue outside the result hides nothing), so the buckets add up to the result and the buckets of a sprint to its summary. A `milestone` bucket is always the closure minus the descendants assigned to another milestone. It is seeded from the matching members, so it equals the milestone progress points only when the list is unfiltered. |
groupBy | query | Optional | string | Field being grouped by, such as `status` or `assignee`. Takes effect only together with `groupValue`. |
groupValue | query | Optional | string | Which group within `groupBy` to return — one status, one assignee id (`unassigned` for none), one epic id (`no-epic`), or one milestone id (`none`). |
includeArchived | query | Optional | string | `true` or `1` to return archived issues alongside active ones. |
limit | query | Optional | number | Page size. Defaults to 50 and is clamped to 1000. |
onlyArchived | query | Optional | string | `true` or `1` to return only archived issues. Checked before `includeArchived`, so the two cannot contradict each other. |
page | query | Optional | number | 1-based page number. Defaults to 1. |
projectId | query | Optional | string | Narrow to one project, by id. Use `projectIds` for several. |
projectIds | query | Optional | string | Comma-separated project ids, to query across several projects at once. Entries that are not ids are dropped. |
q | query | Optional | string | Search query in the advanced-search grammar (`status:todo assignee:me is:open sort:priority-desc login`), combined with every other filter; at most 2000 characters. Free text ranks by relevance unless `sortBy` or a `sort:` token is set. Tokens that did not apply are listed in `meta.query.ignoredTokens`; the ordering that ran is `meta.appliedSort`. |
sortBy | query | Optional | string | Field to sort by. A field outside the allowed set leaves the default ordering in place. Wins over a `sort:` token in `q`. |
sortOrder | query | Optional | string | `asc` or `desc`. Applies only with `sortBy`; any other value reads as `asc`. |
sprintId | query | Optional | string | Narrow to the issues in one sprint, by id. Applied outside `q`, so an `OR` in `q` cannot widen past it. |
status | query | Optional | string | Narrow to a single status. Use `statuses` to pass several. |
statuses | query | Optional | string | Comma-separated statuses to include. Unrecognised values are dropped; if none survive, the filter is not applied rather than matching nothing. |
tagIds | query | Optional | string | Comma-separated tag ids. Entries that are not ids are dropped. |
unallocated | query | Optional | string | `true` or `1` to return only issues that have no resource allocations. |
A page of issues. Each row carries `allocation: { capability: 'manage' | 'self' | 'none', reason?: 'no_permission' | 'issue_archived' | 'issue_container' | 'issue_cancelled' }` — what the caller's CURRENT credential may do. Allocation routes do not accept personal access tokens, so a token request always reads `none` / `no_permission`. `meta.stats` counts the matching issues per status; `meta.query` is the parsed `q` (its `ignoredTokens` did not apply); `meta.appliedSort` is the ordering that ran; `meta.facets` is present when `facets` was requested.
The token lacks `issues:read`.
/issuesCreates an issue in the given project. The token owner must have permission to create issues there — the issues:write scope narrows the token, it does not grant access.
The created issue.
The token lacks `issues:write`, or its owner may not create issues in this project.
/issues/{id}Returns a single issue by its id. 403 when the token owner cannot see it — the scope is a ceiling over their own permissions, never a grant.
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Required | string | The issue's id. Not the issue number — `VEL-101` is rejected here. |
The issue.
No such issue.
Projects
/projectsReturns the projects the token owner is a member of. Pass minimal=true for id + name only, which is what a script addressing issues usually needs.
| Name | In | Required | Type | Description |
|---|---|---|---|---|
includeArchived | query | Optional | string | `true` or `1` to return archived projects alongside active ones. |
minimal | query | Optional | string | `true` or `1` to return only id and name per project — enough to address issues, and much smaller. |
The projects.
The token lacks `projects:read`.
/projects/{id}Returns a single project by its id, including its workflow metadata. 403 when the token owner is not a member.
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Required | string | The project's id, as returned by `GET /projects`. |
The project.
No such project.