---
title: "List workflow runs for an app"
method: GET
path: "/api/apps/{app_id}/workflows/runs"
---

# List workflow runs for an app

`GET /api/apps/{app_id}/workflows/runs`

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Returns runs across every workflow on the app, newest first.

Set `status` to return only runs in one state. Set `since` to return only runs that started after a moment in time.

<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time.</Warning>

## Path parameters

- `app_id` string, required — ID of the app whose workflows you want to work with.

## Query parameters

- `limit` integer — Most runs to return.
- `offset` integer — How many runs to skip, for paging.
- `status` string, nullable — Keep only runs in this state, for example `failed`.
- `since` string, nullable — Keep only runs that started at or after this ISO 8601 datetime.

## Response `200`

Runs across the app's workflows, newest first.

- RunItem[]
  - `run_id` string, required — ID of the run.
  - `workflow_id` string, required — ID of the workflow that ran.
  - `workflow_name` string — Name of that workflow at the time of the run.
  - `trigger_type` string — What started the run: `scheduled`, `entity`, `connector`, `in_app_agent`, `app_user_auth`, `app_publish`, `app_payment`, `webhook`, or `goal_file`. See [Triggers](/developers/references/apps-api/sections/workflows#triggers) for what each one fires on. A run started through [Run a workflow now](/api-reference/run-a-workflow-now) with no payload to replay reports `manual` instead.
  - `status` string, required — How the run is going: `running`, `completed`, `failed`, or `cancelled`. See [Workflow status](/developers/references/apps-api/sections/workflows#workflow-status) for how this compares to the workflow's own status.
  - `started_at` string, nullable — When the run started, as an ISO 8601 UTC timestamp.
  - `completed_at` string, nullable — When the run finished, as an ISO 8601 UTC timestamp. This is `null` while it is still running.
  - `duration_ms` integer — How long the run took, in milliseconds. This is `0` while it is still running.
  - `steps_count` integer — Steps the run executed.
  - `error_message` string, nullable — Why the run failed. This is `null` when it did not fail.
  - `is_test_run` boolean — This is `true` when the run was started by hand through [Run a workflow now](/api-reference/run-a-workflow-now), rather than by its trigger.
  - `credits_consumed` number — Credits the run used.
  - `status_reason` string — Why the run failed or was cancelled. Empty on runs that finished successfully.

## Other responses

- `400` — `since` is not an ISO 8601 datetime.
- `401` — Missing or invalid credentials.
- `403` — You don't have access to this app, the app does not exist, the app still runs the older automations engine instead of workflows, or you used a workspace API key. A missing app and an app you cannot reach are deliberately the same answer.
- `422` — Validation Error
- `429` — Rate limit exceeded. The base limit is 60 requests per minute. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the multiplier your plan gets.

## Changes

- **2026-09-18** `f70e515893d2` — 1 info
  - added the non-success response with the status `429`

[Change history](https://skmtc.dev/base44/apis/base44-app-management-api/changes/api/apps/:app_id/workflows/runs/get.md)

---

[API](https://skmtc.dev/base44/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/base44/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc.dev/base44/apis/base44-app-management-api/revisions/cf164639a9bf?raw)
