List jobs
GET
upscalr.app/api/v1/jobsReturns your jobs newest first, as a cursor-paginated list. Filter by status to find what needs attention.
Request
| Parameter | Type | Description |
|---|---|---|
| limit | query | Page size, 1–100. Defaults to 25. |
| starting_after | query | Cursor from a previous response's next_cursor. Returns the page after it. |
| status | query | Only jobs in this state: pending, queued, processing, succeeded, failed or cancelled. |
curl "https://upscalr.app/api/v1/jobs?limit=10&status=succeeded" \
-H "Authorization: Bearer $UPSCALR_API_KEY"Requires the jobs:read scope.
Response
Response · 200 OK
{
"object": "list",
"data": [
{
"id": "cmrw0iqm8000bdcs3um6ii7fa",
"object": "job",
"status": "succeeded",
"target": "4k",
"credits": 3,
"created_at": "2026-07-25T09:30:00Z"
}
],
"has_more": true,
"next_cursor": "cmrw0iqm8000bdcs3um6ii7fa"
}| Status | Meaning |
|---|---|
| 200 | A page of jobs, newest first. |
| 401 | Missing or invalid API key. |
Pagination
While has_more is true, request the next page by passing starting_after=next_cursor. Cursors stay valid even as new jobs arrive, so a walk through the list never skips or repeats.
let cursor;
do {
const url = new URL("https://upscalr.app/api/v1/jobs");
if (cursor) url.searchParams.set("starting_after", cursor);
const page = await (await fetch(url, {
headers: { Authorization: `Bearer ${process.env.UPSCALR_API_KEY}` },
})).json();
for (const job of page.data) handle(job);
cursor = page.has_more ? page.next_cursor : undefined;
} while (cursor);