Skip to main content

qa-clone API (0.2.0)

Download OpenAPI specification:Download

REST API for qa-clone (testsbot.com). All JSON error responses use the envelope { ok: false, error }; success bodies are either the documented resource shape or { ok: true, data? }. The /projects* and /runs* paths of this document are generated from the zod-openapi route definitions in the API source; the remaining paths are maintained by hand and drift-gated in CI (see docs/runbooks/openapi-drift.md).

Health

Readiness probe

Reports whether the API can serve database-backed traffic. Answers 200 only when the database responds; 503 when it does not, with ok in lockstep with the HTTP status. This is the endpoint for uptime monitoring and the status page — use /live for orchestrator probes.

Responses

Response samples

Content type
application/json
{
  • "db_ok": true,
  • "ok": true
}

Liveness probe

Reports only that the process is up and serving HTTP — it performs no database call and stays 200 during a database outage. This is what the Fly http_service check polls; probing the DB-aware /health there would let a database fault evict the machine from the load balancer.

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Projects

List projects

All projects of the active org, newest first. Soft-deleted projects are excluded.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a project

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
app_id
string <uuid>
base_url
required
string <uri>
name
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "app_id": "affd1d10-9538-4fc8-9e0b-4594a28c1335",
  • "base_url": "http://example.com",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "appId": "28c365d5-df94-4a54-8217-3ce51d068868",
  • "baseUrl": "http://example.com",
  • "captchaSolvingEnabled": true,
  • "crawlCron": "string",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "deletedAt": "2019-08-24T14:15:22Z",
  • "devicePreset": {
    },
  • "generateGapTests": true,
  • "githubInstallationId": "string",
  • "githubRepo": "string",
  • "healAutoApplyThreshold": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "string",
  • "orgId": "string",
  • "pageCount": 0,
  • "prFeedbackEmojiReactionEnabled": true,
  • "prFeedbackReviewContextChars": 0,
  • "prFeedbackVerdictEnabled": true,
  • "runBudgetMinutes": 0,
  • "runCount": 0,
  • "stateLifetimeMinutes": 0,
  • "stepTimeoutSeconds": 0,
  • "testDataRetentionDays": 0,
  • "testDataRetentionPolicy": "30d",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "vercelProtectionBypassConfigured": true
}

Soft-delete a project (admin)

Requires the owner|admin role. Sets deleted_at; run/artifact history stays intact.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Get a project

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "appId": "28c365d5-df94-4a54-8217-3ce51d068868",
  • "baseUrl": "http://example.com",
  • "captchaSolvingEnabled": true,
  • "crawlCron": "string",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "deletedAt": "2019-08-24T14:15:22Z",
  • "devicePreset": {
    },
  • "generateGapTests": true,
  • "githubInstallationId": "string",
  • "githubRepo": "string",
  • "healAutoApplyThreshold": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "string",
  • "orgId": "string",
  • "pageCount": 0,
  • "prFeedbackEmojiReactionEnabled": true,
  • "prFeedbackReviewContextChars": 0,
  • "prFeedbackVerdictEnabled": true,
  • "runBudgetMinutes": 0,
  • "runCount": 0,
  • "stateLifetimeMinutes": 0,
  • "stepTimeoutSeconds": 0,
  • "testDataRetentionDays": 0,
  • "testDataRetentionPolicy": "30d",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "vercelProtectionBypassConfigured": true
}

Update a project

Partial update; at least one field is required. run_budget_minutes above the org's plan cap answers 402.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
app_id
string or null <uuid>
base_url
string <uri>
captcha_solving_enabled
boolean
crawl_cron
string or null non-empty
object or object or (any or null)
generate_gap_tests
boolean
heal_auto_apply_threshold
number or null [ 0 .. 1 ]
name
string non-empty
pr_feedback_emoji_reaction_enabled
boolean
pr_feedback_review_context_chars
integer or null >= 50
pr_feedback_verdict_enabled
boolean
run_budget_minutes
integer or null >= 1
state_lifetime_minutes
integer or null [ 5 .. 10080 ]
step_timeout_seconds
integer or null [ 5 .. 120 ]
test_data_retention_days
integer or null [ 1 .. 3650 ]
test_data_retention_policy
string
Enum: "30d" "90d" "custom" "default"
vercel_protection_bypass_secret
string or null non-empty

Responses

Request samples

