---
title: "read an experiment's results, one row per case"
method: GET
path: "/w/{workspace}/ai_evals/experiments/results/{path}"
tags: ["ai_evals"]
---

# read an experiment's results, one row per case

`GET /w/{workspace}/ai_evals/experiments/results/{path}`

## Path parameters

- `workspace` string, required
- `path` string, required

## Query parameters

- `id` string, uuid, required
- `baseline` string, uuid

## Response `200`

experiment results

- object
  - `experiment` EvalExperiment, required — One run of a dataset: written once when the dataset is run, and only ever read afterwards. The case set it executed is returned by the results endpoint, not here: a listing would otherwise send the whole dataset back once per experiment.
    - `id` string, uuid, required
    - `dataset` string, required
    - `subject` EvalSubject, required — What an eval run is executed against.
      - `kind` 'agent' | 'agent_draft' | 'agent_version', required — `agent` runs the ai_agent resource as it is deployed when the run opens, `agent_draft` the caller's unsaved edits of it as the editor holds them (carried in `draft`), and `agent_version` one past version named by `version`. The first and last are read server-side; all three are inlined into the run, so every case of a run executes one configuration: a deploy part-way through changes what the next run measures, never this one.
      - `path` string, required — Path of the ai_agent resource.
      - `version` integer, nullable — The agent's per-path version number when the run opened: how many times the resource had been saved, not a resource_version row id. For `agent` and `agent_draft` it names the configuration the run read and every case executed. For `agent_version` it is the request's own, says which version to inline, and is required.
      - `draft` AgentDraft — The brain and tools of an agent, as the flow editor holds them. Carried by the request and present exactly when the subject kind is `agent_draft` — the edits exist only in the editor — where it is the whole definition of what ran: the run goes through the same unlinked branch of the agent executor the editor's own test uses.
        - `input_transforms` object — The agent's input transforms: provider, system prompt, output type and the rest. The message and attachments come from the case and override anything named here.
        - `tools` object[]
      - `draft_hash` string — Hash of the configuration a draft run executed, stamped server-side. A draft moves without the version moving, so this is what dates a run of one. It is also what recognises a draft run whose configuration was later deployed: when it matches the agent as deployed, the run's kind and version are rewritten to that version, once, and the hash is kept as what the resolution rests on.
    - `run_number` integer, required — This agent's nth run of this dataset, allocated once and never reused. What a run is called. Numbered per agent rather than per subject kind: runs of what is deployed and runs of its draft are the same agent's history.
    - `run_job_id` string, uuid, required — The flow executing the run: one job holding every case and its scores.
    - `case_count` integer, required
    - `scores` ExperimentScore[] — What the run scored, one entry per scorer that produced a number. Carried on the run itself so a list of runs can say what each one scored without reading every cell of every one of them. Empty on a run whose scores have not been read yet.
      - `scorer_id` string, required
      - `name` string, required — What the column is called in the dataset that ran it, resolved server-side because a list of runs spanning datasets cannot hold every dataset's scorers to look it up.
      - `kind` 'agent' | 'script', required
      - `mean` number
      - `pass_rate` number — The share of scored cells at or above the column's threshold, for a column that has one. Absent where the column has no threshold and the mean is the whole headline.
      - `scored` integer, required
      - `failed` integer, required — How many of the run's cells the column failed on. A column that failed on all of them has no number to report and is still one of the columns that ran.
    - `running` boolean — Whether the flow executing this run is still going. What makes a list of runs worth watching rather than worth reloading.
    - `created_at` string, date-time, required
    - `created_by` string, required
  - `baseline` EvalExperiment — One run of a dataset: written once when the dataset is run, and only ever read afterwards. The case set it executed is returned by the results endpoint, not here: a listing would otherwise send the whole dataset back once per experiment.
    - `id` string, uuid, required
    - `dataset` string, required
    - `subject` EvalSubject, required — What an eval run is executed against.
      - `kind` 'agent' | 'agent_draft' | 'agent_version', required — `agent` runs the ai_agent resource as it is deployed when the run opens, `agent_draft` the caller's unsaved edits of it as the editor holds them (carried in `draft`), and `agent_version` one past version named by `version`. The first and last are read server-side; all three are inlined into the run, so every case of a run executes one configuration: a deploy part-way through changes what the next run measures, never this one.
      - `path` string, required — Path of the ai_agent resource.
      - `version` integer, nullable — The agent's per-path version number when the run opened: how many times the resource had been saved, not a resource_version row id. For `agent` and `agent_draft` it names the configuration the run read and every case executed. For `agent_version` it is the request's own, says which version to inline, and is required.
      - `draft` AgentDraft — The brain and tools of an agent, as the flow editor holds them. Carried by the request and present exactly when the subject kind is `agent_draft` — the edits exist only in the editor — where it is the whole definition of what ran: the run goes through the same unlinked branch of the agent executor the editor's own test uses.
        - `input_transforms` object — The agent's input transforms: provider, system prompt, output type and the rest. The message and attachments come from the case and override anything named here.
        - `tools` object[]
      - `draft_hash` string — Hash of the configuration a draft run executed, stamped server-side. A draft moves without the version moving, so this is what dates a run of one. It is also what recognises a draft run whose configuration was later deployed: when it matches the agent as deployed, the run's kind and version are rewritten to that version, once, and the hash is kept as what the resolution rests on.
    - `run_number` integer, required — This agent's nth run of this dataset, allocated once and never reused. What a run is called. Numbered per agent rather than per subject kind: runs of what is deployed and runs of its draft are the same agent's history.
    - `run_job_id` string, uuid, required — The flow executing the run: one job holding every case and its scores.
    - `case_count` integer, required
    - `scores` ExperimentScore[] — What the run scored, one entry per scorer that produced a number. Carried on the run itself so a list of runs can say what each one scored without reading every cell of every one of them. Empty on a run whose scores have not been read yet.
      - `scorer_id` string, required
      - `name` string, required — What the column is called in the dataset that ran it, resolved server-side because a list of runs spanning datasets cannot hold every dataset's scorers to look it up.
      - `kind` 'agent' | 'script', required
      - `mean` number
      - `pass_rate` number — The share of scored cells at or above the column's threshold, for a column that has one. Absent where the column has no threshold and the mean is the whole headline.
      - `scored` integer, required
      - `failed` integer, required — How many of the run's cells the column failed on. A column that failed on all of them has no number to report and is still one of the columns that ran.
    - `running` boolean — Whether the flow executing this run is still going. What makes a list of runs worth watching rather than worth reloading.
    - `created_at` string, date-time, required
    - `created_by` string, required
  - `scorers` Scorer[], required — The columns, which belong to the dataset rather than the experiment.
    - `id` string
    - `name` string — Column header. Defaults to the last segment of the path.
    - `pass_if` number — A score at or above this counts as a pass, and the column reports a pass rate beside its mean. Applied when results are read rather than when they are produced, so moving the line re-reads every score already recorded instead of invalidating them.
    - `kind` 'script' | 'agent', required
    - `path` string, required — The script, or the ai_agent resource used as a judge.
  - `rows` ExperimentRow[], required
    - `case_id` string, uuid, required
    - `input` EvalCaseInput, required — The inputs a standalone run feeds the agent.
      - `user_message` string
      - `user_attachments` object[]
    - `expected` unknown
    - `job_id` string, uuid — The iteration that ran this case. Absent between a run being recorded and its flow reaching this case, which reads as a case still to run.
    - `status` 'running' | 'success' | 'failure' | 'canceled' | 'skipped' | 'unavailable', required — The case's status; `running` until its iteration completes, and `unavailable` for a case whose job was retained away before anything read what it produced.
    - `output` string — The agent's answer. The full trajectory stays reachable through job_id.
    - `subject_version` integer — The agent version this cell ran against. Cells of one experiment can differ, which the table says rather than averaging two versions silently.
    - `subject_draft_hash` string — For a run of unsaved edits, the hash of the configuration this cell ran. Edits move without a version changing, so this is what identifies what ran, and what recognises a run whose edits were later saved as a run of that version.
    - `scores` CellScore[], required — One entry per scorer of the dataset, in column order.
      - `scorer_id` string, required
      - `score` number
      - `reason` string
      - `checks` unknown
      - `error` string
      - `not_applicable` boolean — The scorer read this case and had nothing to measure on it. Left out of the column's mean and pass rate rather than counted as a zero.
      - `pending` boolean, required — A scoring job is still running for this cell.
      - `passed` boolean — Which side of the scorer's `pass_if` threshold the score fell on. Absent when the column has no threshold, or has no score yet.
      - `baseline` number — The same scorer's number on the baseline experiment.
      - `definition_changed` boolean, required — The baseline's score came from a different definition of this scorer, so the delta is a change of scorer as much as a change of agent.
  - `means` ScorerMean[], required
    - `scorer_id` string, required
    - `mean` number
    - `baseline_mean` number
    - `pass_rate` number — The share of scored cells that passed, for a column with a threshold. Reported beside the mean rather than instead of it: a pass rate says how many cases are good enough, a mean says by how much, and neither answers the other's question.
    - `baseline_pass_rate` number
    - `scored` integer, required
    - `missing_in_baseline` integer, required — Cells the baseline has no score for, so a column the baseline never ran shows as unscored rather than as a spurious difference.
    - `definition_changed` boolean, required
  - `regressed` integer, required — Cells scoring lower than the baseline, across every column.
  - `subject_current_version` integer — The version the subject is on now. A row that ran against an earlier one describes an agent that no longer exists.
  - `subject_deployed_hash` string — What the agent hashes to as deployed. A run of unsaved edits carrying this hash ran exactly what is deployed now — the edits were saved — so it is a run of that version rather than of edits.

## Changes

- **2026-08-24** `5afc9f1a93f5` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/windmill/apis/windmill-api/changes/w/:workspace/ai_evals/experiments/results/:path/get.md)

---

[API](https://skmtc.dev/windmill/apis/windmill-api.md) · [All operations](https://skmtc.dev/windmill/apis/windmill-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/windmill/windmill-api/revisions/7b281701c340/schema)
