Skip to content

One test across the runs it appeared in

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

Grouped by signature, not by test case id: the same case run with different params is a different test, and a history that mixed them would put a green and a red side by side with nothing to explain the difference. The rows are read like a run’s results: each carries failure and a sanitized errorContext.

id
required
string

The signature and its results, newest first

Media type application/json
object
signature
required
string
history
required
Array<object>

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

object
resultKey

The key the reporter sent (a person’s mark: manual:<caseId>). A result a retest replaced (#1767) keeps it with #retest:<id> appended, in its history.

string
combination

The number of the result’s combination in its run’s combinations (#1251, ADR 0070). Absent for a result of a run without configurations.

integer
status

What happened, as it happened — a muted case’s failure is still failed here, and ?status=failed finds it.

string
Allowed values: passed failed broken blocked skipped
muted

Whether the case was muted when this result counted (#1247): stamped from the case when the result is written (a reporter, plune sync, a Cairn ingest), and following the case while the run is open. A failed or broken result of a muted case is counted as muted, not as a failure; a finished run never changes (#1247).

boolean
subStatus

The sub-status a person marked it with (#1231) — the NAME as it stood then: renaming or removing it under Settings → Statuses changes what is offered next, never this. A built-in is its English name (Product bug); the dashboard shows it in its own language. null for none — every reporter’s result, which never carries one.

string
nullable <= 40 characters
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
omittedByReporter

Characters the REPORTER cut before sending, as it declared in errorContextOmitted; absent when it said nothing. Not the platform’s cut (truncated).

integer
>= 1
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]?:///
defects

The defect links on this result (#1064), oldest first - present on a run’s results list, and only when there is one. A result carries them only if it failed or broke.

Array<object>

A defect (#1064): the address of a ticket somebody already filed, kept beside a case or a failed result. https only, at most 2000 characters; the label is plain text, at most 200, and is shown as text, never as markup. The author is a userId; the dashboard names them from GET /v1/members. No type: Bugs (#1065) will read the same links as external tickets.

object
id
required
string format: uuid
url
required
string
<= 2000 characters /^[Hh][Tt][Tt][Pp][Ss]:///
label
required
string
nullable <= 200 characters
authorId
required
string
createdAt
required
string format: date-time
suitePath

Where the result’s case sits in the tree (#1232) — the suites from the root down to its own; a suite filed from a spec stands for the folders above it by its file (["e2e/cart.spec.ts", "Coupons"]). Empty for a case at the root. On a run’s results list, always.

Array<string>
title

The title of the result’s case (#1705), so a page can name its rows without reading the project’s case list. On a run’s results list; kept after the case is deleted, like the rest of the evidence.

string
files

Files uploaded to this result — screenshots, text (JSON, plain text, logs) and, for a project with a bucket, any file — oldest first (ADR 0040, ADR 0041) — present on a run’s results list, and only when there is one. Only finished files: one still waiting for complete is not listed. For storage: db the bytes are GET /v1/files/{id}.

Array<object>

A file of a result, everything but its bytes (ADR 0040, ADR 0041). Only a finished file is ever shown: one that was announced with uploads and not yet completed is in no list.

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

In the database (storage: db): image/png, image/jpeg, image/webp, application/json or text/plain — a log is text/plain. In the bucket (storage: bucket): the media type it was announced with, lower case and without parameters, any type.

string
size
required

Bytes as kept: in the database a picture at most 2 MiB and a text at most 512 KiB, counted after its credentials are cleaned, so it can differ from what was sent; in the bucket the size that was announced and found there.

integer
storage
required

db: Plune keeps the bytes, GET /v1/files/{id} returns them. bucket: they are in the project’s own bucket, and GET /v1/files/{id} answers 409 in_bucket (the way to read them is GET /v1/files/{id}/link).

string
Allowed values: db bucket
key
additional properties
any
Example
{
"history": [
{
"status": "passed",
"defects": [
{
"id": "6f1c2b3a-0000-4000-8000-0000000000a7",
"url": "https://tracker.example.com/browse/PLN-482",
"label": "Coupon is not applied on an empty cart",
"authorId": "6f1c2b3a-0000-4000-8000-0000000000a2"
}
],
"files": [
{
"storage": "db"
}
]
}
]
}

No / invalid token or session

Not found or not yours

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