Skip to content

The results of a run, newest first

GET
/v1/runs/{id}/results
curl --request GET \
--url https://beta-api.plune.ai/v1/runs/example/results \
--header 'Authorization: Bearer <token>'

The result list of the run page (api.ts → listRunResults): every result the run holds, with its status, outcome, execution and error text, whatever the state of the case it points at — a result is evidence of the run and stays listed when its case is later deleted. Not paged: a run is bounded by what one CI job reports. Each result carries its failure in this same answer, so the page opens the detail without another request, and every errorContext is sanitized on the way out — one stored before the rules existed included.

id
required
string

Results of the run

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

One stored result, as every reader returns it — a run’s results, a test’s history, a corrected mark.

object
errorContext

Returned sanitized — no colour codes, no credentials — whether it was stored before the rules existed or after.

string
nullable
errorContextMeta

What the platform removed before storing — written whenever something was, even without text; null when nothing ever was.

object
redacted
required

Values replaced by a marker, in the text and in every string of failure, each once. The headline counts only when there is no text — otherwise it repeats a line of it.

integer
truncated
required

Whether the TEXT was cut to 256 KB. A shortened field of failure carries its own ….

boolean
failure

What the reporter said about the failed attempt, or null.

object
headline
string
<= 300 characters
steps
Array<string>
<= 20 items
stepsOmitted

How many steps between the outer and the inner ones were left out. Absent when none were.

integer
>= 1
location
object
file
required

From the repository root in posix form, the way a case’s specRef names it. A path of the machine is refused: absolute, with a drive or a scheme, from a home (~), or climbing out with ...

string
>= 1 characters /^(?![A-Za-z][A-Za-z0-9+.-]*:)(?![\\/~])(?!(?:.*[\\/])?\.\.(?:[\\/]|$)).+$/
line
required
integer
>= 1
column
integer
>= 1
file
string
<= 1000 characters
artifacts
Array
<= 50 items
object
name
required

As the runner named it — screenshot, trace, error-context.

string
>= 1 characters
contentType
string
>= 1 characters
name
string
<= 200 characters
contentType
string
<= 100 characters
artifactsOmitted

How many artifacts past the listed ones there are — all reachable through ciUrl.

integer
>= 1
ciUrl
string format: uri
/^[Hh][Tt][Tt][Pp][Ss]?:///
files

Files uploaded to this result — screenshots, and text (JSON, plain text, logs) — oldest first (ADR 0040) — present on a run’s results list, and only when there is one. The bytes are GET /v1/files/{id}.

Array<object>

A file of a result, everything but its bytes (ADR 0040).

object
id
required
string
name
required

The last segment of the name it was uploaded with, cleaned of credentials as a text is.

string
contentType
required

A log is text/plain.

string
Allowed values: image/png image/jpeg image/webp application/json text/plain
size
required

Bytes as kept: a picture at most 2 MiB; a text at most 512 KiB, and counted after its credentials are cleaned, so it can differ from what was sent.

integer
key
additional properties
any
Example
{
"results": [
{
"id": "6f1c2b3a-0000-4000-8000-0000000000e2",
"runId": "6f1c2b3a-0000-4000-8000-0000000000d1",
"testCaseId": "6f1c2b3a-0000-4000-8000-0000000000c1",
"resultKey": "e2e/checkout.spec.ts::Checkout — coupon applied::chromium",
"signature": "2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3",
"status": "failed",
"rawStatus": "failed",
"source": "playwright",
"expectedStatus": "passed",
"outcome": "unexpected",
"execution": {
"startedAt": "2026-09-16T09:12:05.400Z",
"finishedAt": "2026-09-16T09:12:09.021Z",
"durationMs": 3621,
"retry": 1,
"worker": "chromium-1"
},
"durationMs": 3621,
"caseVersion": 1,
"errorContext": "Error: expect(locator).toHaveText(\"−10 %\")\n Expected: \"−10 %\"\n Received: \"0 %\"\n at e2e/checkout.spec.ts:41:31",
"errorContextMeta": {
"redacted": 0,
"truncated": false
},
"assertions": [],
"steps": null,
"failure": {
"headline": "Error: expect(locator).toHaveText(\"−10 %\")",
"steps": [
"Pay",
"Apply the coupon"
],
"location": {
"file": "e2e/checkout.spec.ts",
"line": 41,
"column": 31
},
"artifacts": [
{
"name": "screenshot",
"contentType": "image/png"
},
{
"name": "error-context",
"contentType": "text/markdown"
},
{
"name": "trace",
"contentType": "application/zip"
}
],
"ciUrl": "https://github.com/plune-ai/plune/actions/runs/35003177826"
},
"executedBy": null,
"createdAt": "2026-09-16T09:12:04.151Z"
},
{
"id": "6f1c2b3a-0000-4000-8000-0000000000e1",
"runId": "6f1c2b3a-0000-4000-8000-0000000000d1",
"testCaseId": "6f1c2b3a-0000-4000-8000-0000000000c1",
"resultKey": "e2e/checkout.spec.ts::Checkout — empty cart::chromium",
"signature": "7f974c61f8f10065cd8ae6993cc069e4f85b1db1ed008b965885fb6f945a28c9",
"status": "passed",
"rawStatus": "passed",
"source": "playwright",
"expectedStatus": "passed",
"outcome": "expected",
"execution": {
"startedAt": "2026-09-16T09:12:04.000Z",
"finishedAt": "2026-09-16T09:12:05.310Z",
"durationMs": 1310,
"retry": 0,
"worker": "chromium-1"
},
"durationMs": 1310,
"caseVersion": 1,
"errorContext": null,
"errorContextMeta": null,
"assertions": [],
"steps": null,
"failure": null,
"executedBy": null,
"createdAt": "2026-09-16T09:12:04.151Z"
}
]
}

No / invalid token or session

Not found or not yours

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}