Documentation menu

List jobs

GETupscalr.app/api/v1/jobs

Returns your jobs newest first, as a cursor-paginated list. Filter by status to find what needs attention.

Request

ParameterTypeDescription
limitqueryPage size, 1–100. Defaults to 25.
starting_afterqueryCursor from a previous response's next_cursor. Returns the page after it.
statusqueryOnly 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"
}
StatusMeaning
200A page of jobs, newest first.
401Missing 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);