Content type
application/json
{
  • "app_id": "affd1d10-9538-4fc8-9e0b-4594a28c1335",
  • "base_url": "http://example.com",
  • "captcha_solving_enabled": true,
  • "crawl_cron": "string",
  • "device_preset": {
    },
  • "generate_gap_tests": true,
  • "heal_auto_apply_threshold": 1,
  • "name": "string",
  • "pr_feedback_emoji_reaction_enabled": true,
  • "pr_feedback_review_context_chars": 50,
  • "pr_feedback_verdict_enabled": true,
  • "run_budget_minutes": 1,
  • "state_lifetime_minutes": 5,
  • "step_timeout_seconds": 5,
  • "test_data_retention_days": 1,
  • "test_data_retention_policy": "30d",
  • "vercel_protection_bypass_secret": "string"
}

Response samples

Content type
application/json
{
  • "appId": "28c365d5-df94-4a54-8217-3ce51d068868",
  • "baseUrl": "http://example.com",
  • "captchaSolvingEnabled": true,
  • "crawlCron": "string",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "deletedAt": "2019-08-24T14:15:22Z",
  • "devicePreset": {
    },
  • "generateGapTests": true,
  • "githubInstallationId": "string",
  • "githubRepo": "string",
  • "healAutoApplyThreshold": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "string",
  • "orgId": "string",
  • "pageCount": 0,
  • "prFeedbackEmojiReactionEnabled": true,
  • "prFeedbackReviewContextChars": 0,
  • "prFeedbackVerdictEnabled": true,
  • "runBudgetMinutes": 0,
  • "runCount": 0,
  • "stateLifetimeMinutes": 0,
  • "stepTimeoutSeconds": 0,
  • "testDataRetentionDays": 0,
  • "testDataRetentionPolicy": "30d",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "vercelProtectionBypassConfigured": true
}

List crawl sessions

The project's crawl history, newest first (limit 20). Replaces guessing crawl completion from page counts — status is the real lifecycle.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Start a crawl

Enqueues a BFS crawl of the project's base URL with the background worker. The body is optional — an empty body starts an anonymous default crawl.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
optional
auth_test_case_id
string <uuid>
intent
string [ 3 .. 500 ] characters
max_actions
integer [ 1 .. 1000 ]
max_depth
integer [ 1 .. 10 ]
max_pages
integer [ 1 .. 1000 ]

Responses

Request samples

Content type
application/json
{
  • "auth_test_case_id": "11bfa731-3ee6-401d-a3f1-7994c29dc81c",
  • "intent": "string",
  • "max_actions": 1,
  • "max_depth": 1,
  • "max_pages": 1
}

Response samples

Content type
application/json
{
  • "crawl_id": "c9eee371-0b50-4a83-baff-95c2f0e36a00"
}

Cancel in-flight crawls

Stops every running crawl of the project at its next step boundary.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Project usage this month

Run count and LLM cost of the project since the start of the current UTC calendar month, plus the configured daily LLM cap. Browser-agent costs (Stagehand act()) are not included.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "dailyCapUsd": 0,
  • "llmCostUsdThisMonth": 0,
  • "runsThisMonth": 0
}

Test Cases

List test cases of a project

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
query Parameters
offset
integer >= 0
Default: 0
limit
integer [ 1 .. 100 ]
Default: 20
include_archived
boolean
Default: false
owner
string

Owner filter (GAP-057): a Clerk user id (created_by) or the literal "system" (created_by IS NULL). Absent ⇒ all owners.

group
string

Group filter (GAP-002): a test-group uuid (group_id) or the literal "ungrouped" (group_id IS NULL). Absent ⇒ all groups.

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "limit": 0,
  • "offset": 0,
  • "total": 0
}

Generate test cases with AI

Generates up to count DSL test cases for the project's base URL (or an explicit url) from a natural-language goal and persists them as drafts.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
count
integer [ 1 .. 5 ]
Default: 1
goal
required
string [ 3 .. 2000 ] characters
url
string <uri>

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "items": [
    ]
}

Create a test case

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
name
required
string non-empty
required
Array of objects (TestStep)
tags
Array of strings
Array of objects (TestVar)
parent_id
string <uuid>
project_id
required
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "steps": [
    ],
  • "tags": [
    ],
  • "vars": [
    ],
  • "parent_id": "1c6ca187-e61f-4301-8dcb-0e9749e89eef",
  • "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9"
}

Response samples

Content type
application/json
{
  • "createdAt": "2019-08-24T14:15:22Z",
  • "createdBy": "string",
  • "dependsOnId": "cd8cc4c3-8195-4c5b-b408-6c93dab2991a",
  • "dsl": { },
  • "flakyScore": "string",
  • "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "string",
  • "parentId": "70850378-7d3c-4f45-91b7-942d4dfbbd43",
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "quarantined": true,
  • "status": "draft",
  • "tags": [
    ]
}

Archive a test case

