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

# Get plan run status

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

## Request

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

Returns the overall status and per-case breakdown of a plan run.

## Path parameters

- `planId` string, uuid, required
- `planRunId` string, uuid, required

## Response `200`

Plan run details.

- PlanRun
  - `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.
  - `archivedAt` string, date-time, nullable: Set when the run was archived (soft-deleted). Archived runs are excluded from the runs list but stay readable by id.
  - `resumedFromRunId` string, uuid, nullable: The run this one was started to finish, if any.
  - `resumedByRunId` string, uuid, nullable: The run started to finish this one, if any. A run can only be resumed once.
  - `remainingCases` integer: How many cases this run left unexecuted and the plan still contains. Counts cases that were pending, running, cancelled or skipped when the run stopped. Always 0 while the run is still going.
  - `canResume` boolean: Whether `POST /api/triggers/plans/{planId}/runs/{planRunId}/resume` would be accepted. False while the run is still going, once it has already been resumed, when nothing is left to execute, and for runs started before resuming was supported.
  - `cases` PlanRunCase[], required
    - `id` string, uuid
    - `caseId` string, uuid
    - `title` string, nullable
    - `type` string, nullable
    - `status` 'pending' | 'running' | 'passed' | 'failed' | 'skipped' | 'cancelled'
    - `sessionId` string, uuid, nullable: The case's session, once created. Pass it to the session read and export endpoints.
    - `startedAt` string, date-time, nullable
    - `completedAt` string, date-time, nullable
    - `failureReason` string, nullable: Why the case failed before it had a session (for example, no plan device came online), null otherwise.

## Other responses

- `401`: Missing or invalid API key.
- `404`: Plan run 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)
