Endpoints
| Method | Path | Description |
|---|---|---|
POST | /test-runs | Create a test run |
GET | /test-runs | List test runs |
GET | /test-runs/search | Search test runs |
GET | /test-runs/{run_id} | Get a test run |
PATCH | /test-runs/{run_id} | Update a test run |
DELETE | /test-runs/{run_id} | Delete a test run |
POST | /test-runs/{run_id}/data | Register a data file |
GET | /test-runs/{run_id}/data | List data files |
DELETE | /test-runs/{run_id}/data/{file_id} | Delete a data file |
POST | /test-runs/{run_id}/cards | Create a test card |
PATCH | /test-runs/{run_id}/cards/{card_id} | Update a test card |
DELETE | /test-runs/{run_id}/cards/{card_id} | Delete a test card |
POST | /test-runs/{run_id}/cards/{card_id}/steps | Create a step |
PATCH | /test-runs/{run_id}/cards/{card_id}/steps/{step_id} | Update a step |
DELETE | /test-runs/{run_id}/cards/{card_id}/steps/{step_id} | Delete a step |
POST | /test-runs/{run_id}/reports | Create an analysis report |
GET | /test-runs/{run_id}/reports | List reports |
GET | /test-runs/{run_id}/reports/{report_id} | Get a report |
Create a test run
POST /test-runs
Request body:
| Field | Required | Type | Description |
|---|---|---|---|
title | Yes | string | Display name for the test run |
system_id | Yes | UUID | System this run is scoped to |
description | No | string | Additional context. Defaults to "" |
asset_ids | No | array of UUID | Physical assets under test |
issue_ids | No | array of UUID | Issues associated with this run |
template_ids | No | array of UUID | Card templates to instantiate |
| Field | Type | Nullable | Description |
|---|---|---|---|
uuid | string | No | Test run identifier |
test_run_id | string | No | Human-readable run ID |
title | string | No | Display name |
description | string | No | Description |
system_id | string | No | Associated system |
system_name | string | No | System display name |
test_cards | array | No | List of test card objects |
test_data | array | No | Registered data files |
reports | array | No | Analysis reports |
contributors | array | No | Emails of contributors |
created_by | string | No | Creator email |
created_at | string | No | ISO 8601 creation timestamp |
updated_at | string | No | ISO 8601 last-update timestamp |
List test runs
GET /test-runs
Query parameters:
| Parameter | Type | Description |
|---|---|---|
system_id | UUID | Filter by system |
created_after | string | ISO 8601 lower bound |
created_before | string | ISO 8601 upper bound |
has_reports | boolean | Filter to runs that have (or have not) generated reports |
| Field | Type | Description |
|---|---|---|
uuid | string | Test run identifier |
test_run_id | string | Human-readable run ID (e.g. TR-0042) |
title | string | Display name |
system_id | string | Associated system |
system_name | string | System display name |
completion_pct | float | Percentage of steps completed |
step_status_counts | object | Count of steps per execution status |
contributors | array of string | Emails of contributors |
asset_names | array of string | Names of linked assets |
asset_count | integer | Number of linked assets |
issue_count | integer | Number of linked issues |
card_count | integer | Number of test cards |
file_count | integer | Number of registered data files |
report_count | integer | Number of generated reports |
created_by | string | Creator email |
created_at | string | ISO 8601 creation timestamp |
updated_at | string | ISO 8601 last-update timestamp |
Search test runs
GET /test-runs/search
Full-text and semantic search across test runs, cards, steps, and reports.
Query parameters:
| Parameter | Required | Type | Description |
|---|---|---|---|
q | Yes | string | Search query |
mode | No | string | Search mode: default (default) |
component_types | No | string (repeatable) | Restrict to component types (e.g. card, step, report) |
system_id | No | UUID | Filter to a specific system |
created_after | No | string | ISO 8601 lower bound |
created_before | No | string | ISO 8601 upper bound |
has_reports | No | boolean | Filter to runs with (or without) reports |
sort_by | No | string | relevance (default) |
limit | No | integer | Default 20, max 100 |
offset | No | integer | Default 0 |
| Field | Type | Description |
|---|---|---|
results | array | List of search result objects |
total_count | integer | Total number of matching runs |
| Field | Type | Description |
|---|---|---|
test_run | object | Test run summary (same fields as list response) |
score | float | Relevance score |
matches | array | Matched components within the run |
| Field | Type | Description |
|---|---|---|
component_type | string | Type of matched component (e.g. card, step, report) |
component_id | string | Identifier of the matched component |
component_title | string | Title of the matched component |
path | string | Human-readable path within the run |
snippet | string | Matching text excerpt |
match_type | string | fulltext or semantic |
Get a test run
GET /test-runs/{run_id}
Example request:
Update a test run
PATCH /test-runs/{run_id}
All fields are optional.
| Field | Type | Description |
|---|---|---|
title | string | Updated display name |
description | string | Updated description |
Delete a test run
DELETE /test-runs/{run_id}
Example request:
Register a data file
POST /test-runs/{run_id}/data
Registers a data file that is already stored in S3. The file must exist at the provided S3 URL before calling this endpoint.
Request body:
| Field | Required | Type | Description |
|---|---|---|---|
file_name | Yes | string | Display name for the file |
s3_url | Yes | string | S3 URL of the uploaded file |
file_size | Yes | integer | File size in bytes |
content_type | No | string | MIME type. Defaults to "application/octet-stream" |
associate_with | No | object | Associate this file with a specific card or step: {test_card_id?, test_step_id?} |
| Field | Type | Nullable | Description |
|---|---|---|---|
uuid | string | No | File record identifier |
file_name | string | No | Display name |
s3_url | string | No | S3 location |
file_size | integer | No | Size in bytes |
content_type | string | No | MIME type |
uploaded_by | string | No | Uploader email |
created_at | string | No | ISO 8601 registration timestamp |
associations | array | No | List of card/step associations for this file |
List data files
GET /test-runs/{run_id}/data
Example request:
{"items": [...], "count": N} where each item is a data file object with the same fields as the register response.
Delete a data file
DELETE /test-runs/{run_id}/data/{file_id}
Example request:
Create a test card
POST /test-runs/{run_id}/cards
A test card is an individual test case within a run.
Request body:
| Field | Required | Type | Description |
|---|---|---|---|
title | Conditional | string | Card title. Required if template_id is not provided |
template_id | Conditional | UUID | Template to instantiate. Required if title is not provided |
description | No | string | Card description. Defaults to "" |
order | No | integer | Display order |
| Field | Type | Description |
|---|---|---|
uuid | string | Card identifier |
title | string | Card title |
description | string | Card description |
order | integer | Display order |
test_steps | array | List of step objects (see Update a step for step fields) |
issues | array | Linked issue references |
test_data | array | Linked data files |
reports | array | Report summaries linked to this card |
created_at | string | ISO 8601 creation timestamp |
updated_at | string | ISO 8601 last-update timestamp |
Update a test card
PATCH /test-runs/{run_id}/cards/{card_id}
All fields are optional.
| Field | Type | Description |
|---|---|---|
title | string | Updated card title |
description | string | Updated description |
Delete a test card
DELETE /test-runs/{run_id}/cards/{card_id}
Example request:
Create a step
POST /test-runs/{run_id}/cards/{card_id}/steps
Request body:
| Field | Required | Type | Description |
|---|---|---|---|
title | Yes | string | Step title (max 100 characters) |
description | No | string | Step description. Defaults to "" |
step_type | No | string | passfail (default) or other configured types |
order | No | integer | Display order |
Update a step
PATCH /test-runs/{run_id}/cards/{card_id}/steps/{step_id}
Update step metadata or record an execution outcome.
Request body:
| Field | Type | Description |
|---|---|---|
title | string | Step title |
description | string | Step description |
execution_status | string | todo, done, passed, passed_with_exception, failed |
exception | string | Exception note for passed_with_exception |
started_at | string | ISO 8601 start time |
ended_at | string | ISO 8601 end time |
| Field | Type | Description |
|---|---|---|
uuid | string | Step identifier |
title | string | Step title |
description | string | Step description |
order | integer | Display order |
step_type | string | Step type |
execution_status | string | todo, done, passed, passed_with_exception, failed |
exception | string | Exception note (if passed_with_exception) |
started_at | string | ISO 8601 start time |
ended_at | string | ISO 8601 end time |
observations | array | Observations recorded on this step |
test_data | array | Data files linked to this step |
issues | array | Issues linked to this step |
reports | array | Report summaries linked to this step |
created_at | string | ISO 8601 creation timestamp |
updated_at | string | ISO 8601 last-update timestamp |
Delete a step
DELETE /test-runs/{run_id}/cards/{card_id}/steps/{step_id}
Example request:
List reports
GET /test-runs/{run_id}/reports
Example request:
{"items": [...], "count": N} where each item is a report object with the same fields as the create report response.
Get a report
GET /test-runs/{run_id}/reports/{report_id}
Example request:
Create a report
POST /test-runs/{run_id}/reports
Triggers an AI analysis of the registered data files and produces a structured report.
Request body:
| Field | Required | Type | Description |
|---|---|---|---|
scope | Yes | string | Report scope: run, card, or step |
test_card_id | Conditional | UUID | Required when scope is card or step |
test_step_id | Conditional | UUID | Required when scope is step |
analysis_context | No | string | Free-text guidance for the analysis. Defaults to "" |
| Field | Type | Nullable | Description |
|---|---|---|---|
uuid | string | No | Report identifier |
title | string | No | Auto-generated report title |
scope | string | No | run, card, or step |
status | string | No | pending, running, completed, failed, cancelled |
content | string | No | Full report text (populated when completed) |
summary | string | No | Short summary (populated when completed) |
issues | array | No | Issues linked to this report |
test_data | array | No | Data files analyzed |
job_run_id | string | Yes | Background job that generated this report |
created_by | string | No | Creator email |
created_at | string | No | ISO 8601 creation timestamp |
GET /test-runs/{run_id}/reports/{report_id} until status is completed.