Soft-delete — sets status: archived; run history keeps its FK.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Get a test case

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "createdAt": "2019-08-24T14:15:22Z",
  • "createdBy": "string",
  • "dependsOnId": "cd8cc4c3-8195-4c5b-b408-6c93dab2991a",
  • "dsl": { },
  • "flakyScore": "string",
  • "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "string",
  • "parentId": "70850378-7d3c-4f45-91b7-942d4dfbbd43",
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "quarantined": true,
  • "status": "draft",
  • "tags": [
    ]
}

Update a test case

Partial update; at least one field is required. depends_on_id is validated against same-project membership and cycle freedom; null clears the dependency.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
non-empty
depends_on_id
string or null <uuid>
object

TestCaseDsl without the row-level name (steps, vars, tags)

name
string non-empty
status
string
Enum: "draft" "active" "archived"
tags
Array of strings

Responses

Request samples

Content type
application/json
{
  • "depends_on_id": "e79ffb3f-428a-4576-b513-cbe989c3463c",
  • "dsl": {
    },
  • "name": "string",
  • "status": "draft",
  • "tags": [
    ]
}

Response samples

Content type
application/json
{
  • "createdAt": "2019-08-24T14:15:22Z",
  • "createdBy": "string",
  • "dependsOnId": "cd8cc4c3-8195-4c5b-b408-6c93dab2991a",
  • "dsl": { },
  • "flakyScore": "string",
  • "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "string",
  • "parentId": "70850378-7d3c-4f45-91b7-942d4dfbbd43",
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "quarantined": true,
  • "status": "draft",
  • "tags": [
    ]
}

Duplicate a test case

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "createdAt": "2019-08-24T14:15:22Z",
  • "createdBy": "string",
  • "dependsOnId": "cd8cc4c3-8195-4c5b-b408-6c93dab2991a",
  • "dsl": { },
  • "flakyScore": "string",
  • "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "string",
  • "parentId": "70850378-7d3c-4f45-91b7-942d4dfbbd43",
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "quarantined": true,
  • "status": "draft",
  • "tags": [
    ]
}

Quarantine a flaky test case

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Refine a test case with AI (proposal only)

Regenerates the steps from the persisted goal/expected result (P5-W23-T03) and/or an ad-hoc instruction. Returns the current and the proposed DSL WITHOUT persisting anything — accepting happens via PATCH /test-cases/{id} with the proposed dsl.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
optional
instruction
string [ 3 .. 1000 ] characters

Optional revision instruction in natural language.

Responses

Request samples

Content type
application/json
{
  • "instruction": "string"
}

Response samples

Content type
application/json
{
  • "current": {
    },
  • "proposed": {
    }
}

List revisions of a test case

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
query Parameters
offset
integer >= 0
Default: 0
limit
integer [ 1 .. 100 ]
Default: 20

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "limit": 0,
  • "offset": 0,
  • "total": 0
}

Lift the quarantine of a test case

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Runs

List runs

Paginated run history, newest first; filterable by project, test case, plan run, status, result (passed|failed|skipped), owner (Clerk user id or 'system') and a case-insensitive name search (q).

Authorizations:
bearerAuthapiKeyAuth
query Parameters
projectId
string <uuid>
testCaseId
string <uuid>
planRunId
string <uuid>
deviceMatrixId
string <uuid>
status
string
Enum: "queued" "running" "passed" "failed" "error" "cancelled" "skipped"
result
string
Enum: "passed" "failed" "skipped"
owner
string non-empty
q
string [ 1 .. 200 ] characters
limit
integer [ 1 .. 100 ]
Default: 20
offset
integer or null >= 0
Default: 0

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "limit": 0,
  • "offset": 0,
  • "total": 0
}

Trigger a test run

Inserts a queued run for the test case and enqueues it with the background worker.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
object or object
Array of objects or objects [ 1 .. 4 ] items
environment_id
string <uuid>
model_tier
string
Enum: "fast" "thorough"
test_case_id
required
string <uuid>
Array of objects

Responses

Request samples

Content type
application/json
{
  • "device_preset": {
    },
  • "device_presets": [
    ],
  • "environment_id": "40ef0e48-a11f-4963-a229-e396c9f7e7c4",
  • "model_tier": "fast",
  • "test_case_id": "738e7d5d-48c4-4b50-859a-47ff022bef7f",
  • "vars": [
    ]
}

Response samples

Content type
application/json
{
  • "device_matrix_id": "42f61057-1e60-4145-bc66-63ac8f25c3ff",
  • "run_id": "dded282c-8ebd-44cf-8ba5-9a234973d1ec"
}

List run owners

Distinct owners of the org's runs (for the run-list owner filter): one entry per Clerk user id plus a single { id: null } System entry when at least one system-triggered run exists.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "items": [
    ]
}

