---
title: "List recent runs, newest first; query schedule_id and limit (default 20, max 100)."
method: GET
path: "/v1/runs"
---

# List recent runs, newest first; query schedule_id and limit (default 20, max 100).

`GET /v1/runs`

## Request

- Base URL: `http://127.0.0.1:10108`
- URL: `http://127.0.0.1:10108/v1/runs`
- Auth: HTTP bearer

Lists recent runs from every source, newest first, without their profile ids. Query `schedule_id` keeps one schedule's runs; `limit` defaults to 20, at most 100.

## Response `200`

Recent runs, newest first, without their profile ids.

- object[]
  - `completedAt` string, date-time, nullable, required
  - `error` string, nullable, required
  - `id` string, uuid, required
  - `profilesDone` integer, required
  - `profilesFailed` integer, required
  - `profilesTotal` integer, required
  - `scheduleId` string, uuid, nullable, required
  - `startedAt` string, date-time, required
  - `status` 'running' | 'completed' | 'partial' | 'failed' | 'skipped', required

## Other responses

- `400`: Unknown query parameter, `schedule_id` not a uuid, or `limit` not a positive integer.
- `401`: No bearer token, or not a token this app issued. The body is empty: it never says which.
- `403`: Refused by the plan: it no longer includes the local API (checked on every request), or it does not allow this action (profile or schedule limit, parallel runs). A request whose Host header is not loopback is also 403, with an empty body.
- `404`: `schedule_id` names no schedule.
- `500`: Veilus failed: storage could not be read or written, or a task panicked. The message says what failed; retrying rarely helps.

---

[API](https://skmtc.dev/veilus/apis/veilus-local-api.md) · [All operations](https://skmtc.dev/veilus/apis/veilus-local-api/llms.txt) · [OpenAPI document](https://skmtc.dev/veilus/apis/veilus-local-api/revisions/67ac3818f9d2?raw)
