---
title: "List plan runs across a project"
method: GET
path: "/api/plan-runs"
tags: ["Triggers – Plans"]
---

# List plan runs across a project

`GET /api/plan-runs`

## Request

- Base URL: `https://aximo.autify.com`
- URL: `https://aximo.autify.com/api/plan-runs`
- Auth: API key in header `x-api-key`
- TypeScript: <https://skmtc.dev/autify/apis/aximo-api/docs/api/plan-runs/get.ts> (a function with typed inputs; its response is checked against the schema)

Lists a workspace's plan runs across all of its plans, newest first,
each carrying its plan's `id` and `title`. Archived (soft-deleted)
runs are excluded. Use this for run history; use
`GET /api/triggers/plans/{planId}/runs/{planRunId}` for one run's
per-case breakdown. A run's `status` is execution state, not the test
verdict: read `passedCases`/`failedCases` to judge outcomes. Paginate
by passing the previous page's `nextCursor` as `cursor`.

## Query parameters

- `projectId` string, uuid, required
- `planId` string, uuid
- `status` 'created' | 'running' | 'completed' | 'failed' | 'cancelled'
- `tag` string[]
- `limit` integer
- `cursor` string, date-time
- `sort` 'createdAt' | 'startedAt' | 'status'
- `order` 'asc' | 'desc'
- `locale` 'en' | 'ja' | 'ko' | 'und'

## Response `200`

Plan runs for the project, newest first.

- object
  - `items` ProjectPlanRunItem[], required
    - `id` string, uuid, required
    - `status` 'created' | 'running' | 'completed' | 'failed' | 'cancelled', required
    - `triggerSource` 'manual' | 'scheduled' | 'api', required
    - `executionMode` 'parallel' | 'sequential', required: The effective mode this run executed with.
    - `deviceMode` 'pool' | 'matrix', required: How this run used the plan's devices.
    - `totalCases` integer, required
    - `completedCases` integer, required
    - `passedCases` integer, required
    - `failedCases` integer, required
    - `startedAt` string, date-time, nullable
    - `completedAt` string, date-time, nullable
    - `createdAt` string, date-time, required
    - `tags` string[], required: Caller-supplied labels, for example the commit and pull request a run was testing. At most 10, each 1-64 characters after trimming; duplicates are collapsed. A request exceeding a bound is refused with 400, never truncated. Tags are returned exactly as stored and are visible to everyone in your organization, so never put secrets in them.
    - `planId` string, uuid, required
    - `plan` object, required
      - `id` string, uuid, required
      - `title` string, required
  - `hasMore` boolean: More runs exist beyond this page. Unlike `nextCursor`, this is accurate for every sort and order.
  - `nextCursor` string, date-time: Cursor for the next page. Only emitted on the default sort (`createdAt`, `desc`), because the cursor is a `createdAt` compared with a strict less-than and describes a position in no other ordering. Use `hasMore` to detect further pages.

## Other responses

- `400`: Invalid query parameters.
- `401`: Missing or invalid API key.
- `404`: Project not found.
- `429`: Rate limit exceeded — e.g. the daily session limit was reached for the organization, or too many API requests were sent in a short window (retry after the number of seconds in the `Retry-After` header).
- `500`: Unexpected server error.

---

[API](https://skmtc.dev/autify/apis/aximo-api.md) - [All operations](https://skmtc.dev/autify/apis/aximo-api/llms.txt) - [OpenAPI document](https://skmtc.dev/autify/apis/aximo-api/revisions/590722011284?raw)