Get a run

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "agentSteps": [
    ],
  • "artifacts": [
    ],
  • "costUsd": "string",
  • "deviceMatrixId": "string",
  • "devicePreset": {
    },
  • "downloadResults": [
    ],
  • "endedAt": "2019-08-24T14:15:22Z",
  • "environmentId": "string",
  • "error": "string",
  • "exploratoryFindings": [
    ],
  • "failureClass": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kind": "string",
  • "liveViewUrl": "string",
  • "modelTier": {
    },
  • "outputValues": {
    },
  • "planRunId": "string",
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "startedAt": "2019-08-24T14:15:22Z",
  • "status": "queued",
  • "stepResults": [
    ],
  • "testCase": {
    },
  • "testCaseId": "002c56e7-6058-4022-8bc6-a15202014bf1",
  • "vars": [
    ],
  • "verdict": {
    }
}

Cancel a run

Requests cancellation of a queued or running run via the background worker.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

List a run's received test-inbox emails

Mails delivered to the run's system-managed inbox addresses (text view only), newest first.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 0
}

Stream live run events (SSE)

Server-sent events: status on every status change, step per completed DSL step, terminal done. An unknown run yields a single error event.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Heals

Approve a heal suggestion (admin)

Owner|admin only. Applies the suggested selector to the test-case DSL and dispatches a verification run.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Reject a heal suggestion (admin)

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

List heal events of a run

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "items": [
    ]
}

Metrics

Heal metrics of the org

Authorizations:
bearerAuthapiKeyAuth
query Parameters
window
string
Default: "7d"
Enum: "7d" "30d"

Responses

Response samples

Content type
application/json
{
  • "data": {
    },
  • "ok": true
}

Run execution metrics of the org as a daily time series

Pass rate, p50/p95 duration and cost per calendar day plus whole-window totals. Days without runs are zero-filled so the series always spans the window; percentile durations only consider finished runs (ended_at set) and are null for days without one.

Authorizations:
bearerAuthapiKeyAuth
query Parameters
window
string
Default: "7d"
Enum: "7d" "30d"

Responses

Response samples

Content type
application/json
{
  • "data": {
    },
  • "ok": true
}

Test Plans

Get a plan run (CI polling contract)

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "counts": {
    },
  • "created_at": "2019-08-24T14:15:22Z",
  • "parent_plan_run_id": "f2fdae15-9bed-4c3a-9bc2-932348c73555",
  • "plan_id": "00713021-9aea-41da-9a88-87760c08fa72",
  • "plan_run_id": "ff73d59b-fc5c-4e85-875b-517d79259fcf",
  • "result": "passed",
  • "run_mode": "ci",
  • "status": "running",
  • "trigger": "manual"
}

Rerun failed (or all) member cases

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
query Parameters
scope
string
Default: "failed"
Enum: "failed" "all"

Responses

Response samples

Content type
application/json
{
  • "plan_run_id": "ff73d59b-fc5c-4e85-875b-517d79259fcf"
}

List test plans of a project

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
query Parameters
owner
string

Owner filter (GAP-057): a Clerk user id (created_by) or the literal "system" (created_by IS NULL). Absent ⇒ all owners.

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 0
}

Create a test plan

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
cron
string or null
enabled
boolean
Default: true
environment_id
string or null <uuid>
name
required
string non-empty
run_mode
string
Default: "nightly"
Enum: "ci" "nightly"
tags
Array of strings[ items non-empty ]
test_case_ids
Array of strings <uuid> [ items <uuid > ]

Responses

Request samples

Content type
application/json
{
  • "cron": "string",
  • "enabled": true,
  • "environment_id": "40ef0e48-a11f-4963-a229-e396c9f7e7c4",
  • "name": "string",
  • "run_mode": "ci",
  • "tags": [
    ],
  • "test_case_ids": [
    ]
}

Response samples

Content type
application/json
{
  • "createdAt": "2019-08-24T14:15:22Z",
  • "createdBy": "string",
  • "cron": "string",
  • "enabled": true,
  • "environmentId": "19f5cc2e-7657-437a-9268-83cd3d563563",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "lastRunAt": "2019-08-24T14:15:22Z",
  • "name": "string",
  • "nextRunAt": "2019-08-24T14:15:22Z",
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "runMode": "ci",
  • "tags": [
    ]
}

Delete a test plan

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Get a test plan

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "createdAt": "2019-08-24T14:15:22Z",
  • "createdBy": "string",
  • "cron": "string",
  • "enabled": true,
  • "environmentId": "19f5cc2e-7657-437a-9268-83cd3d563563",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "lastRunAt": "2019-08-24T14:15:22Z",
  • "name": "string",
  • "nextRunAt": "2019-08-24T14:15:22Z",
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "runMode": "ci",
  • "tags": [
    ],
  • "explicitMembers": [
    ],
  • "resolvedMemberIds": [
    ]
}

