Skip to content

List your runs (newest first)

GET
/v1/runs
curl --request GET \
--url 'https://beta-api.plune.ai/v1/runs?limit=50&offset=0' \
--header 'Authorization: Bearer <token>'

The Runs screen (api.ts → listRuns) and the first call to make with a fresh token. Summaries, not full runs: identity, the headline counts, cost and duration, the eval score with its movement against the previous finished run of the same environment. Offset paging — a run list is short enough for it; the audit feed, which is not, pages by cursor.

limit
integer
default: 50 >= 1 <= 200
offset
integer
0
environment
string

Only runs that declared this environment. Blank or absent means every run — a caller building the query from an unset CI variable asks for everything, not for the empty string.

planId
string

Only runs launched from this plan (meta.planId, D33) — the «Runs of this plan» list. Blank or absent means every run.

q
string

Only runs whose title contains this text, in any case — the search palette (#866). Text, not a pattern: % and _ match themselves, as in the cases list. A run without a title is not found by one. Blank or absent means every run.

Your runs

Media type application/json
object
runs
required
Array<object>

A run as it appears in the list — identity + the headline numbers, derived from the run.

object
id
required
string format: uuid
createdAt
required
string format: date-time
kind
required

What kind of run this is. eval for a plune sync upload, automated for a CI report or a Cairn ingest, otherwise whatever the lifecycle start declared.

string
Allowed values: automated manual mixed eval
title

What the run is called, or null while nobody has said.

string
nullable
environment

Where it ran, or null while nobody has said.

string
nullable
labels

How the run is marked. Empty when unmarked.

Array<string>
source
required

Where the run came from. cairn is an INGEST rather than an eval run: it groups the Results a Cairn run produced. total/passed/failed are counted from those Results and are real numbers. costUsd and durationMs are always 0 and mean “not applicable”: Cairn neither prices a run nor times one. cli covers BOTH a run uploaded by plune sync and one started through the run lifecycle — read measured to tell those apart, since only the first carries a cost and a duration.

string
Allowed values: cli cairn
total
required
integer
passed
required
integer
failed
required

Results whose status is failed — by name, not total − passed: a skipped test is not a failure. For an eval run, the summary’s own failed.

integer
broken
required

Results whose status is broken. Always 0 for an eval run.

integer
blocked
required

Results whose status is blocked. Always 0 for an eval run.

integer
skipped
required

Results whose status is skipped. Always 0 for an eval run.

integer
costUsd
required
number
durationMs
required
integer
measured
required

Whether costUsd and durationMs are measurements or absences — otherwise both are the same 0. Do NOT re-derive this from source: a run started through the run lifecycle (POST /v1/runs with schemaVersion: 2) reports cli, because it did come from a client, and carries neither. Only a run uploaded by plune sync does.

boolean
running
required

Whether the platform is still expecting results for this run — true only between a lifecycle launch and its finish or terminate. Read this rather than deriving a verdict from the counts: a run that has just started has failed: 0 like a run that passed, and the two mean opposite things. A plune sync upload and a Cairn ingest both record a run that has already ended, so both are always false.

boolean
score
required

An eval run’s one number: passed / total in whole points out of 100. Null for every other kind, and for an eval run that ran nothing — a score of nothing is absent, not 0.

integer
nullable <= 100
scoreDelta
required

score minus the score of the previous finished eval run in the same environment (a null environment compares with null), or null when there is none. Null means “no comparison”, not “no change”. Same environment rather than same externalKey: the key would compare a nightly against a pull request, and an eval run has none.

integer
nullable
Example
{
"runs": [
{
"id": "6f1c2b3a-0000-4000-8000-0000000000d1",
"createdAt": "2026-09-16T09:12:04.151Z",
"kind": "automated",
"source": "cli",
"title": "plune · 2026-09-16 09:12 · ci",
"environment": "staging",
"labels": [
"plune",
"vitest",
"ci"
],
"total": 2,
"passed": 1,
"failed": 1,
"broken": 0,
"blocked": 0,
"skipped": 0,
"score": null,
"scoreDelta": null,
"costUsd": 0,
"durationMs": 4931,
"measured": false,
"running": false
}
]
}

No / invalid token or session