List the tickets sent to an agency
Requires an admin-tier user session whose user is a kept member of the agency, confirmed again on this request; root admin does not stand in for membership. Returns undeleted tickets sent to the agency in companies with Cowork on, across every such company, most recently updated first, with stable cursor pagination. Each ticket names its company. The read never changes the session’s company and returns no chat, theme, customer or order.
curl --request GET \
--url https://api.fluid.app/api/v202604/agencies/{agency}/tasks \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/v202604/agencies/{agency}/tasks"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/v202604/agencies/{agency}/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://api.fluid.app/api/v202604/agencies/{agency}/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://api.fluid.app/api/v202604/agencies/{agency}/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://api.fluid.app/api/v202604/agencies/{agency}/tasks")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/agencies/{agency}/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{
"tasks": [
{
"id": "0197d4e2-7a31-7c3e-9b52-4f1d8a6e2c11",
"client_id": "acme-videos",
"company_id": 42,
"creator_id": 4120,
"title": "Add customer videos",
"description": "Use videos from the media library",
"status": "open",
"priority": "high",
"due_on": null,
"kind": "change",
"category": "eng",
"plan": null,
"board_position": null,
"board_position_at_ms": null,
"lock_version": 3,
"run_id": null,
"run_thread_id": null,
"tags": [],
"agency": {
"key": "example_agency",
"name": "Example agency"
},
"assignee": null,
"assigner": null,
"source_threads": [],
"created_at": "2026-10-14T16:02:11.000Z",
"updated_at": "2026-10-15T20:58:32.000Z",
"company": {
"id": 42,
"name": "Acme Supply"
},
"pickup": null,
"request": {
"state": "sent",
"sent_at": "2026-10-14T16:05:00.000Z",
"own_due_at": "2026-10-14T20:05:00.000Z",
"resolve_due_at": null,
"resolve_breached_at": null,
"resolve_paused_at": null,
"access": [],
"you_have_access": false,
"version": 3,
"stage": "requested",
"quote": null,
"revised_quote": null,
"changes_round": 0,
"delivery_overdue": false,
"last_step": null
}
}
],
"status": 200,
"meta": {
"pagination": {
"cursor": null,
"limit": 25,
"prev_cursor": null,
"next_cursor": null
},
"total": 1,
"request_uuid": "0c5b1f0e-6d52-4e0a-9f6a-2d3a1e8f7b41",
"timestamp": "2026-10-15T20:58:32Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The agency key, as a root admin created it.
64^[a-z0-9_]+$Query Parameters
updated (the default) and board both return the most recently updated tickets first: board positions belong to one company, so they order nothing across companies. due returns tickets by due date, earliest first, then tickets with no due date, ties by id.
updated, board, due Opaque cursor returned by the previous page.
4096Maximum records to return, defaulting to 25.
1 <= x <= 100Comma-separated statuses to keep, for example open,needs_info.
200^(open|kept|needs_info|in_progress|handed|review|skipped)( *, *(open|kept|needs_info|in_progress|handed|review|skipped))*$Comma-separated statuses to leave out. Refused together with filter[status].
200^(open|kept|needs_info|in_progress|handed|review|skipped)( *, *(open|kept|needs_info|in_progress|handed|review|skipped))*$Comma-separated priorities to keep, for example urgent,high. none keeps tickets with no priority.
200^(urgent|high|medium|low|none)( *, *(urgent|high|medium|low|none))*$Comma-separated kinds to keep, for example bug,change. none keeps tickets with no kind. Values within the filter match any of them; the filter narrows with the other filters, and with filter[category] a ticket must match both.
200^(bug|change|feature|design|support|none)( *, *(bug|change|feature|design|support|none))*$Comma-separated categories to keep, for example design,support: design keeps design tickets, support keeps support tickets and eng keeps bugs, changes and features. none keeps tickets with no kind, which belongs to no category. Values within the filter match any of them; the filter narrows with the other filters, and with filter[kind] a ticket must match both.
200^(design|support|eng|none)( *, *(design|support|eng|none))*$Keep tickets whose title contains this text, ignoring case. % and _ match themselves.
1 - 255me keeps tickets the caller owns. unpicked keeps tickets nobody owns: never picked up, or released.
me, unpicked Comma-separated request stages to keep, for example requested,quoted: requested waits for a quote, quoted waits for the customer, accepted is being built and done_proposed waits for the customer to accept the work. meta.total counts with the filter.
200^(requested|quoted|accepted|done_proposed)( *, *(requested|quoted|accepted|done_proposed))*$Keep tickets due on or after this date, an inclusive calendar date the client computes in its own time zone. Tickets with no due date are not kept. May be combined with filter[due_to]; refused with filter[due], and when it is after filter[due_to].
^[0-9]{4}-[0-9]{2}-[0-9]{2}$Keep tickets due on or before this date, an inclusive calendar date the client computes in its own time zone. Tickets with no due date are not kept. May be combined with filter[due_from]; refused with filter[due].
^[0-9]{4}-[0-9]{2}-[0-9]{2}$none keeps tickets with no due date. Refused with filter[due_from] or filter[due_to].
none curl --request GET \
--url https://api.fluid.app/api/v202604/agencies/{agency}/tasks \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/v202604/agencies/{agency}/tasks"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/v202604/agencies/{agency}/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://api.fluid.app/api/v202604/agencies/{agency}/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://api.fluid.app/api/v202604/agencies/{agency}/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://api.fluid.app/api/v202604/agencies/{agency}/tasks")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/agencies/{agency}/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{
"tasks": [
{
"id": "0197d4e2-7a31-7c3e-9b52-4f1d8a6e2c11",
"client_id": "acme-videos",
"company_id": 42,
"creator_id": 4120,
"title": "Add customer videos",
"description": "Use videos from the media library",
"status": "open",
"priority": "high",
"due_on": null,
"kind": "change",
"category": "eng",
"plan": null,
"board_position": null,
"board_position_at_ms": null,
"lock_version": 3,
"run_id": null,
"run_thread_id": null,
"tags": [],
"agency": {
"key": "example_agency",
"name": "Example agency"
},
"assignee": null,
"assigner": null,
"source_threads": [],
"created_at": "2026-10-14T16:02:11.000Z",
"updated_at": "2026-10-15T20:58:32.000Z",
"company": {
"id": 42,
"name": "Acme Supply"
},
"pickup": null,
"request": {
"state": "sent",
"sent_at": "2026-10-14T16:05:00.000Z",
"own_due_at": "2026-10-14T20:05:00.000Z",
"resolve_due_at": null,
"resolve_breached_at": null,
"resolve_paused_at": null,
"access": [],
"you_have_access": false,
"version": 3,
"stage": "requested",
"quote": null,
"revised_quote": null,
"changes_round": 0,
"delivery_overdue": false,
"last_step": null
}
}
],
"status": 200,
"meta": {
"pagination": {
"cursor": null,
"limit": 25,
"prev_cursor": null,
"next_cursor": null
},
"total": 1,
"request_uuid": "0c5b1f0e-6d52-4e0a-9f6a-2d3a1e8f7b41",
"timestamp": "2026-10-15T20:58:32Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}