Update a test plan

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
non-empty
cron
string or null
enabled
boolean
environment_id
string or null <uuid>
name
string non-empty
run_mode
string
Enum: "ci" "nightly"
tags
Array of strings[ items non-empty ]
test_case_ids
Array of strings <uuid> [ items <uuid > ]

Responses

Request samples

Content type
application/json
{
  • "cron": "string",
  • "enabled": true,
  • "environment_id": "40ef0e48-a11f-4963-a229-e396c9f7e7c4",
  • "name": "string",
  • "run_mode": "ci",
  • "tags": [
    ],
  • "test_case_ids": [
    ]
}

Response samples

Content type
application/json
{
  • "createdAt": "2019-08-24T14:15:22Z",
  • "createdBy": "string",
  • "cron": "string",
  • "enabled": true,
  • "environmentId": "19f5cc2e-7657-437a-9268-83cd3d563563",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "lastRunAt": "2019-08-24T14:15:22Z",
  • "name": "string",
  • "nextRunAt": "2019-08-24T14:15:22Z",
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "runMode": "ci",
  • "tags": [
    ]
}

List runs of a test plan

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
query Parameters
offset
integer >= 0
Default: 0
limit
integer [ 1 .. 100 ]
Default: 20

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 0
}

Run a test plan now

Dispatches the plan's resolved member cases as individual runs grouped under one plan run. Gated by the org's monthly run budget (402).

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "plan_run_id": "ff73d59b-fc5c-4e85-875b-517d79259fcf"
}

Test Groups

List a project's root test groups (or a parent's direct children)

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
query Parameters
parent
string <uuid>

A test-group uuid lists that group's direct children; absent lists the project's root groups (parent_group_id IS NULL).

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 0
}

Create a test group (admin only)

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
name
required
string [ 1 .. 200 ] characters
parent_group_id
string or null <uuid>

Nest under this group; absent/null = a root group.

position
integer >= 0
Default: 0

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "parent_group_id": "fe5e9949-7da4-4318-86fb-b3b64b2df380",
  • "position": 0
}

Response samples

Content type
application/json
{
  • "createdAt": "2019-08-24T14:15:22Z",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "string",
  • "parentGroupId": "e5e63afb-859b-44be-b014-ce932bd8bf74",
  • "position": 0,
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8"
}

The project's nested group tree with per-group case counts

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "tree": [
    ]
}

Delete a test group (admin only)

Deletes the group and its whole subtree (cascade). Member test cases are orphaned (group_id set to NULL), never deleted.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Update a test group — rename, re-parent or reorder (admin only)

Partial update; at least one field is required. parent_group_id is validated against same-project membership and cycle freedom (a group may not be re-parented under itself or one of its descendants); null re-parents the group to the root.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
non-empty
name
string [ 1 .. 200 ] characters
parent_group_id
string or null <uuid>

Re-parent under this group; null re-parents to the root.

position
integer >= 0

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "parent_group_id": "fe5e9949-7da4-4318-86fb-b3b64b2df380",
  • "position": 0
}

Response samples

Content type
application/json
{
  • "createdAt": "2019-08-24T14:15:22Z",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "string",
  • "parentGroupId": "e5e63afb-859b-44be-b014-ce932bd8bf74",
  • "position": 0,
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8"
}

Test Items

List the caller's owned test cases and plans ("My items")

The caller's own test cases AND test plans across the whole org, newest first, paginated. The owner is always the verified caller — there is no cross-user view, so this route takes no owner parameter.

Authorizations:
bearerAuthapiKeyAuth
query Parameters
offset
integer >= 0
Default: 0
limit
integer [ 1 .. 100 ]
Default: 20

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "limit": 0,
  • "offset": 0,
  • "total": 0
}

Environments

Delete an environment

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Update an environment

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
non-empty
base_url
string <uri>
object
Array of objects (TestVar)
is_production
boolean
kind
string
Enum: "standard" "preview"
name
string non-empty

Responses

Request samples

Content type
application/json
{
  • "base_url": "http://example.com",
  • "default_headers": {
    },
  • "default_vars": [
    ],
  • "is_production": true,
  • "kind": "standard",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "baseUrl": "http://example.com",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "defaultHeaders": {
    },
  • "defaultVars": [
    ],
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "isProduction": true,
  • "kind": "standard",
  • "name": "string",
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8"
}

List environments of a project

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 0
}

