curl --request GET \
--url https://mill-api.example.com/api/boards/{boardId}/tasks \
--header 'Authorization: Bearer <token>'import requests
url = "https://mill-api.example.com/api/boards/{boardId}/tasks"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://mill-api.example.com/api/boards/{boardId}/tasks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://mill-api.example.com/api/boards/{boardId}/tasks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://mill-api.example.com/api/boards/{boardId}/tasks"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://mill-api.example.com/api/boards/{boardId}/tasks")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://mill-api.example.com/api/boards/{boardId}/tasks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"items": [
{
"id": "22222222-2222-4222-8222-222222222222",
"boardId": "11111111-1111-4111-8111-111111111111",
"identifier": "ENG-1",
"title": "Verify database restore",
"description": "Restore a recent backup into an isolated database.",
"acceptanceCriteria": "- Confirm task and comment counts match\n- Record the result",
"type": "task",
"status": "todo",
"priority": "high",
"assigneeId": "66666666-6666-4666-8666-666666666666",
"startDate": "2027-01-18",
"dueDate": "2027-01-20",
"version": 1,
"statusChangedAt": "2027-01-18T09:30:00.000Z",
"createdAt": "2027-01-18T09:30:00.000Z",
"updatedAt": "2027-01-18T09:30:00.000Z",
"createdBy": "66666666-6666-4666-8666-666666666666"
}
],
"hasMore": false,
"nextCursor": null,
"total": 1,
"page": 1,
"revision": "0123456789abcdef0123456789abcdef"
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}List and filter tasks
Search and filter tasks in one board. Combine q, status, assigneeId, priority and sort. Without a status filter, done and wont_do tasks are hidden after 24 hours in that status. Set status explicitly to include older tasks in that status. Tasks are sorted by priority from urgent through none by default; status sort follows backlog, todo, in_progress, in_review, done, wont_do. Maximum 100 results per page, with total matching tasks and the current revision. Use either cursor continuation or a positive page number. Cursor cannot be combined with page or revision. Page requests clamp to the last available page; send the returned revision on subsequent page requests to reject changed lists.
curl --request GET \
--url https://mill-api.example.com/api/boards/{boardId}/tasks \
--header 'Authorization: Bearer <token>'import requests
url = "https://mill-api.example.com/api/boards/{boardId}/tasks"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://mill-api.example.com/api/boards/{boardId}/tasks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://mill-api.example.com/api/boards/{boardId}/tasks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://mill-api.example.com/api/boards/{boardId}/tasks"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://mill-api.example.com/api/boards/{boardId}/tasks")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://mill-api.example.com/api/boards/{boardId}/tasks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"items": [
{
"id": "22222222-2222-4222-8222-222222222222",
"boardId": "11111111-1111-4111-8111-111111111111",
"identifier": "ENG-1",
"title": "Verify database restore",
"description": "Restore a recent backup into an isolated database.",
"acceptanceCriteria": "- Confirm task and comment counts match\n- Record the result",
"type": "task",
"status": "todo",
"priority": "high",
"assigneeId": "66666666-6666-4666-8666-666666666666",
"startDate": "2027-01-18",
"dueDate": "2027-01-20",
"version": 1,
"statusChangedAt": "2027-01-18T09:30:00.000Z",
"createdAt": "2027-01-18T09:30:00.000Z",
"updatedAt": "2027-01-18T09:30:00.000Z",
"createdBy": "66666666-6666-4666-8666-666666666666"
}
],
"hasMore": false,
"nextCursor": null,
"total": 1,
"page": 1,
"revision": "0123456789abcdef0123456789abcdef"
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}assigneeId, priority and sort. Without a status filter, done and wont_do tasks are hidden after 24 hours in that status. Set status explicitly to include older tasks in that status. Tasks are sorted by priority from urgent through none by default; status sort follows backlog, todo, in_progress, in_review, done, wont_do. Maximum 100 results per page, with total matching tasks and the current revision. Use either cursor continuation or a positive page number. Cursor cannot be combined with page or revision. Page requests clamp to the last available page; send the returned revision on subsequent page requests to reject changed lists.
Priority is the default: urgent, high, medium, low, none. Without an explicit status filter, done and wont_do tasks disappear from lists after 24 hours in that status but retain direct access. q searches title, description, acceptance criteria and identifier. assigneeId:unassigned finds tasks without an assignee.
MCP clients can use list_tasks for this operation.
Request conventions · API keys · MCP connectionsAuthorizations
Personal or team Mill REST API key
Path Parameters
The boardId from the corresponding list, record or authorization response.
Query Parameters
string
300backlog, todo, in_progress, in_review, done, wont_do
backlog, todo, in_progress, in_review, done, wont_do JSON value
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$none, low, medium, high, urgent
none, low, medium, high, urgent createdAt, updatedAt, dueDate, priority, status, title
createdAt, updatedAt, dueDate, priority, status, title integer
1 <= x <= 100string
1000integer
x <= 9007199254740991string
^[a-f0-9]{32}$Response
Successful response. Examples are illustrative; field values vary by record.
Was this page helpful?
