Skip to main content
A test run is a record of a verification campaign against a design or asset. It gathers test cards (individual test cases), the data behind them, and Atlas’s analysis of how things performed. See Creating a Test Run Report for a workflow guide.

Endpoints

MethodPathDescription
POST/test-runsCreate a test run
GET/test-runsList test runs
GET/test-runs/searchSearch 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}/dataRegister a data file
GET/test-runs/{run_id}/dataList data files
DELETE/test-runs/{run_id}/data/{file_id}Delete a data file
POST/test-runs/{run_id}/cardsCreate 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}/stepsCreate 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}/reportsCreate an analysis report
GET/test-runs/{run_id}/reportsList reports
GET/test-runs/{run_id}/reports/{report_id}Get a report

Create a test run

POST /test-runs Request body:
FieldRequiredTypeDescription
titleYesstringDisplay name for the test run
system_idYesUUIDSystem this run is scoped to
descriptionNostringAdditional context. Defaults to ""
asset_idsNoarray of UUIDPhysical assets under test
issue_idsNoarray of UUIDIssues associated with this run
template_idsNoarray of UUIDCard templates to instantiate
Example request:
curl -X POST "https://spacex.atlas.arenaphysica.com/api/v1/test-runs" \
  -H "Authorization: Bearer $ATLAS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Motor Controller Acceptance Test",
    "system_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
  }'
Response fields:
FieldTypeNullableDescription
uuidstringNoTest run identifier
test_run_idstringNoHuman-readable run ID
titlestringNoDisplay name
descriptionstringNoDescription
system_idstringNoAssociated system
system_namestringNoSystem display name
test_cardsarrayNoList of test card objects
test_dataarrayNoRegistered data files
reportsarrayNoAnalysis reports
contributorsarrayNoEmails of contributors
created_bystringNoCreator email
created_atstringNoISO 8601 creation timestamp
updated_atstringNoISO 8601 last-update timestamp
Example response:
{
  "uuid": "c9d0e1f2-a3b4-5678-cdef-789012345678",
  "test_run_id": "TR-0042",
  "title": "Motor Controller Acceptance Test",
  "description": "",
  "system_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "system_name": "Power Distribution Unit",
  "test_cards": [],
  "test_data": [],
  "reports": [],
  "contributors": ["engineer@example.com"],
  "created_by": "engineer@example.com",
  "created_at": "2026-04-13T11:00:00.000000",
  "updated_at": "2026-04-13T11:00:00.000000"
}

List test runs

GET /test-runs Query parameters:
ParameterTypeDescription
system_idUUIDFilter by system
created_afterstringISO 8601 lower bound
created_beforestringISO 8601 upper bound
has_reportsbooleanFilter to runs that have (or have not) generated reports
Example request:
curl "https://spacex.atlas.arenaphysica.com/api/v1/test-runs?system_id=$SYSTEM_ID" \
  -H "Authorization: Bearer $ATLAS_TOKEN"
Response fields (each item):
FieldTypeDescription
uuidstringTest run identifier
test_run_idstringHuman-readable run ID (e.g. TR-0042)
titlestringDisplay name
system_idstringAssociated system
system_namestringSystem display name
completion_pctfloatPercentage of steps completed
step_status_countsobjectCount of steps per execution status
contributorsarray of stringEmails of contributors
asset_namesarray of stringNames of linked assets
asset_countintegerNumber of linked assets
issue_countintegerNumber of linked issues
card_countintegerNumber of test cards
file_countintegerNumber of registered data files
report_countintegerNumber of generated reports
created_bystringCreator email
created_atstringISO 8601 creation timestamp
updated_atstringISO 8601 last-update timestamp
Example response:
{
  "items": [
    {
      "uuid": "c9d0e1f2-a3b4-5678-cdef-789012345678",
      "test_run_id": "TR-0042",
      "title": "Motor Controller Acceptance Test",
      "system_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "system_name": "Power Distribution Unit",
      "completion_pct": 0.75,
      "step_status_counts": {"todo": 1, "passed": 3},
      "contributors": ["engineer@example.com"],
      "asset_names": [],
      "asset_count": 0,
      "issue_count": 1,
      "card_count": 4,
      "file_count": 2,
      "report_count": 1,
      "created_by": "engineer@example.com",
      "created_at": "2026-04-13T11:00:00.000000",
      "updated_at": "2026-04-13T11:30:00.000000"
    }
  ],
  "count": 1
}