Create an environment

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
base_url
required
string <uri>
object
Array of objects (TestVar)
is_production
boolean
Default: false
kind
string
Default: "standard"
Enum: "standard" "preview"
name
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "base_url": "http://example.com",
  • "default_headers": {
    },
  • "default_vars": [
    ],
  • "is_production": false,
  • "kind": "standard",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "baseUrl": "http://example.com",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "defaultHeaders": {
    },
  • "defaultVars": [
    ],
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "isProduction": true,
  • "kind": "standard",
  • "name": "string",
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8"
}

Remote Tunnels

List a project's registered remote tunnels

Tunnels map a developer's local port to a public tunnel URL exposed by an EXTERNAL transport (ngrok / cloudflared / localtunnel). The platform only stores the mapping; a run targets the tunnel URL as its effective base.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 0
}

Register a remote tunnel for a project (admin only)

Stores a (local_port → public tunnel_url) mapping. The actual tunnel process is external — the platform never establishes it. project_id in the body must match the path project.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
expires_at
string <date-time>
local_port
required
integer [ 1 .. 65535 ]
project_id
required
string <uuid>
tunnel_url
required
string <uri>

Responses

Request samples

Content type
application/json
{
  • "expires_at": "2019-08-24T14:15:22Z",
  • "local_port": 1,
  • "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
  • "tunnel_url": "http://example.com"
}

Response samples

Content type
application/json
{
  • "createdAt": "2019-08-24T14:15:22Z",
  • "createdBy": "string",
  • "expiresAt": "2019-08-24T14:15:22Z",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "localPort": 1,
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "status": "active",
  • "tunnelUrl": "http://example.com"
}

Delete a remote tunnel (admin only)

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Update a remote tunnel's lifecycle status (admin only)

Flip the status (active → revoked/expired). The port and URL are immutable once registered — re-register to change them.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
status
required
string
Enum: "active" "expired" "revoked"

Responses

Request samples

Content type
application/json
{
  • "status": "active"
}

Response samples

Content type
application/json
{
  • "createdAt": "2019-08-24T14:15:22Z",
  • "createdBy": "string",
  • "expiresAt": "2019-08-24T14:15:22Z",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "localPort": 1,
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "status": "active",
  • "tunnelUrl": "http://example.com"
}

Configs

Delete a config

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Update a config

data/overrides are validated against the STORED row's type. A secret field echoing the mask *** keeps the stored value.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
non-empty
data
object
name
string non-empty
overrides
object

Per-environment override blocks keyed by environment id.

Responses

Request samples

Content type
application/json
{
  • "data": { },
  • "name": "string",
  • "overrides": { }
}

Response samples

Content type
application/json
{
  • "createdAt": "2019-08-24T14:15:22Z",
  • "data": { },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "string",
  • "overrides": { },
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "type": "credentials",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

List configs of a project

Secret fields inside data and overrides are masked as ***.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 0
}

Create a config

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
data
required
object

Shape depends on type — credentials {username, password}, credentials_totp {username, password, totp_secret}, email {address, password?}, file {file_name, url?, r2_key?, content_type?} (at least one of url/r2_key; r2_key must live under configs/<projectId>/).

name
required
string non-empty
type
required
string
Enum: "credentials" "credentials_totp" "email" "file"

Responses

Request samples

Content type
application/json
{
  • "data": { },
  • "name": "string",
  • "type": "credentials"
}

Response samples

Content type
application/json
{
  • "createdAt": "2019-08-24T14:15:22Z",
  • "data": { },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "string",
  • "overrides": { },
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "type": "credentials",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Mint a presigned upload URL for a file config

Returns a short-lived presigned PUT URL plus the r2_key (configs/<projectId>/<uuid>/<file_name>) to persist on a file config after the client uploaded the file directly to storage. size_bytes is validated against the 25 MB limit.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
content_type
required
string non-empty
file_name
required
string non-empty
size_bytes
required
integer >= 1

Responses

Request samples

Content type
application/json
{
  • "content_type": "string",
  • "file_name": "string",
  • "size_bytes": 1
}

Response samples

Content type
application/json
{
  • "expires_in": 0,
  • "r2_key": "string",
  • "upload_url": "string"
}

API Keys

List API keys of the org (admin)

Includes revoked keys; never the hash or plaintext.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "ok": true
}

Create an API key (admin)

The plaintext key (tb_live_…) is embedded in THIS response only — afterwards it is unrecoverable by design.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
name
required
string [ 1 .. 200 ] characters
project_id
string <uuid>
scope
required
string
Enum: "read" "read_write"

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
  • "scope": "read"
}

Response samples

Content type
application/json
{
  • "data": {
    },
  • "ok": true
}

Revoke an API key (admin)

Sets revoked_at (idempotent) — no hard delete.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Webhooks

List outbound webhooks (admin)

The HMAC secret is masked as *** on every read.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 0
}

Create an outbound webhook (admin)

