List sprints
GEThttps://
Returns the organisation's sprints in each project's display order, with the id as the tiebreaker.
Access
- Token scope
- api:
read: project_management Without it:
403 insufficient-token-scope. - Permission
- project_management::
view_active_sprint Without it:
403 insufficient-permission. - Rate cost
- 1 unit, read bucket.
view=detailmakes it 3. Adds: each include +1,q+2. - Also
If-None-Matchanswers304when nothing changed. Never cached:private, no-store. Unknown query parameters are refused, never ignored.
Both are checked, scope first. A token never does more than its user. How access is checked
The list covers the whole organisation and interleaves projects, because order is unique within a project only; narrow it with filter[project_id]. A sprint's state is derived rather than stored, so there is no filter[state]; compose it instead: filter[is_active]=true&filter[completed_at][null]=true is the running sprint, filter[is_active]=false&filter[completed_at][null]=true the upcoming ones, and filter[completed_at][null]=false the history. Listing additionally requires project_management::manage_sprints.
Query parameters
Unknown parameters are refused with 400, naming the parameter.
32 parameters in 6 groups
Views
Pagination
Rows per page. At most 25 when include names a to-many relation; a larger value is 400 invalid-query-parameter.
Default: 25
Opt in to page-number paging: 1-based, at most 1000. Omit it, the default, to page by opaque cursor, which is what links.next hands you. Cannot be combined with cursor. Published only on collections that count their rows on every request. This collection's default sort is a display position that changes whenever someone drags the list into a new order in plnnrly, so a page number can skip or repeat a row if the list is reordered between two page requests. These collections rarely exceed one page; for a stable walk, send sort=id and follow links.next without page.
Filters
- =
- equals
- [in]
- any of a comma-separated list
- [null]
trueorfalse: whether it is empty- [gte][lte][lt]
- at least, at most, less than
When the sprint was actually completed. filter[completed_at][null]=false is every completed sprint and filter[completed_at][null]=true every sprint still open.
Whether the field is null.
Creation timestamp. Pair with sort=id for a stable full export.
Planned last day of the sprint.
Whether the field is null.
Whether the sprint is the project's running one. Combine with filter[completed_at][null] to express a sprint state; this filter alone does not distinguish upcoming from completed.
Narrow the list to one project's sprints, or to several with in.
A comma-separated list of at most 100 values.
Planned first day of the sprint.
Whether the field is null.
When the sprint was actually started. filter[started_at][null]=true is every sprint that has never run.
Whether the field is null.
Search
Sorting
| Key | Sorts by |
|---|---|
order | Display position within the project, as ordered in plnnrly. The default sort; the id breaks ties, because positions are unique within a project only. |
name | Sprint name, A→Z. |
start_date | Planned first day of the sprint. |
end_date | Planned last day of the sprint. |
started_at | When the sprint was actually started. |
completed_at | When the sprint was actually completed. Newest first, with -, is the sprint-history order. |
id | Id, ascending. An id never changes, so use this for a stable full export. |
updated_at | Last-write timestamp; pair with the id tiebreaker for sync. |
Prefix a key with - for descending.
Includes
| Path | Adds | Cost |
|---|---|---|
project | The project this sprint belongs to. Requires the projects prefix's read grant and a token scope covering it; without both it renders as a bare id reference. | +1 |
Request headers
A correlation id of your own. It is recorded in our logs next to the server's request id but never returned: the response header always carries the server's id. A value that does not match the pattern is discarded silently, never rejected.
Response 200
Returns a page of SprintList rows.
The rows, each a SprintList.
per_page, next_cursor, prev_cursor, total, current_page, last_page.
self, next, prev.
Each row is a SprintList: 15 fields.
Headers
ETag- A weak validator (
W/"…") of the rendered page. RateLimit- The IETF
httpapi-ratelimit-headersform of your remaining allowance on the tightest bucket this request touched. RateLimit-Policy- The ceiling and window of that bucket, as
<limit>;w=<seconds>. X-Request-Id- The server-generated ULID correlating this response with our logs.
Every response also carries Cache-Control, Vary, X-Content-Type-Options, X-Plnnrly-Api-Version, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. Headers and versioning
The project this sprint belongs to. A sprint cannot be moved between projects, so this is accepted on create only.
Planned first day of the sprint. Independent of started_at: planning a date does not start the sprint.
When the sprint was actually started. Written only by POST sprints/{sprint}/actions/start; null on an upcoming sprint.
When the sprint was actually completed. Written only by POST sprints/{sprint}/actions/complete; null until then. Non-null is what makes the derived state completed.
Whether this is the project's running sprint. Set by actions/start and cleared by actions/complete, never by PATCH. At most one sprint per project is active at a time.
Display position within the project. Assigned on create as the last position in that project's sprint order, changed only by reordering in plnnrly, and not writable.
Number of work items currently on this sprint, resolved and unresolved alike.
The project this sprint belongs to. Expanding it additionally requires the projects prefix's read grant and a token scope covering it.
Errors
8 errors every operation can return: 304, 400, 401, 404, 406, 429, 500, 503
304 Not modified.
400 Bad request.
idempotency-key-requiredinvalid-cursorinvalid-query-parametermalformed-requestunsupported-parameter
401 Unauthenticated.
404 Not found.
406 Not acceptable.
429 Too many requests.
500 Server error.
503 Service unavailable.
This path allows GET, POST. Anything else answers 405.
Something wrong or missing on this page? Tell us