---
title: "Get automation runs"
method: GET
path: "/v1/automations/runs"
tags: ["Automations"]
---

# Get automation runs

`GET /v1/automations/runs`

Unified automation-run read. Omit `automationRunId` to LIST recent runs (newest first) under `{ data, pagination }`. Filters: `automationId`, `triggerEventId`, `triggerInstanceId`, `recipientEmail`, `status` (pending | running | completed | failed | canceled), `mode` (live | test), and the `from`/`to` ISO-8601 window. Pass `?automationRunId=` to fetch ONE run — returns `{ data: [row] }` (no `pagination`), `404 AUTOMATION_RUN_NOT_FOUND` on an unknown / cross-brand id. List + detail rows are lean by default; add `?include=logs` (detail only) for the per-node execution `logs[]`.

## Query parameters

- `automationRunId` string
- `include` 'logs'
- `automationId` string
- `triggerEventId` string
- `triggerInstanceId` string
- `recipientEmail` string, email
- `status` 'pending' | 'running' | 'completed' | 'failed' | 'canceled'
- `mode` 'live' | 'test'
- `from` string, date-time
- `to` string, date-time
- `limit` integer
- `cursor` string

## Response `200`

A page of runs.

- AutomationRunsListResponse
  - `data` object[], required
    - `automationRunId` string, required
    - `automationId` string, required
    - `automationVersionId` string
    - `triggerInstanceId` string
    - `mode` 'live' | 'test', required
    - `status` 'pending' | 'running' | 'completed' | 'failed' | 'canceled', required
    - `recipientEmail` string
    - `startedAt` string, date-time
    - `completedAt` string, date-time
    - `error` string
    - `logs` object[]
      - `automationRunId` string, required
      - `nodeId` string, required
      - `nodeName` string, required
      - `nodeType` 'trigger' | 'wait' | 'filter' | 'split' | 'sendEmail', required
      - `status` 'running' | 'success' | 'error' | 'skipped', required
      - `orderIndex` integer, required
      - `branch` 'left' | 'right'
      - `durationMs` integer
      - `startedAt` string, date-time, required
      - `completedAt` string, date-time
      - `error` string
  - `pagination` object
    - `limit` integer, required
    - `cursor` string, nullable, required
    - `hasMore` boolean, required

## Other responses

- `400` — The request body or query string was invalid (unknown key, wrong type, or missing required field). Strict schemas reject unknown keys — including `brandId`, which is always resolved from the API key.
- `401` — The API key was missing, invalid, or revoked.
- `403` — The caller does not have the required `automations` permission.
- `404` — Automation run not found in the API-key brand. Cross-brand ids intentionally surface as 404 (never 403) so the API does not leak cross-brand existence.
- `429` — The request hit the rolling rate limit window.
- `500` — Unexpected internal error.

---

[API](https://skmtc.net/brew/apis/brew-public-api-v1.md) · [All operations](https://skmtc.net/brew/apis/brew-public-api-v1/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/brew/brew-public-api-v1/revisions/db96cfedc6c5/schema)