The HMAC secret (whsec_…) is generated server-side and returned in THIS response only; every later read masks it.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
events
required
Array of strings non-empty
Items Enum: "run.completed" "crawl.completed"
project_id
string <uuid>
url
required
string <uri>

Responses

Request samples

Content type
application/json
{
  • "events": [
    ],
  • "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
}

Response samples

Content type
application/json
{
  • "active": true,
  • "createdAt": "2019-08-24T14:15:22Z",
  • "events": [
    ],
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "secret": "string",
}

Delete an outbound webhook (admin)

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Update an outbound webhook (admin)

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
active
boolean
events
Array of strings non-empty
Items Enum: "run.completed" "crawl.completed"
url
string <uri>

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "active": true,
  • "createdAt": "2019-08-24T14:15:22Z",
  • "events": [
    ],
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "secret": "string",
}

Integrations

Integration status of the org

Authorizations:
bearerAuthapiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "slack": {
    }
}

Disconnect Slack (admin)

Idempotent — disconnecting an already-disconnected org is ok.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Slack OAuth callback

Authorizations:
bearerAuthapiKeyAuth
query Parameters
code
required
string
state
required
string

Responses

Response samples

Content type
application/json
{
  • "ok": true,
  • "teamId": "string"
}

Start the Slack OAuth flow

Authorizations:
bearerAuthapiKeyAuth

Responses

Notification Rules

List notification rules (admin)

Authorizations:
bearerAuthapiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 0
}

Create a notification rule (admin)

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
channel
required
string
Enum: "slack" "email"
only_failures
boolean
Default: true
plan_id
string <uuid>
project_id
string <uuid>
target
string

Webhook-URL override for slack / address override for email

Responses

Request samples

Content type
application/json
{
  • "channel": "slack",
  • "only_failures": true,
  • "plan_id": "00713021-9aea-41da-9a88-87760c08fa72",
  • "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
  • "target": "string"
}

Response samples

Content type
application/json
{
  • "channel": "slack",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "onlyFailures": true,
  • "planId": "b3f60ba2-c1fd-4b3a-a23d-8e876e0ef75d",
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "target": "string"
}

Delete a notification rule (admin)

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Status

List current incidents (public)

Anonymous endpoint for status.testsbot.com — open incidents plus everything resolved within the visibility window, newest first.

Responses

Response samples

Content type
application/json
{
  • "incidents": [
    ]
}

Open an incident (admin)

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
affected
required
Array of strings
Items Enum: "api" "worker" "browserbase"
body
required
string non-empty
severity
string
Default: "minor"
Enum: "minor" "major" "critical"
status
required
string
Enum: "investigating" "identified" "monitoring" "resolved"
title
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "affected": [
    ],
  • "body": "string",
  • "severity": "minor",
  • "status": "investigating",
  • "title": "string"
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Update an incident (admin)

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
non-empty
resolved_at
string or null <date-time>
status
string
Enum: "investigating" "identified" "monitoring" "resolved"

Responses

Request samples

Content type
application/json
{
  • "resolved_at": "2019-08-24T14:15:22Z",
  • "status": "investigating"
}

Response samples

Content type
application/json
{
  • "affected": [
    ],
  • "body": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "resolvedAt": "2019-08-24T14:15:22Z",
  • "severity": "minor",
  • "startedAt": "2019-08-24T14:15:22Z",
  • "status": "investigating",
  • "title": "string"
}

Billing

Create a Stripe Checkout session

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
plan
required
string
Enum: "pro" "team"

Responses

Request samples

Content type
application/json
{
  • "plan": "pro"
}

Response samples

Content type
application/json
{}

Create a Stripe Billing-Portal session

Authorizations:
bearerAuthapiKeyAuth

Responses

Response samples

Content type
application/json
{}

Set or clear the org-wide monthly spend ceiling (admin only)

Sets the org-wide monthly LLM spend limit in USD enforced as a hard 402 on POST /runs. A null value clears the ceiling (no limit). Admin only.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
limitUsd
required
number or null <double> >= 0

USD ceiling, or null to clear the limit.

Responses

Request samples

Content type
application/json
{
  • "limitUsd": 0.1
}

Response samples

Content type
application/json
{
  • "data": {
    },
  • "ok": true
}

Current plan, usage and limits

Authorizations:
bearerAuthapiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "data": {
    },
  • "ok": true
}

Report soft metered execution overage to Stripe

GAP-070. Given the org's executionCount for the current month, computes the overage beyond the plan's runsPerMonth quota, reports those units to Stripe as metered usage (with an idempotency key), and increments the running overage_runs_tracked counter. This is SOFT overage billing ALONGSIDE the still-enforced hard monthly quota. INERT (503) until a Stripe metered Price/Product is configured in the Stripe dashboard and a subscription-item id has been captured via webhook.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
executionCount
required
integer >= 0

