---
title: "List plan runs"
method: GET
path: "/api/triggers/plans/{planId}/runs"
tags: ["Triggers – Plans"]
---

# List plan runs

`GET /api/triggers/plans/{planId}/runs`

## Request

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

Lists a plan's runs, newest first, without per-case detail. Use
`GET /api/triggers/plans/{planId}/runs/{planRunId}` for the per-case
breakdown of a single run. Paginate by passing the previous page's
`nextCursor` as `cursor`. Archived (soft-deleted) runs are excluded;
they remain readable via the by-id endpoint, flagged by `archivedAt`.

## Path parameters

- `planId` string, uuid, required

## Query parameters

- `tag` string[]
- `limit` integer
- `cursor` string, date-time
- `sort` 'createdAt' | 'startedAt' | 'status'
- `order` 'asc' | 'desc'
- `locale` 'en' | 'ja' | 'ko' | 'und'

## Response `200`

Runs for the plan, newest first.

- object
  - `items` PlanRunSummary[], 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.
  - `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`: Test plan 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)
