/api/v1/reportsList#
Query parameters
limitinteger
Maximum number of rows to return (default 100).
statusstring · nullable
Restrict to a specific status (passed, failed, cancelled).
Running rows are always filtered out of /reports.
Responses
200OKapplication/json
array of ReportSummaryDRO
run_id requiredstring · uuid
scenario_name requiredstring
profile_ref string · nullable
Profile referenced by the scenario at the time the run finished, if still known to the daemon's in-memory scenarios map.
statusrequiredstring
started_at requiredstring · date-time
ended_at string · date-time · nullable
duration_ms integer · int64 · nullable
steps_executed integer · int32 · nullable
assertions_passed integer · int32 · nullable
assertions_failed integer · int32 · nullable
Request
curl "http://192.168.2.1:8080/api/v1/reports"import requests
BASE_URL = "http://192.168.2.1:8080"
response = requests.get(f"{BASE_URL}/api/v1/reports")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let response = reqwest::Client::new()
.get(format!("{base_url}/api/v1/reports"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
[
{
"run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"scenario_name": "string",
"profile_ref": "string",
"status": "string",
"started_at": "2026-09-29T08:30:00Z",
"ended_at": "2026-09-29T08:30:00Z",
"duration_ms": 0,
"steps_executed": 0,
"assertions_passed": 0,
"assertions_failed": 0
}
]/api/v1/reports/{run_id}Get one#
Path parameters
run_id requiredstring · uuid
Run identifier
Responses
200OKapplication/json
run_id requiredstring · uuid
scenario_name requiredstring
profile_ref string · nullable
Profile referenced by the scenario at the time the run finished, if still known to the daemon's in-memory scenarios map.
statusrequiredstring
started_at requiredstring · date-time
ended_at string · date-time · nullable
duration_ms integer · int64 · nullable
steps_executed integer · int32 · nullable
assertions_passed integer · int32 · nullable
assertions_failed integer · int32 · nullable
has_report requiredboolean
true if the run had a persisted report (completed/failed/cancelled).
verifiedrequiredboolean
Whether ANY assertion in this run read the link rather than the scenario's own script. A report that observed nothing is not a pass, and the reader has to be able to tell the two apart.
abortedrequiredboolean
The run did not reach the end of its timeline. Its assertions were written for a whole one, so neither verdict applies.
eventsrequiredarray of ExecutionEventDRO
ExecutionEventDRO · 4 fields
elapsed_ms requiredinteger · int64
event_id string · nullable
kindrequiredstring
descriptionrequiredstring
assertionsrequiredarray of AssertionResultDRO
AssertionResultDRO · 4 fields
namerequiredstring
passedrequiredboolean
verifiedrequiredboolean
Whether this assertion read the LINK or only the scenario's own timeline.
It was missing from this DTO while scenario_passed required
passed && verified on every assertion — so the field that decides the
verdict was the one field a caller could not see, and a green run was
indistinguishable from a run that had checked the script against
itself. That distinction is the entire reason the flag exists.
messagerequiredstring
metric_samples requiredarray of MetricSampleDRO
The board's own trace across the run. EMPTY IS NOT "NOTHING HAPPENED":
it means no sampler was attached, which sample_interval_ms == None
is how you tell apart.
sample_interval_ms integer · int64 · nullable
The sampler's nominal tick, beside the samples — a series without its cadence cannot distinguish a slow poll from a stalled board.
sourcestring
Where this run's numbers came from: "pl", "stub", "mixed", "none".
SERVED, not kept internal. The point of the field is that a report declares its own provenance to whoever reads it — and the reader of a qualification document is usually not the person who ran it.
404Report not foundapplication/json
Request
curl "http://192.168.2.1:8080/api/v1/reports/3fa85f64-5717-4562-b3fc-2c963f66afa6"import requests
BASE_URL = "http://192.168.2.1:8080"
run_id = "3fa85f64-5717-4562-b3fc-2c963f66afa6" # Run identifier
response = requests.get(f"{BASE_URL}/api/v1/reports/{run_id}")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let run_id = "3fa85f64-5717-4562-b3fc-2c963f66afa6"; // Run identifier
let response = reqwest::Client::new()
.get(format!("{base_url}/api/v1/reports/{run_id}"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
{
"run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"scenario_name": "string",
"profile_ref": "string",
"status": "string",
"started_at": "2026-09-29T08:30:00Z",
"ended_at": "2026-09-29T08:30:00Z",
"duration_ms": 0,
"steps_executed": 0,
"assertions_passed": 0,
"assertions_failed": 0,
"has_report": true,
"verified": true,
"aborted": true,
"events": [
{
"elapsed_ms": 0,
"event_id": "string",
"kind": "string",
"description": "string"
}
],
"assertions": [
{
"name": "string",
"passed": true,
"verified": true,
"message": "string"
}
],
"metric_samples": [
{}
],
"sample_interval_ms": 0,
"source": "string"
}{}