curl -X GET "https://nunu.ai/api/v1/project/your-project-id/runs/lkkg6t5612m/bugs" \
-H "X-Api-Key: YOUR_API_TOKEN"
const runId = "lkkg6t5612m";
const response = await fetch(`https://nunu.ai/api/v1/project/your-project-id/runs/${runId}/bugs`, {
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
},
});
const data = await response.json();
import requests
import os
run_id = "lkkg6t5612m"
response = requests.get(
f"https://nunu.ai/api/v1/project/your-project-id/runs/{run_id}/bugs",
headers={"X-Api-Key": os.environ["NUNU_API_TOKEN"]}
)
data = response.json()
{
"data": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"bug_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Button not responding",
"description": "The 'Start Game' button does not respond to taps after returning from settings menu.",
"category": "ui",
"severity": "high",
"confidence": "high",
"reproduction_steps": "1. Open app\n2. Go to settings\n3. Return to main menu\n4. Try to tap Start Game button",
"player_number": 0,
"test_step": 2,
"turn": 15,
"detected_at": "2025-01-12T10:08:30Z",
"details": {
"screenshot_url": "https://bouncer.nunu.ai/artifacts/...",
"element_id": "btn_start_game"
}
}
],
"pagination": {
"page": 0,
"page_size": 1,
"total_count": 1,
"total_pages": 1
}
}
Runs
List Run Bugs
Retrieve all bugs detected during a specific run.
GET
/
project
/
{projectId}
/
runs
/
{runId}
/
bugs
curl -X GET "https://nunu.ai/api/v1/project/your-project-id/runs/lkkg6t5612m/bugs" \
-H "X-Api-Key: YOUR_API_TOKEN"
const runId = "lkkg6t5612m";
const response = await fetch(`https://nunu.ai/api/v1/project/your-project-id/runs/${runId}/bugs`, {
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
},
});
const data = await response.json();
import requests
import os
run_id = "lkkg6t5612m"
response = requests.get(
f"https://nunu.ai/api/v1/project/your-project-id/runs/{run_id}/bugs",
headers={"X-Api-Key": os.environ["NUNU_API_TOKEN"]}
)
data = response.json()
{
"data": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"bug_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Button not responding",
"description": "The 'Start Game' button does not respond to taps after returning from settings menu.",
"category": "ui",
"severity": "high",
"confidence": "high",
"reproduction_steps": "1. Open app\n2. Go to settings\n3. Return to main menu\n4. Try to tap Start Game button",
"player_number": 0,
"test_step": 2,
"turn": 15,
"detected_at": "2025-01-12T10:08:30Z",
"details": {
"screenshot_url": "https://bouncer.nunu.ai/artifacts/...",
"element_id": "btn_start_game"
}
}
],
"pagination": {
"page": 0,
"page_size": 1,
"total_count": 1,
"total_pages": 1
}
}
Permission Required:
project:read-runsPath Parameters
string
required
The multiplayer run ID (12 lowercase alphanumeric characters)
Response
BugOccurrence[]
required
Array of bug occurrences found during the run
object
required
Pagination metadata (
page, page_size, total_count, total_pages).
Bug occurrences per run are naturally bounded, so the response always
returns the full list in a single page — the envelope is kept to match the
shape of other list routes.Bug Occurrence Object
string
required
Unique occurrence ID
string
required
Bug identifier (same bug across runs shares this ID)
string
required
Short bug title
string
required
Detailed description of the bug
string
required
Bug category:
ui, gameplay, performance, crash, audio, visualstring
required
Severity level:
low, medium, high, criticalstring
required
Detection confidence:
low, medium, highstring
required
Steps to reproduce the bug
integer
required
Which player encountered the bug (0-indexed)
integer
required
Test step where bug was detected
integer
required
Agent turn number when detected
string
required
ISO 8601 timestamp when bug was detected
object
Additional bug-specific details (screenshots, element IDs, etc.)
Severity Levels
Critical
Critical
Blocks core functionality or causes crashes. Requires immediate attention.
High
High
Major feature broken or significantly impaired. Should be fixed before release.
Medium
Medium
Feature works but with noticeable issues. Should be addressed in normal development cycle.
Low
Low
Minor issues with minimal impact. Can be fixed when convenient.
curl -X GET "https://nunu.ai/api/v1/project/your-project-id/runs/lkkg6t5612m/bugs" \
-H "X-Api-Key: YOUR_API_TOKEN"
const runId = "lkkg6t5612m";
const response = await fetch(`https://nunu.ai/api/v1/project/your-project-id/runs/${runId}/bugs`, {
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
},
});
const data = await response.json();
import requests
import os
run_id = "lkkg6t5612m"
response = requests.get(
f"https://nunu.ai/api/v1/project/your-project-id/runs/{run_id}/bugs",
headers={"X-Api-Key": os.environ["NUNU_API_TOKEN"]}
)
data = response.json()
{
"data": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"bug_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Button not responding",
"description": "The 'Start Game' button does not respond to taps after returning from settings menu.",
"category": "ui",
"severity": "high",
"confidence": "high",
"reproduction_steps": "1. Open app\n2. Go to settings\n3. Return to main menu\n4. Try to tap Start Game button",
"player_number": 0,
"test_step": 2,
"turn": 15,
"detected_at": "2025-01-12T10:08:30Z",
"details": {
"screenshot_url": "https://bouncer.nunu.ai/artifacts/...",
"element_id": "btn_start_game"
}
}
],
"pagination": {
"page": 0,
"page_size": 1,
"total_count": 1,
"total_pages": 1
}
}
Aggregate Bugs Across Runs
Here’s an example of fetching bugs from multiple recent runs:import requests
import os
API_TOKEN = os.environ["NUNU_API_TOKEN"]
PROJECT_ID = os.environ["NUNU_PROJECT_ID"]
BASE_URL = f"https://nunu.ai/api/v1/project/{PROJECT_ID}"
headers = {"X-Api-Key": API_TOKEN}
def get_recent_bugs(limit=10):
"""Fetch bugs from the most recent completed runs."""
all_bugs = []
# Get recent completed runs
response = requests.get(
f"{BASE_URL}/runs",
headers=headers,
params={"state": "completed", "page_size": limit}
)
runs = response.json()["data"]
# Fetch bugs for each run
for run in runs:
run_id = run["multiplayer_run_id"]
bugs_response = requests.get(
f"{BASE_URL}/runs/{run_id}/bugs",
headers=headers
)
bugs_data = bugs_response.json()
for bug in bugs_data["data"]:
all_bugs.append({
"run_id": run_id,
"test_name": run["test"]["name"],
**bug
})
return all_bugs
bugs = get_recent_bugs()
for bug in bugs:
print(f"[{bug['severity'].upper()}] {bug['title']} - {bug['test_name']}")
const API_TOKEN = process.env.NUNU_API_TOKEN;
const PROJECT_ID = process.env.NUNU_PROJECT_ID;
const BASE_URL = `https://nunu.ai/api/v1/project/${PROJECT_ID}`;
async function getRecentBugs(limit = 10) {
const headers = { "X-Api-Key": API_TOKEN };
const runsResponse = await fetch(
`${BASE_URL}/runs?state=completed&page_size=${limit}`,
{ headers }
);
const { data: runs } = await runsResponse.json();
const allBugs = [];
for (const run of runs) {
const bugsResponse = await fetch(
`${BASE_URL}/runs/${run.multiplayer_run_id}/bugs`,
{ headers }
);
const { data: bugOccurrences } = await bugsResponse.json();
for (const bug of bugOccurrences) {
allBugs.push({
run_id: run.multiplayer_run_id,
test_name: run.test.name,
...bug
});
}
}
return allBugs;
}
Authorizations
API key for authentication
Path Parameters
The multiplayer run ID
The project ID. You can copy it from the project settings page or the project URL in the dashboard.
Response
Successful response
Bugs detected during a multiplayer run. Bug occurrences per run are naturally bounded, so the response always returns the full list in a single page; the pagination envelope is kept to match the shape of other list routes.