Search test runs

GET /test-runs/search Full-text and semantic search across test runs, cards, steps, and reports. Query parameters:
ParameterRequiredTypeDescription
qYesstringSearch query
modeNostringSearch mode: default (default)
component_typesNostring (repeatable)Restrict to component types (e.g. card, step, report)
system_idNoUUIDFilter to a specific system
created_afterNostringISO 8601 lower bound
created_beforeNostringISO 8601 upper bound
has_reportsNobooleanFilter to runs with (or without) reports
sort_byNostringrelevance (default)
limitNointegerDefault 20, max 100
offsetNointegerDefault 0
Example request:
curl "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/search?q=undervoltage&system_id=$SYSTEM_ID" \
  -H "Authorization: Bearer $ATLAS_TOKEN"
Response fields:
FieldTypeDescription
resultsarrayList of search result objects
total_countintegerTotal number of matching runs
Each result object:
FieldTypeDescription
test_runobjectTest run summary (same fields as list response)
scorefloatRelevance score
matchesarrayMatched components within the run
Each match object:
FieldTypeDescription
component_typestringType of matched component (e.g. card, step, report)
component_idstringIdentifier of the matched component
component_titlestringTitle of the matched component
pathstringHuman-readable path within the run
snippetstringMatching text excerpt
match_typestringfulltext or semantic
Example response:
{
  "results": [
    {
      "test_run": {
        "uuid": "c9d0e1f2-a3b4-5678-cdef-789012345678",
        "test_run_id": "TR-0042",
        "title": "Motor Controller Acceptance Test",
        "system_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "system_name": "Power Distribution Unit",
        "completion_pct": 0.75,
        "card_count": 4,
        "report_count": 1,
        "created_by": "engineer@example.com",
        "created_at": "2026-04-13T11:00:00.000000"
      },
      "score": 0.92,
      "matches": [
        {
          "component_type": "step",
          "component_id": "d0e1f2a3-b4c5-6789-defa-890123456789",
          "component_title": "Apply 13V to input rail",
          "path": "Overvoltage protection > Apply 13V to input rail",
          "snippet": "Verify shutdown within 100ms after undervoltage event",
          "match_type": "semantic"
        }
      ]
    }
  ],
  "total_count": 1
}

Get a test run

GET /test-runs/{run_id} Example request:
curl "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID" \
  -H "Authorization: Bearer $ATLAS_TOKEN"
Returns a test run detail object with the same fields as the create response.

Update a test run

PATCH /test-runs/{run_id} All fields are optional.
FieldTypeDescription
titlestringUpdated display name
descriptionstringUpdated description
Example request:
curl -X PATCH "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID" \
  -H "Authorization: Bearer $ATLAS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title": "Motor Controller Acceptance Test – Rev 2"}'
Returns the updated test run detail object with the same fields as the create response.

Delete a test run

DELETE /test-runs/{run_id} Example request:
curl -X DELETE "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID" \
  -H "Authorization: Bearer $ATLAS_TOKEN"
Returns 204 No Content.

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:
FieldRequiredTypeDescription
file_nameYesstringDisplay name for the file
s3_urlYesstringS3 URL of the uploaded file
file_sizeYesintegerFile size in bytes
content_typeNostringMIME type. Defaults to "application/octet-stream"
associate_withNoobjectAssociate this file with a specific card or step: {test_card_id?, test_step_id?}
Example request:
curl -X POST "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID/data" \
  -H "Authorization: Bearer $ATLAS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "file_name": "motor_test_log.csv",
    "s3_url": "s3://your-bucket/test-data/motor_test_log.csv",
    "file_size": 204800,
    "content_type": "text/csv"
  }'
