Read a person's time across tickets
Requires an admin-tier user session whose user is a kept member of the agency, confirmed again on this request. Returns the caller’s kept entries across tickets, newest day first, with stable cursor pagination. Only the caller’s own entries are listed. Each entry names its ticket and company, and in_queue says whether the agency’s queue still holds the ticket: entries stay listed after the ticket is withdrawn, deleted or its company turns Cowork off. Time is private to the agency: it appears in no customer read, history event or Mist tool, and root admin does not stand in for membership.
curl --request GET \
--url https://api.fluid.app/api/v202604/agencies/{agency}/time-entries \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/v202604/agencies/{agency}/time-entries"
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}/time-entries', 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}/time-entries",
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}/time-entries"
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}/time-entries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/agencies/{agency}/time-entries")
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{
"time_entries": [
{
"id": "0197d4e2-9b10-7a3d-8c21-5e6f7a8b9c01",
"user": {
"id": "4120",
"name": "Maya Okafor",
"kind": "user"
},
"logged_by": {
"id": "4120",
"name": "Maya Okafor",
"kind": "user"
},
"spent_on": "2026-10-15",
"duration_seconds": 5400,
"started_at": null,
"ended_at": null,
"running": false,
"note": "Cut the product video",
"editable": true,
"lock_version": 0,
"task": {
"id": "0197d4e2-7a31-7c3e-9b52-4f1d8a6e2c11",
"title": "Add customer videos",
"company": {
"id": 42,
"name": "Acme Supply"
},
"in_queue": true,
"request_state": "sent"
}
}
],
"status": 200,
"meta": {
"pagination": {
"cursor": null,
"limit": 25,
"prev_cursor": null,
"next_cursor": null
},
"request_uuid": "0c5b1f0e-6d52-4e0a-9f6a-2d3a1e8f7b41",
"timestamp": "2026-10-15T21:10:05Z"
}
}{
"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
Opaque cursor returned by the previous page.
4096Maximum records to return, defaulting to 25.
1 <= x <= 100curl --request GET \
--url https://api.fluid.app/api/v202604/agencies/{agency}/time-entries \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/v202604/agencies/{agency}/time-entries"
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}/time-entries', 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}/time-entries",
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}/time-entries"
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}/time-entries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/agencies/{agency}/time-entries")
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{
"time_entries": [
{
"id": "0197d4e2-9b10-7a3d-8c21-5e6f7a8b9c01",
"user": {
"id": "4120",
"name": "Maya Okafor",
"kind": "user"
},
"logged_by": {
"id": "4120",
"name": "Maya Okafor",
"kind": "user"
},
"spent_on": "2026-10-15",
"duration_seconds": 5400,
"started_at": null,
"ended_at": null,
"running": false,
"note": "Cut the product video",
"editable": true,
"lock_version": 0,
"task": {
"id": "0197d4e2-7a31-7c3e-9b52-4f1d8a6e2c11",
"title": "Add customer videos",
"company": {
"id": 42,
"name": "Acme Supply"
},
"in_queue": true,
"request_state": "sent"
}
}
],
"status": 200,
"meta": {
"pagination": {
"cursor": null,
"limit": 25,
"prev_cursor": null,
"next_cursor": null
},
"request_uuid": "0c5b1f0e-6d52-4e0a-9f6a-2d3a1e8f7b41",
"timestamp": "2026-10-15T21:10:05Z"
}
}{
"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"
}
}