curl -X GET "https://nunu.ai/api/v1/project/your-project-id/runs?state=completed&tags=nightly&bugs=true&page=0&page_size=10" \
-H "X-Api-Key: YOUR_API_TOKEN"
const response = await fetch(
"https://nunu.ai/api/v1/project/your-project-id/runs?state=completed&tags=nightly&bugs=true&page=0&page_size=10",
{
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
},
}
);
const data = await response.json();
import requests
import os
response = requests.get(
"https://nunu.ai/api/v1/project/your-project-id/runs",
headers={"X-Api-Key": os.environ["NUNU_API_TOKEN"]},
params={"state": "completed", "tags": "nightly", "bugs": True, "page": 0, "page_size": 10}
)
data = response.json()
{
"data": [
{
"job_id": "f80f6230-3a4f-431a-9d54-d11b867fed4e",
"multiplayer_run_id": "lkkg6t5612m",
"project_id": "test",
"state": "COMPLETED",
"result": "SUCCESS",
"bug_info": null,
"test": {
"id": "a5060a07-d386-4269-98ce-b33fb894201e",
"name": "sanity test",
"type": "verification"
},
"build": null,
"created_at": "2026-03-03T15:50:23.601012+00:00",
"started_at": "2026-03-03T15:50:23.601048+00:00",
"completed_at": "2026-03-03T15:54:24.261038+00:00",
"duration_ms": 240659.99,
"initiator": {
"type": "api",
"value": { "key_id": "7f028653-0e85-4c37-87be-c59976796155" }
},
"tags": ["nightly"],
"players": [
{
"id": "lkkg6t5612m-1",
"state": "COMPLETED",
"result": "SUCCESS",
"player_number": 1,
"test_name": "sanity test",
"composite_test_id": "58207dda-e2ca-44bd-a4e2-82b81b3ea8fa",
"step_count": 1,
"completed_step_count": 1,
"step_result_summary": {
"SUCCESS": 1
},
"platform": {
"kind": "android-native",
"config": {
"device": {
"name": "Pixel 8",
"os_version": "14"
}
}
}
}
]
}
],
"pagination": {
"page": 0,
"page_size": 10,
"total_count": 501,
"total_pages": 51
}
}
Runs
List Runs
Retrieve a paginated list of runs for your project.
GET
/
project
/
{projectId}
/
runs
curl -X GET "https://nunu.ai/api/v1/project/your-project-id/runs?state=completed&tags=nightly&bugs=true&page=0&page_size=10" \
-H "X-Api-Key: YOUR_API_TOKEN"
const response = await fetch(
"https://nunu.ai/api/v1/project/your-project-id/runs?state=completed&tags=nightly&bugs=true&page=0&page_size=10",
{
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
},
}
);
const data = await response.json();
import requests
import os
response = requests.get(
"https://nunu.ai/api/v1/project/your-project-id/runs",
headers={"X-Api-Key": os.environ["NUNU_API_TOKEN"]},
params={"state": "completed", "tags": "nightly", "bugs": True, "page": 0, "page_size": 10}
)
data = response.json()
{
"data": [
{
"job_id": "f80f6230-3a4f-431a-9d54-d11b867fed4e",
"multiplayer_run_id": "lkkg6t5612m",
"project_id": "test",
"state": "COMPLETED",
"result": "SUCCESS",
"bug_info": null,
"test": {
"id": "a5060a07-d386-4269-98ce-b33fb894201e",
"name": "sanity test",
"type": "verification"
},
"build": null,
"created_at": "2026-03-03T15:50:23.601012+00:00",
"started_at": "2026-03-03T15:50:23.601048+00:00",
"completed_at": "2026-03-03T15:54:24.261038+00:00",
"duration_ms": 240659.99,
"initiator": {
"type": "api",
"value": { "key_id": "7f028653-0e85-4c37-87be-c59976796155" }
},
"tags": ["nightly"],
"players": [
{
"id": "lkkg6t5612m-1",
"state": "COMPLETED",
"result": "SUCCESS",
"player_number": 1,
"test_name": "sanity test",
"composite_test_id": "58207dda-e2ca-44bd-a4e2-82b81b3ea8fa",
"step_count": 1,
"completed_step_count": 1,
"step_result_summary": {
"SUCCESS": 1
},
"platform": {
"kind": "android-native",
"config": {
"device": {
"name": "Pixel 8",
"os_version": "14"
}
}
}
}
]
}
],
"pagination": {
"page": 0,
"page_size": 10,
"total_count": 501,
"total_pages": 51
}
}
Permission Required:
project:read-runsQuery Parameters
string
default:"all"
Filter by state:
running, completed, or allstring
Filter by test ID
string
Filter by job ID
string
Filter by test plan execution ID
string
Filter by test type (e.g.,
verification)string
Filter by tags (comma-separated). All specified tags must match. Example:
tags=nightly,regressionboolean
Filter by runs that found bugs (
bugs=true returns runs where bug_info.bug_count > 0)integer
default:"0"
Page number (0-indexed)
integer
default:"20"
Results per page (1-100)
Response
Run[]
required
Array of run objects
object
required
Run Object
string
required
Unique identifier for the run (12 lowercase alphanumeric chars)
string
required
Job identifier that created this run
string
required
Project the run belongs to
string
required
Current state:
initializing, running, or completedstring
Result of the run, or
null if not completed:| Value | Meaning |
|---|---|
SUCCESS | The run completed; for verification tests, every check passed |
FAILED | Verdict: at least one verification check failed |
SKIPPED | Verdict: the test could not be executed and was skipped |
BLOCKED | Verdict: a precondition prevented the checks from being evaluated |
TIMEOUT | The run hit its time limit before finishing |
ERROR | The run failed for technical reasons (setup, infrastructure) |
STOPPED | The run was stopped before finishing (e.g. by a user) |
MAX_STEPS | Legacy: the agent ran out of steps (superseded by TIMEOUT) |
object
object
required
string
required
ISO 8601 timestamp when run was created
string
ISO 8601 timestamp when run started
string
ISO 8601 timestamp when run completed
integer
Run duration in milliseconds
object
required
Who/what started the run
string[]
Tags assigned to the run
Player[]
required
Individual player runs (for multiplayer tests)
curl -X GET "https://nunu.ai/api/v1/project/your-project-id/runs?state=completed&tags=nightly&bugs=true&page=0&page_size=10" \
-H "X-Api-Key: YOUR_API_TOKEN"
const response = await fetch(
"https://nunu.ai/api/v1/project/your-project-id/runs?state=completed&tags=nightly&bugs=true&page=0&page_size=10",
{
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
},
}
);
const data = await response.json();
import requests
import os
response = requests.get(
"https://nunu.ai/api/v1/project/your-project-id/runs",
headers={"X-Api-Key": os.environ["NUNU_API_TOKEN"]},
params={"state": "completed", "tags": "nightly", "bugs": True, "page": 0, "page_size": 10}
)
data = response.json()
{
"data": [
{
"job_id": "f80f6230-3a4f-431a-9d54-d11b867fed4e",
"multiplayer_run_id": "lkkg6t5612m",
"project_id": "test",
"state": "COMPLETED",
"result": "SUCCESS",
"bug_info": null,
"test": {
"id": "a5060a07-d386-4269-98ce-b33fb894201e",
"name": "sanity test",
"type": "verification"
},
"build": null,
"created_at": "2026-03-03T15:50:23.601012+00:00",
"started_at": "2026-03-03T15:50:23.601048+00:00",
"completed_at": "2026-03-03T15:54:24.261038+00:00",
"duration_ms": 240659.99,
"initiator": {
"type": "api",
"value": { "key_id": "7f028653-0e85-4c37-87be-c59976796155" }
},
"tags": ["nightly"],
"players": [
{
"id": "lkkg6t5612m-1",
"state": "COMPLETED",
"result": "SUCCESS",
"player_number": 1,
"test_name": "sanity test",
"composite_test_id": "58207dda-e2ca-44bd-a4e2-82b81b3ea8fa",
"step_count": 1,
"completed_step_count": 1,
"step_result_summary": {
"SUCCESS": 1
},
"platform": {
"kind": "android-native",
"config": {
"device": {
"name": "Pixel 8",
"os_version": "14"
}
}
}
}
]
}
],
"pagination": {
"page": 0,
"page_size": 10,
"total_count": 501,
"total_pages": 51
}
}
Authorizations
API key for authentication
Path Parameters
The project ID. You can copy it from the project settings page or the project URL in the dashboard.
Query Parameters
Filter by state
Available options:
running, completed, all Filter by test ID
Filter by job ID
Filter by test plan execution ID
Filter by test type (e.g., verification)
Filter by tags (comma-separated). All specified tags must match.
Filter by runs that found bugs (true returns runs where bug_count > 0)
Page number (0-indexed)
Results per page (1-100)
Required range:
1 <= x <= 100