Response fields:
FieldTypeNullableDescription
uuidstringNoFile record identifier
file_namestringNoDisplay name
s3_urlstringNoS3 location
file_sizeintegerNoSize in bytes
content_typestringNoMIME type
uploaded_bystringNoUploader email
created_atstringNoISO 8601 registration timestamp
associationsarrayNoList of card/step associations for this file
Example response:
{
  "uuid": "b1c2d3e4-f5a6-7890-bcde-234567890123",
  "file_name": "motor_test_log.csv",
  "s3_url": "s3://your-bucket/test-data/motor_test_log.csv",
  "file_size": 204800,
  "content_type": "text/csv",
  "uploaded_by": "engineer@example.com",
  "created_at": "2026-04-13T11:02:00.000000",
  "associations": []
}

List data files

GET /test-runs/{run_id}/data Example request:
curl "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID/data" \
  -H "Authorization: Bearer $ATLAS_TOKEN"
Returns {"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:
curl -X DELETE "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID/data/$FILE_ID" \
  -H "Authorization: Bearer $ATLAS_TOKEN"
Returns 204 No Content.

Create a test card

POST /test-runs/{run_id}/cards A test card is an individual test case within a run. Request body:
FieldRequiredTypeDescription
titleConditionalstringCard title. Required if template_id is not provided
template_idConditionalUUIDTemplate to instantiate. Required if title is not provided
descriptionNostringCard description. Defaults to ""
orderNointegerDisplay order
Example request:
curl -X POST "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID/cards" \
  -H "Authorization: Bearer $ATLAS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Overvoltage protection",
    "description": "Apply 13V to input, verify shutdown within 100ms"
  }'
Response fields:
FieldTypeDescription
uuidstringCard identifier
titlestringCard title
descriptionstringCard description
orderintegerDisplay order
test_stepsarrayList of step objects (see Update a step for step fields)
issuesarrayLinked issue references
test_dataarrayLinked data files
reportsarrayReport summaries linked to this card
created_atstringISO 8601 creation timestamp
updated_atstringISO 8601 last-update timestamp
Example response:
{
  "uuid": "d2e3f4a5-b6c7-8901-defa-345678901234",
  "title": "Overvoltage protection",
  "description": "Apply 13V to input, verify shutdown within 100ms",
  "order": 1,
  "test_steps": [],
  "issues": [],
  "test_data": [],
  "reports": [],
  "created_at": "2026-04-13T11:03:00.000000",
  "updated_at": "2026-04-13T11:03:00.000000"
}

Update a test card

PATCH /test-runs/{run_id}/cards/{card_id} All fields are optional.
FieldTypeDescription
titlestringUpdated card title
descriptionstringUpdated description
Example request:
curl -X PATCH "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID/cards/$CARD_ID" \
  -H "Authorization: Bearer $ATLAS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title": "Overvoltage protection – updated threshold"}'
Returns the updated test card object with the same fields as the create card response.

Delete a test card

DELETE /test-runs/{run_id}/cards/{card_id} Example request:
curl -X DELETE "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID/cards/$CARD_ID" \
  -H "Authorization: Bearer $ATLAS_TOKEN"
Returns 204 No Content.

Create a step

POST /test-runs/{run_id}/cards/{card_id}/steps Request body:
FieldRequiredTypeDescription
titleYesstringStep title (max 100 characters)
descriptionNostringStep description. Defaults to ""
step_typeNostringpassfail (default) or other configured types
orderNointegerDisplay order
Example request:
curl -X POST "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID/cards/$CARD_ID/steps" \
  -H "Authorization: Bearer $ATLAS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title": "Apply 13V to input rail"}'
Returns a step object with the same fields as the update step response.

