# The last 7 days

**GET** `/api/stats/week`

The last seven days by workflow and by day, as the dashboard’s Overview draws them.

Needs [an API token](https://docs.gorunner.io/api/authentication#scopes) with the **Read** permission for runs (`run:read`).

## Parameters

### Query

- `tz` · Optional · string: Your time zone, such as `Europe/Berlin`: the seven days are its days. Unknown or left out: UTC.

## What is counted

Production runs that started in the seven local days ending today, not counting a sub-flow’s runs (they belong to the run that called them) or cancelled ones. Those are counted apart in `subflowRuns` and `cancelled`.

`totals` has each day’s runs. `lines` has one line per workflow that ran, with its `days` and its runs in each quarter of a day (`quarters`, 28). `hours` has every hour of the week.

`newestRunId` is the newest run it counted, so you can tell whether it has caught up.

## Marks, failing and recovered

Each day’s cell is drawn as marks of `per` runs, at most eight to a cell, and each mark takes the worst outcome among its runs: failed, then held, then running, then worked.

`failing` lists workflows failing now: live, and their latest finished production run failed. `recovered` lists those that failed this week and have worked since. For each, `reasons` groups its failed runs by step and cause, three at most.

`compare` counts yesterday and the week before up to the same time of day, so a partly run today can be compared. `runsAtOnce.limit` is the organization’s limit, or `null`.

## Responses

- 200 OK

  The week. It can be up to 30 seconds old.

- 403 `FORBIDDEN`

  The token lacks the **Read** permission for runs.

- 500 `INTERNAL_ERROR`

  The week couldn’t be read. Try again.

Any call can also answer: [`401 UNAUTHORIZED`](https://docs.gorunner.io/errors#UNAUTHORIZED) · [`401 TOKEN_ENDED`](https://docs.gorunner.io/errors#TOKEN_ENDED) · [`403 TOKEN_SURFACE_OFF`](https://docs.gorunner.io/errors#TOKEN_SURFACE_OFF) · [`403 FEATURE_OFF`](https://docs.gorunner.io/errors#FEATURE_OFF) · [`403 EMBED_NOT_ALLOWED`](https://docs.gorunner.io/errors#EMBED_NOT_ALLOWED) · [`403 EMBED_NOT_AVAILABLE`](https://docs.gorunner.io/errors#EMBED_NOT_AVAILABLE) · [`403 ACCOUNT_SUSPENDED`](https://docs.gorunner.io/errors#ACCOUNT_SUSPENDED) · [`429 RATE_LIMITED`](https://docs.gorunner.io/errors#RATE_LIMITED) · [`503 BUSY`](https://docs.gorunner.io/errors#BUSY) · [`503 PAUSED`](https://docs.gorunner.io/errors#PAUSED) · [`503 SERVICE_UNAVAILABLE`](https://docs.gorunner.io/errors#SERVICE_UNAVAILABLE). See [Errors](https://docs.gorunner.io/api/errors#by-status).

Request

**curl**

```bash
GORUNNER="https://api.gorunner.io"
GORUNNER_TOKEN="grt_…"  # needs Read for runs

curl "$GORUNNER/api/stats/week?tz=Europe/Berlin" \
  -H "Authorization: Bearer $GORUNNER_TOKEN"
```

**JavaScript**

```js
const GORUNNER = "https://api.gorunner.io";
const TOKEN = process.env.GORUNNER_TOKEN;

const res = await fetch(
  `${GORUNNER}/api/stats/week?tz=Europe/Berlin`,
  {
    headers: { Authorization: `Bearer ${TOKEN}` },
  },
);
const { data } = await res.json();
```

**Python**

```python
import os, requests

GORUNNER = "https://api.gorunner.io"
TOKEN = os.environ["GORUNNER_TOKEN"]

res = requests.get(
    f"{GORUNNER}/api/stats/week",
    params={"tz": "Europe/Berlin"},
    headers={"Authorization": f"Bearer {TOKEN}"},
)
data = res.json()["data"]
```

Response · 200 OK, shortened

```json
{
  "data": {
    "days": [
      "2026-10-19",
      "2026-10-20",
      "2026-10-21",
      "2026-10-22",
      "2026-10-23",
      "2026-10-24",
      "2026-10-25"
    ],
    "tz": "Europe/Berlin",
    "now": "2026-10-25T11:00:00+01:00",
    "per": 1,
    "busiest": 6,
    "totals": [
      {
        "runs": 4,
        "worked": 4,
        "failed": 0,
        "held": 0,
        "running": 0
      },
      "…"
    ],
    "lines": [
      {
        "workflowId": "3b1e5c2a-7d4f-4e8b-a1c6-5f2d9b0e7a31",
        "workflowName": "Order intake",
        "workflowStatus": "active",
        "days": [
          "…"
        ],
        "quarters": [
          "…"
        ]
      }
    ],
    "failing": [
      {
        "workflowId": "3b1e5c2a-7d4f-4e8b-a1c6-5f2d9b0e7a31",
        "workflowName": "Order intake",
        "failures": 3,
        "latest": {
          "id": "8f0c41d2-6b7e-4c1a-9d3f-2a5b7c9e1f04",
          "status": "failed"
        },
        "reasons": [
          "…"
        ],
        "otherReasons": 0
      }
    ],
    "recovered": [],
    "workflows": {
      "total": 8,
      "active": 6,
      "paused": 1,
      "draft": 1
    },
    "cancelled": 1,
    "subflowRuns": 0,
    "newestRunId": "8f0c41d2-6b7e-4c1a-9d3f-2a5b7c9e1f04",
    "runsAtOnce": {
      "limit": null
    }
  }
}
```

**Every field**

It takes no body.

### Response · 200 OK

- `data` · object
  - `cancelled` · integer: Production runs cancelled in the seven days. They are in no line or total (the board does not draw them).
  - `subflowRuns` · integer: Production runs a Sub-flow step started in the seven days, any outcome. They are counted with the run that called them (in no line or total), while `GET /api/runs` lists each of them.
  - `newestRunId` · UUID or null: The newest production run of the last 24 hours when the week was counted (the first row of GET /api/runs?window=24h&limit=1), or null. A kept answer is reused only while this is still the newest run, so a client comparing it with the run list knows whether the week has caught up.
  - `days` · array of strings: The seven local dates (YYYY-MM-DD), oldest first; the last is today.
  - `tz` · string
  - `per` · integer: How many runs one mark stands for.
  - `busiest` · integer: The most runs any one workflow had on one day.
  - `totals` · array of objects: Each day’s runs, all workflows together.
    - `runs` · integer
    - `worked` · integer
    - `failed` · integer
    - `held` · integer
    - `running` · integer
  - `lines` · array of objects
    - `workflowId` · UUID
    - `workflowName` · string: The workflow’s name as it stands (empty for one deleted since its runs were counted): what a reader that may not list workflows, an embed session with Workflows off, names it by.
    - `workflowStatus` · string: The workflow’s state as it stands: active, paused or draft (empty for one deleted since). A paused workflow is never failing on the Overview.
    - `days` · array of objects: Seven cells, oldest first.
      - `runs` · integer
      - `worked` · integer
      - `failed` · integer
      - `held` · integer
      - `running` · integer
      - `units` · array of objects: The cell’s marks, in start order.
        - `mark` · string: One of `worked`, `failed`, `held`, `running`.
        - `runs` · integer
        - `rest` · string or null: One of `worked`, `held`, `running`, `null`.
    - `quarters` · array of objects: The workflow’s counted runs in each local quarter-day (00–06, 06–12, 12–18, 18–24) of the seven days, oldest first; day i’s four add up to `days[i]`.
      - `runs` · integer
      - `failed` · integer
  - `failing` · array of objects
    - `workflowId` · UUID
    - `workflowName` · string: The workflow’s name as it stands (empty for one deleted since its runs were counted): what a reader that may not list workflows, an embed session with Workflows off, names it by.
    - `failures` · integer
    - `latest` · object: One execution of a workflow. The same schema serves the list and the detail read, but the two carry different subsets: the LIST adds `workflowName`, `workflowTriggerType`, `stepTotal`, `stepFailed` and the fields marked LIST only, and never includes `steps`; the DETAIL includes `steps`. Both carry the version fields and the retry and parent links. An IN-FLIGHT run read from the detail endpoint is served from a live cache and is completed from its run row (its start, environment, versions, retry and parent links, workspace and organization), so it reads as a settled run does, except that `tags` is `null` until the worker saves it.
      - `id` · UUID: The run id.
      - `workflowId` · UUID: The workflow that ran.
      - `workspaceId` · UUID: Tenant workspace, denormalized onto the run.
      - `orgId` · UUID: Tenant organization.
      - `status` · string: A run’s lifecycle status. TERMINAL values — stop polling when you see one — are `completed`, `failed` and `cancelled`. NON-TERMINAL values are `waiting` (accepted and waiting in line for a free slot: its workflow’s or its organization’s runs-at-once limit, or a free worker — `waitingFor`, `waitingLimit` and `linePosition` say which and where; it starts in order, and cancelling it takes it out of the line), `pending` (a worker has it or is about to: `claimedAt` says when a worker took it), `running` (a resumed run executing after its wait) and `paused` (suspended on a durable wait: an approval/webhook resume, or a scheduled resume time). A paused run can remain paused indefinitely; it resumes only when its wait is satisfied, or ends if you cancel it. `waiting` is new in v2026.10.4: before it, a run over a limit was refused instead. One of `waiting`, `pending`, `running`, `completed`, `failed`, `cancelled`, `paused`.
      - `triggerType` · string: How THIS run began — an open string, not the workflow’s trigger vocabulary. Known values: `manual` (editor test), `webhook`, `cron`, `poll`, `event`, `error` (an error-handler workflow), `run_finished`, `api` (started through `POST /api/workflows/{id}/run`), `mcp` (the same door, by an AI app’s tool), `subflow` (started by a parent flow’s Sub-flow step).
      - `triggerData` · object or array or string or number or boolean or null: The payload the trigger delivered — for a webhook run an object with `body`, `headers`, `query`, `method`. This is what `{{trigger...}}` expressions resolved against.
      - `startedAt` · time: When the run was accepted. It may then wait in line for a free slot before a worker starts it (`firstStartedAt`).
      - `firstStartedAt` · time or null: When a worker first started the run. `durationMs` counts from here, so the time from `startedAt` to this is the time the run waited in line. Null until a worker starts the run, and for a run started on v2026.10.5 or earlier or one that ran inline (a Sub-flow’s, an error handler’s), whose `durationMs` counts from `startedAt`.
      - `finishedAt` · time: When the run settled: the moment its result was decided (not when its record was saved, which can be a moment later). Present as soon as the run is finished, also while its record is still being saved. Absent while non-terminal.
      - `durationMs` · integer: How long the run took, in milliseconds: from the first time a worker started the run (`firstStartedAt`, else `startedAt`) to its finish. Waits inside the run (a Delay, an Approval) count; the time it waited in the line for a free slot does not. A run cancelled while it waited has none. Rounded to the millisecond. Present as soon as the run is finished, also while its record is still being saved. Absent while non-terminal.
      - `errorMessage` · string: Why the run failed (or the cancellation reason). Absent/empty otherwise.
      - `tags` · array of strings or null: Tags attached during execution by the Tags app. Filterable via `GET /api/runs?tag=`. `[]` when it has none. `null` while the run is read from its live cache: in flight until the worker saves it, and for a moment after it is cancelled. A run still waiting in line, read from its record, says `[]`.
      - `environment` · string: Where the run came from. `test` for anything the editor started; `production` for real trigger traffic and for `POST /api/workflows/{id}/run?environment=production`. Deliberately independent of `triggerType` — a listen-captured run is both a webhook run and a test run. `GET /api/runs` hides `test` runs unless asked. One of `production`, `test`.
      - `steps` · array of objects: The executed steps, oldest first. Returned by `GET /api/runs/{id}` only — never in the list. Step output lives here, keyed by each element’s `nodeId`.
        - `id` · UUID: Id of this step-run row. A step that suspended the run gets a new id when the run resumes: address a step by `nodeId`.
        - `runId` · UUID: The run this step belongs to.
        - `nodeId` · string: The definition step NAME (stable identifier, e.g. `parse_csv`). Use this to find a step, not `displayName`.
        - `pieceId` · string: The app that ran, e.g. `http`, `code`, `csv`.
        - `actionId` · string: The action within that app, e.g. `send_request`, `convert`.
        - `displayName` · string: The human label shown on the canvas. Not an identifier — it can be duplicated and renamed.
        - `status` · string: A single step’s status inside a run. `skipped` means the step was not executed (a branch arm not taken, or a step after a failure). `paused` marks the wait step a suspended run is currently sitting on. A step executing when its run is cancelled ends `failed` ("Cancelled while it ran."), and so does the step a cancelled run was held on. A step can be `failed` while the run is `completed` — that happens when the step’s error handling routed to an error path or continued. One of `pending`, `running`, `completed`, `failed`, `skipped`, `paused`.
        - `inputData` · object or array or string or number or boolean or null: The resolved input the step ran with, after expressions were evaluated. Normally an object of the form `{"config": {...the step's resolved config... }}`. Absent when the step never executed, and on a step that suspended the run (a top-level Approval, Delay or Wait for callback) once the run has resumed: its `outputData` is kept, its input is not.
        - `outputData` · object or array or string or number or boolean or null: THE STEP’S OUTPUT — whatever the app returned, arbitrary JSON. Absent when the step failed before producing output or never executed. Large payloads are offloaded to object storage during the run and rehydrated here transparently, so this is always inline JSON when present; when it cannot be read back, it is absent and `dataUnavailable` is true.
        - `errorMessage` · string: Why the step failed. Absent/empty when it did not.
        - `retryCount` · integer: Which attempt this record reflects (0 = first attempt).
        - `startedAt` · time: When the step began. Absent if it never started.
        - `finishedAt` · time: When the step settled. Absent while running or if it never finished.
        - `durationMs` · integer: How long this record’s attempt took, in milliseconds, rounded (0 = under half a millisecond; the dashboard says "\<1 ms"). For a retried step it is the last attempt; for a step that ran more than once (a loop body) its last pass. `totalDurationMs` has the step’s time in all.
        - `attempts` · integer: How many attempts the step’s last pass took, when it was retried (absent: one attempt; every field of this group is absent on runs recorded before it existed). This record is the last of them.
        - `firstAttemptStartedAt` · time: When the first of `attempts` began. Present with `attempts`.
        - `passes` · integer: How many times the step ran in the run, when more than once — a step inside a loop runs once per item. Absent: once. This record is the last pass.
        - `totalDurationMs` · integer: The step’s time in all, in milliseconds: each pass from its first attempt’s start to its finish (the waits between retries included), summed over its passes. Present with `attempts` or `passes`.
        - `attemptErrors` · array of objects: The earlier attempts of the last pass and why each failed, oldest first: at most the last 20, each error at most 1,000 characters. Present with `attempts`.
          - `attempt` · integer: Which attempt (1 = the first).
          - `error` · string: What it failed with.
          - `at` · time: When it ended.
        - `recovery` · string: In a restarted run (`restarts`), what the run did with this step: `replayed`, an earlier attempt finished it, its recorded result was used and it did not run again; `rerun`, it had started when the worker stopped and ran again (it only reads or computes); `unknown`, it changes something outside the run and was in flight when the worker stopped, so it was NOT sent again: it failed with "Outcome unknown" and its error handling decided what followed. Absent: an ordinary step. One of `replayed`, `rerun`, `unknown`.
        - `runAttempt` · integer: Which execution of a restarted run produced this record, when it was not the first (2 = the first restart). Absent: the first.
        - `dataUnavailable` · boolean: Present (true) when the step’s payload was offloaded to object storage and could not be read back: the step did produce `inputData`/`outputData`, but it cannot be shown now (they are absent). Tells "produced nothing" apart from "cannot be read". Absent otherwise.
        - `deferred` · object: Only on a read with `large=defer`: the step’s `inputData` and/or `outputData` this read left out because each is over 64 KB of JSON (the step a paused run waits on is never left out), each with its size. The value exists; read it with `GET /api/runs/{id}?step=<nodeId>`. Absent otherwise.
          - `input` · object: A value this read left out because it is large: its size in bytes of JSON, as stored, and for a step’s output its `head`.
          - `bytes` · integer: The value’s size in bytes of JSON.
          - `head` · object: A step OUTPUT’s facts, so a client can say what the step did without reading it (an HTTP status, an approval’s answer, a loop’s count): the output’s top-level keys — a scalar (up to 512 bytes) with its value, an object as its own scalar members, every other value null — at most 8 KB, scalars first. Absent for an input, the trigger data and an output that is not a JSON object. Never the output itself.
          - `output` · object: A value this read left out because it is large: its size in bytes of JSON, as stored, and for a step’s output its `head`. The same fields as `data.failing.latest.steps.deferred.input` above.
      - `versionId` · UUID: The workflow’s latest published version at the moment the run started. Absent for a workflow that has never been published.
      - `versionNumber` · integer: Display number of `versionId`.
      - `executedVersionId` · UUID: The version whose definition ACTUALLY executed. ABSENT means the DRAFT ran (an editor test), so rendering `versionId`'s snapshot would show a graph that never ran. The list and the detail read carry it; `GET /api/workflows/{id}/runs` does not.
      - `executedVersionNumber` · integer: Display number of `executedVersionId`.
      - `startedFromStep` · string: For a partial ("run from here") run, the definition step NAME the run began at. Absent means the run started at its trigger, which is every ordinary run. Everything above that step was seeded, not executed — do not read its steps as having run. Detail read only: a row of `GET /api/runs` leaves it out.
      - `retryOfRunId` · UUID: The run this one is a retry of. Set at creation and immutable.
      - `retriedByRunId` · UUID: The most recent run that retried THIS one. The list and the detail read carry it.
      - `parentRunId` · UUID: For a run started by another run’s Sub-flow step (`triggerType` `subflow`), the run that called it. The list and the detail read carry it; absent for every other run and for sub-flow runs from before 2026-10.
      - `restarts` · integer: How many times the run was offered to another worker because the one running it stopped (killed, out of memory, its host lost, or it lost the run’s lease). A restarted run continues from what the stopped attempt finished: a step it finished does not run again (its step record says `recovery` `replayed`), and a step that changes something outside the run and was in flight is not sent again (`recovery` `unknown`, failed with "Outcome unknown"). Absent: never restarted, and every run from before 2026-11.
      - `answer` · string: How the run’s last wait on a person was settled: approved, rejected, or `timed_out` (nobody answered before the step’s timeout and the run continued without an answer). List read only; absent when the run waited on no one, or its answer was given before 2026-10. One of `approved`, `rejected`, `timed_out`.
      - `workflowName` · string: The workflow’s name. List read only.
      - `workflowTriggerType` · string: The WORKFLOW’s configured trigger type (as opposed to this run’s `triggerType`). List read only.
      - `workflowTriggerPiece` · string: The PIECE the workflow starts with (`form`, `schedule`, `gmailtrigger`), as opposed to `workflowTriggerType`, which is how the platform DELIVERS it. Several apps share one type — a hosted form is delivered over a webhook — so the type alone cannot say what a person chose. Absent when the trigger has no app (manual). List read only.
      - `stepTotal` · integer: Number of step rows recorded for this run. List read only — use it to avoid fetching the detail just to count steps.
      - `stepFailed` · integer: Number of those steps with status `failed`. List read only.
      - `waitStep` · string: Only on a `paused` run: the definition step NAME that suspended the run.
      - `resumeMode` · string: Only on a `paused` run: `time` = it resumes automatically at `resumeAt`; `webhook` = it waits for an external call (an approval) and will not resume on its own. An approval with a timeout is a `time` wait that is also answerable: read `waitingOn` for whether a person is waited on. One of `time`, `webhook`.
      - `resumeAt` · time: Only on a `paused` run with `resumeMode: time`: when it will resume.
      - `waitingOn` · string: Only on a `paused` run: `person` = a resume link is outstanding (an approval, a webhook resume), so someone has to answer it; `time` = it carries on by itself (a Delay, or a link already answered and resuming). The list’s `waiting` filter selects by this. One of `person`, `time`.
      - `claimedAt` · time: Only on an unfinished run a worker has taken: when it took it. A `pending` run with `claimedAt` is executing; one without it is about to be taken.
      - `waitingFor` · string: Only on a `waiting` run held by a runs-at-once limit: `workflow` = its workflow is at its limit (`settings.concurrencyLimit`), `organization` = its organization is (the limit set on Platform › Organizations or by the embed API). Absent when it only waits for a free worker. One of `workflow`, `organization`.
      - `waitingLimit` · integer: Only beside `waitingFor`: the limit it waits on.
      - `linePosition` · integer: Only on a `waiting` run: its place in its workflow’s line, 1 = next.
      - `state` · string: LIST only. The run’s state word: `running` covers a run in a Delay; a rejected approval is `worked` (see `decision`). One of `failed`, `held`, `running`, `queued`, `worked`, `cancelled`.
      - `retryOfStartedAt` · time: LIST only. When the run this one retried started. Absent when it is gone.
      - `retryOutcome` · string: LIST only. What retrying this run came to, over every retry descending from it: `worked` if any worked, else an open one’s state, else the newest one’s. Absent when never retried. One of `failed`, `held`, `running`, `queued`, `worked`, `cancelled`.
      - `retryAt` · time: LIST only. When the retry `retryOutcome` is about started.
      - `decision` · string: LIST only. How the run’s last person-wait was settled (the same value as `answer`). One of `approved`, `rejected`, `timed_out`.
      - `decidedBy` · string: LIST only. Who answered from the product, never an address: a member of the workspace by their name (`a member` when they gave none), `a former member` for anyone the workspace no longer has, or `token {name}`. Absent for an answer through the link itself, a timeout, one from before 2026-10-19, and to an embedded person (who reads only `decision`).
      - `decidedAt` · time: LIST only. When the last person-wait was settled.
      - `heldSince` · time: LIST only. A held run: when its current hold began. A run that held: when its last answered hold began.
      - `heldMs` · integer: LIST only. Time held on a person over every answered hold. `durationMs` includes it, so the run’s own time is `durationMs - heldMs`.
      - `publishedVersionNumber` · integer: LIST only. The workflow’s published version now. Absent for a draft.
      - `publishedAt` · time: LIST only. When that version was published.
      - `workflowStatus` · string: LIST only. The workflow’s status now; absent when it was deleted. One of `active`, `paused`, `draft`.
      - `failure` · object: LIST only, failed runs. The step the error names and the first clause of the reason.
        - `stepKey` · string: The step’s key; absent when the message names no step.
        - `step` · string: Its display name in the version that ran (the draft for a test), else the key.
        - `reason` · string: The first clause of the reason, without the step prefix, at most 160 characters.
      - `parentWorkflowName` · string: LIST only. A sub-flow run’s caller: its workflow’s name.
      - `parentStartedAt` · time: LIST only. When the calling run started.
      - `deferred` · object: Only on a read with `large=defer`: the run’s `triggerData`, when it was left out because it is over 64 KB of JSON, with its size. Read it with `GET /api/runs/{id}?step=trigger`. Absent otherwise.
        - `triggerData` · object: A value this read left out because it is large: its size in bytes of JSON, as stored, and for a step’s output its `head`. The same fields as `data.failing.latest.steps.deferred.input` above.
    - `reasons` · array of objects: The workflow’s failed runs in the seven days, grouped by step and class of reason, the biggest group first; at most three.
      - `step` · string or null: The step the runs failed at, by the name the canvas shows (its key when the workflow no longer has it); null when the message names no step.
      - `message` · string: The group’s latest reason, without the step’s prefix, at most 300 characters (the last an ellipsis when it was cut).
      - `count` · integer: Failed runs in the group.
      - `latestAt` · time: When the group’s latest failed run started.
      - `connectionId` · UUID: The connection the step that failed uses, in the version production runs; absent when it uses none or no step is named. A reader names a connection as a failure’s cause only from this.
    - `otherReasons` · integer: Failed runs in the groups past `reasons`: the groups’ counts and this add up to `failures`.
  - `workflows` · object
    - `total` · integer
    - `active` · integer
    - `paused` · integer
    - `draft` · integer
  - `now` · time: The instant the week was counted, to the second, in `tz`'s offset: today ends here, and `compare`'s windows end a day and a week before it. A kept answer keeps its `now`.
  - `hours` · array of objects: Every real hour from `days[0]` 00:00 to the end of `days[6]`, local, oldest first: 168, or 167/169 over a change of clocks. Counted runs started in each; they add up to `totals`.
    - `start` · time: The hour’s start, in `tz`'s offset (an hour repeated when the clocks go back is told apart by its offset).
    - `runs` · integer
    - `worked` · integer
    - `failed` · integer
    - `held` · integer
    - `running` · integer
  - `compare` · object
    - `yesterdayToNow` · object: Counted runs started from yesterday 00:00 local to `now` − 24 h.
      - `runs` · integer
      - `worked` · integer
      - `failed` · integer
      - `held` · integer
      - `running` · integer
    - `lastWeekToNow` · object: Counted runs started from `days[0]` − 7 local days to `now` − 7 × 24 h.
      - `runs` · integer
      - `worked` · integer
      - `failed` · integer
      - `held` · integer
      - `running` · integer
    - `previousDays` · array of objects: The seven local days a week before `days`, one by one, oldest first, counted by the same rule; the last (a week before today) only up to `now` − 7 × 24 h, the same span as today so far. They add up to `lastWeekToNow`, except just after midnight following a change of clocks, when `now` − 7 × 24 h falls in the day before the last: then the last is empty.
      - `runs` · integer
      - `worked` · integer
      - `failed` · integer
      - `held` · integer
      - `running` · integer
    - `yesterdayCovered` · boolean: Whether the records hold the whole of `yesterdayToNow`'s window: the workspace existed when it began, and run retention has not cut into it. When false the counts are no baseline and the dashboard compares nothing with yesterday. Absent from servers before 2026-10-22.
    - `lastWeekCovered` · boolean: Whether the records hold the whole of `lastWeekToNow`'s window (and so of `previousDays`), by the same rule. When false the dashboard says nothing against a week earlier. Absent from servers before 2026-10-22.
  - `recovered` · array of objects: The workflows that failed in the seven days and whose latest finished production run worked, the most failures first. A paused workflow whose latest finished run failed is in neither list.
    - `workflowId` · UUID
    - `workflowName` · string: The workflow’s name as it stands (empty for one deleted since its runs were counted): what a reader that may not list workflows, an embed session with Workflows off, names it by.
    - `failures` · integer
    - `latestAt` · time: When its latest failed run started.
    - `reasons` · array of objects: The workflow’s failed runs in the seven days, grouped by step and class of reason, the biggest group first; at most three.
      - `step` · string or null: The step the runs failed at, by the name the canvas shows (its key when the workflow no longer has it); null when the message names no step.
      - `message` · string: The group’s latest reason, without the step’s prefix, at most 300 characters (the last an ellipsis when it was cut).
      - `count` · integer: Failed runs in the group.
      - `latestAt` · time: When the group’s latest failed run started.
      - `connectionId` · UUID: The connection the step that failed uses, in the version production runs; absent when it uses none or no step is named. A reader names a connection as a failure’s cause only from this.
    - `otherReasons` · integer: Failed runs in the groups past `reasons`: the groups’ counts and this add up to `failures`.
  - `runsAtOnce` · object: The organization’s runs-at-once limit, the one the workers hold its runs to (its own, else the platform’s default), read live on every answer; the same number `GET /api/stats/overview`'s `limit` and a waiting run’s `waitingLimit` say.
    - `limit` · integer or null: Runs of the organization that may go at once; null when there is no limit.

Related: [Run summary with trend](https://docs.gorunner.io/api/stats/get-stats-summary) · [Overview figures](https://docs.gorunner.io/api/stats/get-stats-overview) · [Find your way around](https://docs.gorunner.io/build/find-your-way-around)

Source: https://docs.gorunner.io/api/stats/get-stats-week
