Every list endpoint is cursor-paginated. Pass limit for the page size and starting_after with the last id you received to fetch the next page.
GET /v1/projects?limit=2{
"object": "list",
"data": [
{
"id": "prj_71Ka",
"object": "project",
"customer": "cus_8Q2Xk",
"template": "tpl_rooftop_standard",
"capacity_kw": 42.5,
"stage": "survey",
"site": {
"line1": "Plot 14, MIDC Bhosari",
"city": "Pune",
"state": "MH",
"postcode": "411026",
"lat": 18.6298,
"lng": 73.8478
},
"owner": "usr_2Wd9",
"created_at": "2026-08-01T06:20:11Z"
},
{
"id": "…"
}
],
"has_more": true
}let after;
do {
const url = new URL("https://api.redesk.ai/v1/projects");
url.searchParams.set("limit", "100");
if (after) url.searchParams.set("starting_after", after);
const page = await fetch(url, { headers: { Authorization: `Bearer ${key}` } }).then((r) => r.json());
handle(page.data);
after = page.has_more ? page.data.at(-1).id : undefined;
} while (after);