Update a step

PATCH /test-runs/{run_id}/cards/{card_id}/steps/{step_id} Update step metadata or record an execution outcome. Request body:
FieldTypeDescription
titlestringStep title
descriptionstringStep description
execution_statusstringtodo, done, passed, passed_with_exception, failed
exceptionstringException note for passed_with_exception
started_atstringISO 8601 start time
ended_atstringISO 8601 end time
Example request:
curl -X PATCH "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID/cards/$CARD_ID/steps/$STEP_ID" \
  -H "Authorization: Bearer $ATLAS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"execution_status": "passed"}'
Response fields:
FieldTypeDescription
uuidstringStep identifier
titlestringStep title
descriptionstringStep description
orderintegerDisplay order
step_typestringStep type
execution_statusstringtodo, done, passed, passed_with_exception, failed
exceptionstringException note (if passed_with_exception)
started_atstringISO 8601 start time
ended_atstringISO 8601 end time
observationsarrayObservations recorded on this step
test_dataarrayData files linked to this step
issuesarrayIssues linked to this step
reportsarrayReport summaries linked to this step
created_atstringISO 8601 creation timestamp
updated_atstringISO 8601 last-update timestamp
Example response:
{
  "uuid": "e3f4a5b6-c7d8-9012-efab-456789012345",
  "title": "Apply 13V to input rail",
  "description": "",
  "order": 1,
  "step_type": "passfail",
  "execution_status": "passed",
  "exception": null,
  "started_at": null,
  "ended_at": null,
  "observations": [],
  "test_data": [],
  "issues": [],
  "reports": [],
  "created_at": "2026-04-13T11:04:00.000000",
  "updated_at": "2026-04-13T11:10:00.000000"
}

Delete a step

DELETE /test-runs/{run_id}/cards/{card_id}/steps/{step_id} Example request:
curl -X DELETE "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID/cards/$CARD_ID/steps/$STEP_ID" \
  -H "Authorization: Bearer $ATLAS_TOKEN"
Returns 204 No Content.

List reports

GET /test-runs/{run_id}/reports Example request:
curl "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID/reports" \
  -H "Authorization: Bearer $ATLAS_TOKEN"
Returns {"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:
curl "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID/reports/$REPORT_ID" \
  -H "Authorization: Bearer $ATLAS_TOKEN"
Returns a report object with the same fields as the create report response.

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:
FieldRequiredTypeDescription
scopeYesstringReport scope: run, card, or step
test_card_idConditionalUUIDRequired when scope is card or step
test_step_idConditionalUUIDRequired when scope is step
analysis_contextNostringFree-text guidance for the analysis. Defaults to ""
Example request:
curl -X POST "https://spacex.atlas.arenaphysica.com/api/v1/test-runs/$RUN_ID/reports" \
  -H "Authorization: Bearer $ATLAS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"scope": "run"}'
Response fields:
FieldTypeNullableDescription
uuidstringNoReport identifier
titlestringNoAuto-generated report title
scopestringNorun, card, or step
statusstringNopending, running, completed, failed, cancelled
contentstringNoFull report text (populated when completed)
summarystringNoShort summary (populated when completed)
issuesarrayNoIssues linked to this report
test_dataarrayNoData files analyzed
job_run_idstringYesBackground job that generated this report
created_bystringNoCreator email
created_atstringNoISO 8601 creation timestamp
Example response:
{
  "uuid": "d0e1f2a3-b4c5-6789-defa-890123456789",
  "title": "Motor Controller Acceptance Test – Run Analysis",
  "scope": "run",
  "status": "pending",
  "content": "",
  "summary": "",
  "issues": [],
  "test_data": [],
  "job_run_id": "e1f2a3b4-c5d6-7890-efab-901234567890",
  "created_by": "engineer@example.com",
  "created_at": "2026-04-13T11:05:00.000000"
}
Poll GET /test-runs/{run_id}/reports/{report_id} until status is completed.