Responses

Request samples

Content type
application/json
{
  • "executionCount": 0
}

Response samples

Content type
application/json
{
  • "data": {
    },
  • "ok": true
}

Feedback

Submit product feedback

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
message
string
rating
required
string
Enum: "up" "down"

Responses

Request samples

Content type
application/json
{
  • "message": "string",
  • "rating": "up"
}

Response samples

Content type
application/json
{
  • "data": {
    },
  • "ok": true
}

Onboarding

Record an onboarding funnel milestone

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
event_type
required
string
Enum: "signup" "first_crawl" "first_test_generated" "first_run"

Responses

Request samples

Content type
application/json
{
  • "event_type": "signup"
}

Response samples

Content type
application/json
{
  • "ok": true
}

Create (or return) the org's idempotent sample project

Provisions the demo sample project with a canonical DSL test case for the caller's org. Idempotent: a second call returns the existing project with 200 instead of creating a duplicate.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Chat

Start a chat conversation

Creates a conversation, optionally pinned to a project. The project pin scopes the assistant's system-prompt context and the LLM cost cap.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
optional
project_id
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9"
}

Response samples

Content type
application/json
{
  • "created_at": "2019-08-24T14:15:22Z",
  • "created_by": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
  • "title": "string"
}

Read the conversation history

Full chronological history including assistant tool calls and tool results.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 0
}

Send a message to the assistant

Persists the user message, runs the LLM tool loop (create/generate/ list test cases, trigger/read runs — max 5 tool iterations) and answers synchronously with every message the turn produced (user, assistant, tool results). Tool failures come back as tool-result messages, never as a 5xx; a cost-cap breach ends the turn with an assistant hint message.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
content
required
string [ 1 .. 8000 ] characters

Responses

Request samples

Content type
application/json
{
  • "content": "string"
}

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 0
}

User Preferences

Read the caller's preferences

Authorizations:
bearerAuthapiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "data": {
    },
  • "ok": true
}

Update the caller's preferences

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
tour_completed
required
boolean

Responses

Request samples

Content type
application/json
{
  • "tour_completed": true
}

Response samples

Content type
application/json
{
  • "data": {
    },
  • "ok": true
}

Legal

Serve a legal document (public)

path Parameters
doc
required
string
Enum: "terms" "privacy" "dpa"
query Parameters
format
string
Default: "md"
Enum: "md" "pdf"

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "ok": false
}

Privacy

Request org data deletion (GDPR Art. 17)

30-day confirmation/cancel window before the deletion runs.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "data": {
    },
  • "ok": true
}

Request an org data export (GDPR Art. 20)

Authorizations:
bearerAuthapiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "data": {
    },
  • "ok": true
}

GitHub

GitHub App installation callback

Authorizations:
bearerAuthapiKeyAuth
query Parameters
installation_id
required
string
state
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "installation_id": "string",
  • "ok": true
}

Start the GitHub App installation flow

Authorizations:
bearerAuthapiKeyAuth
query Parameters
project_id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "ok": false,
  • "details": { }
}

Map a GitHub repository to a project

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
installation_id
required
string non-empty
repo
required
string^[a-zA-Z0-9._-]+/[a-zA-Z0-9._-]+$

Responses

Request samples

Content type
application/json
{
  • "installation_id": "string",
  • "repo": "acme/webshop"
}

Response samples

Content type
application/json
{
  • "installation_id": "string",
  • "ok": true,
  • "repo": "string"
}

Issues

Update the triage status of an issue

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
status
required
string
Enum: "active" "ignored" "resolved"

Responses

Request samples

Content type
application/json
{
  • "status": "active"
}

Response samples

Content type
application/json
{
  • "fingerprint": "string",
  • "firstSeenAt": "2019-08-24T14:15:22Z",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kind": "test_failure",
  • "lastSeenAt": "2019-08-24T14:15:22Z",
  • "occurrences": 1,
  • "payload": { },
  • "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
  • "sampleRunId": "feff50ef-cbc6-418b-b66f-5ac23e638431",
  • "severity": "minor",
  • "status": "active",
  • "title": "string"
}

List deduplicated failure issues of a project

One issue per recurring fingerprint: failed tests (test case + failure class + step) and console errors (normalized message + source URL, GAP-051). Recurrences bump occurrences and lastSeenAt instead of creating new rows. Optionally filtered by triage status and/or kind (both filters combine).

Authorizations:
bearerAuthapiKeyAuth
path Parameters
id
required
string <uuid>
query Parameters
status
string
Enum: "active" "ignored" "resolved"
kind
string
Enum: "test_failure" "console_error" "a11y"

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 0
}