---
title: "Get project factory run breakdown"
method: GET
path: "/experimental/projects/{projectId}/factory/metrics/runs/breakdown"
tags: ["Projects"]
---

# Get project factory run breakdown

`GET /experimental/projects/{projectId}/factory/metrics/runs/breakdown`

## Request

- Base URL: `https://api.tessl.io`
- URL: `https://api.tessl.io/experimental/projects/{projectId}/factory/metrics/runs/breakdown`
- Auth: none declared

Counts the project's Loop runs grouped by `groupBy`. Runs are those the project Loops started in the requested window (`filter[timestamp][gte]` to the exclusive `filter[timestamp][lt]`, at most 90 days, the last 7 days when neither is given), by creation time, matched and classified as the Basic health, Failure rates and Uptime cards match and classify them. A run that served several of the project's Loops counts once, under the Loop whose claim on it is oldest. `filter[state]` is a Basic health state, `filter[cause]` a Failure rates cause or `any` for runs that failed for any cause, and `filter[pendingForAtLeast]` keeps runs still in progress created at least that many minutes ago. `loop` and `skill` give each group its runs, the runs in each Basic health state, the finished runs (completed, failed or cancelled), the failed ones and the failed ones by cause, most runs first. `reason` gives each distinct cause, failure code and reason of a failed run, at most 100, (a failed run's failure message is its reason only for workspace admins) with how many runs gave it and the newest of them, most frequent first. `day` has one point per UTC day the window touches, zeros included, with its runs, finished, failed and platform-failed runs, and its runs in each state. Unfiltered, the groups add up to the Basic health card for the same window, and with the default window to the Failure rates and Uptime cards.

## Path parameters

- `projectId` string, uuid, required

## Query parameters

- `groupBy` union, required
  - 'loop'
  - 'skill'
  - 'reason'
  - 'day'
- `filter[timestamp][gte]` string, date-time
- `filter[timestamp][lt]` string, date-time
- `filter[state]` union
  - 'running'
  - 'worked'
  - 'noChange'
  - 'needsInput'
  - 'failed'
  - 'cancelled'
- `filter[cause]` union
  - 'platform'
  - 'agent'
  - 'setup'
  - 'credits'
  - 'limits'
  - 'policy'
  - 'any'
- `filter[loopId]` string, uuid
- `filter[skillRef]` string
- `filter[pendingForAtLeast]` integer

## Headers

- `Authorization` string

## Response `200`

Default Response

- object
  - `links` object, required
    - `self` string, uri, required
  - `data` object, required
    - `id` string, uuid, required
    - `type` 'project-factory-run-breakdown', required
    - `attributes` object, required
      - `start` string, date-time, required
      - `end` string, date-time, required
      - `groupBy` union, required
        - 'loop'
        - 'skill'
        - 'reason'
        - 'day'
      - `loops` object[]
        - `loop` object, nullable, required
          - `id` string, uuid, required
          - `label` string, nullable, required
        - `runs` integer, required
        - `states` object, required
          - `running` integer, required
          - `worked` integer, required
          - `noChange` integer, required
          - `needsInput` integer, required
          - `failed` integer, required
          - `cancelled` integer, required
        - `finished` integer, required
        - `failed` integer, required
        - `byCause` object, required
          - `platform` integer, required
          - `agent` integer, required
          - `setup` integer, required
          - `credits` integer, required
          - `limits` integer, required
          - `policy` integer, required
      - `skills` object[]
        - `skillRef` string, nullable, required
        - `runs` integer, required
        - `states` object, required
          - `running` integer, required
          - `worked` integer, required
          - `noChange` integer, required
          - `needsInput` integer, required
          - `failed` integer, required
          - `cancelled` integer, required
        - `finished` integer, required
        - `failed` integer, required
        - `byCause` object, required
          - `platform` integer, required
          - `agent` integer, required
          - `setup` integer, required
          - `credits` integer, required
          - `limits` integer, required
          - `policy` integer, required
      - `reasons` object[]
        - `cause` union, required
          - 'platform'
          - 'agent'
          - 'setup'
          - 'credits'
          - 'limits'
          - 'policy'
        - `failureCode` string, nullable, required
        - `reason` string, nullable, required
        - `count` integer, required
        - `exampleRunId` string, uuid, required
      - `days` object[]
        - `day` string, required
        - `runs` integer, required
        - `finished` integer, required
        - `failed` integer, required
        - `platformFailed` integer, required
        - `states` object, required
          - `running` integer, required
          - `worked` integer, required
          - `noChange` integer, required
          - `needsInput` integer, required
          - `failed` integer, required
          - `cancelled` integer, required

## Other responses

- `401`: Unauthorized
- `403`: Default Response
- `404`: Not Found
- `500`: Internal Server Error

## Changes

- **2026-10-29** `06d2142ed144`: 1 info
  - api operation id `getProjectFactoryMetricRunBreakdown` was added
- **2026-10-28** `2d42f70c9d30`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/tessl/apis/tessl-api/changes/experimental/projects/:projectId/factory/metrics/runs/breakdown/get.md)

---

[API](https://skmtc.dev/tessl/apis/tessl-api.md) - [All operations](https://skmtc.dev/tessl/apis/tessl-api/llms.txt) - [OpenAPI document](https://skmtc.dev/tessl/apis/tessl-api/revisions/4fa2a17154e4?raw)
