One test across the runs it appeared in
const url = 'https://beta-api.plune.ai/v1/results/example/history';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}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.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”Responses
Section titled “ Responses ”The signature and its results, newest first
object
One stored result, as every reader returns it — a run’s results, a test’s history, a corrected mark.
object
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.
The number of the result’s combination in its run’s combinations (#1251, ADR 0070). Absent for a result of a run without configurations.
What happened, as it happened — a muted case’s failure is still failed here, and ?status=failed finds it.
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).
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.
Returned sanitized — no colour codes, no credentials — whether it was stored before the rules existed or after.
What the platform removed before storing — written whenever something was, even without text; null when nothing ever was.
object
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.
Whether the TEXT was cut to 256 KB. A shortened field of failure carries its own ….
Characters the REPORTER cut before sending, as it declared in errorContextOmitted; absent when it said nothing. Not the platform’s cut (truncated).
What the reporter said about the failed attempt, or null.
object
How many steps between the outer and the inner ones were left out. Absent when none were.
object
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 ...
object
As the runner named it — screenshot, trace, error-context.
How many artifacts past the listed ones there are — all reachable through ciUrl.
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.
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
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.
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.
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}.
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
The last segment of the name it was uploaded with, cleaned of credentials as a text is.
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.
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.
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).
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
object
Example generated
{ "error": "example"}