Start a run for a specific test plan. This is the test-plan-scoped equivalent
of Start a Run: instead of supplying
test_plan_id in the body, the plan is identified by the URL path. It is also
the only endpoint that accepts slot_deployment_configs for cross-platform
plans.The response contains one job_id per test in the plan; poll each one with
Get Job Details to wait for completion.
UUID of the deployment configuration for the plan’s default slot (slot 1),
used by every player not assigned to an extra slot; for plans without extra
slots this is simply the config used by every test. Required unless the
plan’s slot assignments cover every player of every test and
slot_deployment_configs is supplied.
Nonblank build ID for the default slot. Requires deployment_config_id.
The selected config determines its meaning: a Build Storage UUID or the
opaque ID returned by an external platform. Get the ID with
List Builds. Omit it to use the config’s
saved or default selection.
Optional Build Storage UUIDs for extra apps in the top-level
deployment_config_id, keyed by extra app number ("1", "2", or "3").
These numbers refer to apps within a deployment config; they are independent
of the plan’s slot indexes.Omit an entry to keep that app’s saved build selection. Omitting the whole
field preserves all saved extra-app selections; {} is a no-op. A non-empty
top-level map requires top-level deployment_config_id. When slot "1" is
supplied instead, use extra_build_ids inside that slot entry.
Explicit extra build IDs work only when the corresponding extra app uses
Build Storage. Each build must belong to the project, be ready, and match
the extra app’s platform. An explicit ID takes precedence over that app’s
required_tags filter.
Per-slot deployment configs for cross-platform test plans, keyed by slot
index ("2", "3", and so on). Fetch the plan with
Get Test Plan to see its slots.
Every slot used by the plan’s player assignments needs an entry; keys
referencing slots the plan does not define return a 400 error. The key
"1" addresses the default slot as an alternative to the top-level
deployment_config_id/build_id (supplying both returns a 400 error).
Private device configs are allowed, but every player on a private device
needs its own device; if the configs of a test cannot give each of its
players a distinct device, the request returns a 400 error.
Optional nonblank build ID for this slot’s main app. Its deployment
config determines its meaning: a Build Storage UUID or an opaque ID from
an external platform. Omit it to use that config’s saved or default
selection.
Optional extra-app Build Storage build IDs for this slot’s deployment
config, keyed by extra app number ("1"–"3"). These numbers are
independent of the slot index. Omitted entries preserve saved selections;
{} is a no-op. Each explicit build must belong to the project, be ready,
match the extra app platform, and use a Build Storage source. Explicit
IDs take precedence over required_tags.
Per-run override knobs, with the same shape as options on
Start a Run (performance_monitoring,
mobile_auto_grant_permissions, mobile_geolocation, mobile_gpslocation).
Time-budget overrides are intentionally not accepted here; the budget
lives on the test version itself (min_seconds / max_seconds).
Start one independent test-plan run on every device configured in
deployment_config_id. Supported for mobile deployment configurations
with multi-device runs enabled. Requires deployment_config_id and cannot
be combined with slot_deployment_configs. Normal concurrency and billing
rules apply.
Single-device requests return 201 Created. Multi-device requests return
aggregate per-device results; see the fields below. The body contains the
started-run data directly (no { ok, status, message, data } envelope), typically including
job_ids[] (one per test in the plan) and test_plan_execution_id, so the
caller can correlate results via
List Test Plan Executions.
Per-device start results. Each item includes device_label, ok, status,
and failure message; successful items may include the upstream response
under data.
Multi-device requests return 201 when every device run starts, 207 when
only some start, and 500 when none start.
On failure, returns { "error": "<message>" } with an appropriate HTTP status.
UUID of the deployment config for the plan's default slot (slot 1), used by every player not assigned to an extra slot. Required unless the plan's slot assignments cover every player and slot_deployment_configs is supplied.
Nonblank main-app build ID for the default slot, interpreted by the selected deployment config's source: a UUID for Build Storage or an opaque external-platform ID. Requires deployment_config_id. Omit it to use the config's saved or default selection.
Build pins for extra apps in the top-level deployment_config_id. A nonempty map requires that config ID; put per-player or per-slot pins inside their respective entries. Supported for all request variants.
Per-slot deployment configs for cross-platform test plans, keyed by slot index ("2", "3", and so on; see the plan's slots). The key "1" addresses the default slot and cannot be combined with deployment_config_id/build_id. Every slot used by the plan's player assignments needs an entry. Private device configs are allowed, but every player on a private device needs its own device; if the configs of a test cannot give each of its players a distinct device, the request returns a 400 error. Extra app numbers in each entry are local to that deployment config, not slot numbers.
Per-run override knobs. The time budget is intentionally not overridable here; it lives on the test version itself (see min_seconds / max_seconds on the test body), so callers should edit the test (or create a new version) when they want to change the budget.
Start one independent test-plan run on every device configured in deployment_config_id. Supported for mobile deployment configurations with multi-device runs enabled. Requires deployment_config_id and cannot be combined with slot_deployment_configs.
Response
Run queued
Response body for POST /runs and POST /test-plans/{testPlanId}/runs. Single-device responses are returned with HTTP 201. Multi-device responses include per-device results and aggregate counts; HTTP 201 means all devices started, HTTP 207 means partial success, and HTTP 500 means none started.
Per-device start results for ephemeral (instructions) requests.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"nunu.ai","colors":{"primary":"#E55CD8","light":"#F79EDE","dark":"#9A2EA4"},"logo":{"light":"https://mintcdn.com/nunuai/3v-_21V5RzgZ0hsy/logo/light.svg?fit=max\u0026auto=format\u0026n=3v-_21V5RzgZ0hsy\u0026q=85\u0026s=72e6c926e51763f6f3775cfeddaf2bb2","dark":"https://mintcdn.com/nunuai/3v-_21V5RzgZ0hsy/logo/dark.svg?fit=max\u0026auto=format\u0026n=3v-_21V5RzgZ0hsy\u0026q=85\u0026s=71d1c274ff8d549db65f1f0a13c87d11"},"favicon":"https://mintcdn.com/nunuai/3v-_21V5RzgZ0hsy/favicon.svg?fit=max\u0026auto=format\u0026n=3v-_21V5RzgZ0hsy\u0026q=85\u0026s=96357a640e1c73d009bff3b73fa959a8","api":{"openapi":"api-reference/openapi.json"},"background":{"color":{"light":"#fafafa","dark":"#0A0A1C"}},"navbar":{"links":[{"href":"https://docs.nunu.ai","label":"Nexus Docs"}],"primary":{"type":"button","label":"Nexus","href":"https://nunu.ai/nexus"}},"footer":{"socials":{"x":"https://x.com/nunu_ai","github":"https://github.com/nunu-ai","linkedin":"https://linkedin.com/company/nunu-ai","discord":"https://discord.gg/nunu"}},"seo":{"metatags":{"robots":"noindex"}},"styling":{"codeblocks":{"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}},"latex":false},"contextual":{"options":["copy","chatgpt","claude","perplexity"],"display":"header"},"navigation":{"global":{"anchors":[{"anchor":"Nexus Documentation","icon":"newspaper","href":"https://docs.nunu.ai"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"nunuai","hasAudioNarration":false,"actualSubdomain":"nunuai","customDomains":["api-docs.nunu.ai"],"gitSource":{"type":"github","owner":"nunu-ai","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ab674d24ceb24a4c407e8db","collectionId":"c0c5f6f2-f8f0-41ed-9688-5c7bb1e4f798","latestBuiltDeploymentHistoryId":"6ab674d24ceb24a4c407e8db","schemaVersion":"v1"},"entitlements":{},"buildId":"6adf4396d13963272de84718","clientVersion":"0.0.4044","searchFilterCounts":[]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/test-plans/start-test-plan-run","slug":"/api-reference/test-plans/start-test-plan-run","pageMetadata":{"title":"Start Test Plan Run","openapi":"POST /project/{projectId}/test-plans/{testPlanId}/runs","noindex":true,"description":"Start a run for a specific test plan.","href":"/api-reference/test-plans/start-test-plan-run"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Start a run for a specific test plan.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,strong:`strong`,..._provideComponents(),...props.components},{Expandable,Heading,Info,Note,ParamField,ResponseField,Warning}=_components;if(!Expandable)_missingMdxReference(`Expandable`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!ParamField)_missingMdxReference(`ParamField`,true);if(!ResponseField)_missingMdxReference(`ResponseField`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Permission Required`}),`: `,_jsx(_components.code,{children:`project:operate-runs`})]})}),`\n`,_jsxs(_components.p,{children:[`Start a run for a specific test plan. This is the test-plan-scoped equivalent\nof `,_jsx(_components.a,{href:`/api-reference/runs/start-run`,children:`Start a Run`}),`: instead of supplying\n`,_jsx(_components.code,{children:`test_plan_id`}),` in the body, the plan is identified by the URL path. It is also\nthe only endpoint that accepts `,_jsx(_components.code,{children:`slot_deployment_configs`}),` for cross-platform\nplans.`]}),`\n`,_jsxs(_components.p,{children:[`The response contains one `,_jsx(_components.code,{children:`job_id`}),` per test in the plan; poll each one with\n`,_jsx(_components.a,{href:`/api-reference/jobs/get-job`,children:`Get Job Details`}),` to wait for completion.`]}),`\n`,_jsx(Heading,{level:`2`,id:`path-parameters`,children:`Path Parameters`}),`\n`,_jsx(ParamField,{path:`testPlanId`,type:`string`,required:true,id:`param-test-plan-id`,children:_jsx(_components.p,{children:`The test plan ID (UUID)`})}),`\n`,_jsx(Heading,{level:`2`,id:`request-body`,children:`Request Body`}),`\n`,_jsx(ParamField,{body:`deployment_config_id`,type:`string`,id:`param-deployment-config-id`,children:_jsxs(_components.p,{children:[`UUID of the deployment configuration for the plan’s `,_jsx(_components.strong,{children:`default slot`}),` (slot 1),\nused by every player not assigned to an extra slot; for plans without extra\nslots this is simply the config used by every test. Required unless the\nplan’s slot assignments cover every player of every test and\n`,_jsx(_components.code,{children:`slot_deployment_configs`}),` is supplied.`]})}),`\n`,_jsx(ParamField,{body:`agent_config_id`,type:`string`,id:`param-agent-config-id`,children:_jsx(_components.p,{children:`UUID of an agent configuration applied to every test in the plan.`})}),`\n`,_jsx(ParamField,{body:`build_id`,type:`string`,id:`param-build-id`,children:_jsxs(_components.p,{children:[`Nonblank build ID for the default slot. Requires `,_jsx(_components.code,{children:`deployment_config_id`}),`.\nThe selected config determines its meaning: a Build Storage UUID or the\nopaque ID returned by an external platform. Get the ID with\n`,_jsx(_components.a,{href:`/api-reference/builds/list-builds`,children:`List Builds`}),`. Omit it to use the config’s\nsaved or default selection.`]})}),`\n`,_jsxs(ParamField,{body:`extra_build_ids`,type:`object`,id:`param-extra-build-ids`,children:[_jsxs(_components.p,{children:[`Optional Build Storage UUIDs for extra apps in the top-level\n`,_jsx(_components.code,{children:`deployment_config_id`}),`, keyed by extra app number (`,_jsx(_components.code,{children:`\"1\"`}),`, `,_jsx(_components.code,{children:`\"2\"`}),`, or `,_jsx(_components.code,{children:`\"3\"`}),`).\nThese numbers refer to apps within a deployment config; they are independent\nof the plan’s slot indexes.`]}),_jsxs(_components.p,{children:[`Omit an entry to keep that app’s saved build selection. Omitting the whole\nfield preserves all saved extra-app selections; `,_jsx(_components.code,{children:`{}`}),` is a no-op. A non-empty\ntop-level map requires top-level `,_jsx(_components.code,{children:`deployment_config_id`}),`. When slot `,_jsx(_components.code,{children:`\"1\"`}),` is\nsupplied instead, use `,_jsx(_components.code,{children:`extra_build_ids`}),` inside that slot entry.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`Explicit extra build IDs work only when the corresponding extra app uses\nBuild Storage. Each build must belong to the project, be ready, and match\nthe extra app’s platform. An explicit ID takes precedence over that app’s\n`,_jsx(_components.code,{children:`required_tags`}),` filter.`]})})]}),`\n`,_jsxs(ParamField,{body:`slot_deployment_configs`,type:`object`,id:`param-slot-deployment-configs`,children:[_jsxs(_components.p,{children:[`Per-slot deployment configs for cross-platform test plans, keyed by slot\nindex (`,_jsx(_components.code,{children:`\"2\"`}),`, `,_jsx(_components.code,{children:`\"3\"`}),`, and so on). Fetch the plan with\n`,_jsx(_components.a,{href:`/api-reference/test-plans/get-test-plan`,children:`Get Test Plan`}),` to see its `,_jsx(_components.code,{children:`slots`}),`.\nEvery slot used by the plan’s player assignments needs an entry; keys\nreferencing slots the plan does not define return a `,_jsx(_components.code,{children:`400`}),` error. The key\n`,_jsx(_components.code,{children:`\"1\"`}),` addresses the default slot as an alternative to the top-level\n`,_jsx(_components.code,{children:`deployment_config_id`}),`/`,_jsx(_components.code,{children:`build_id`}),` (supplying both returns a `,_jsx(_components.code,{children:`400`}),` error).\nPrivate device configs are allowed, but every player on a private device\nneeds its own device; if the configs of a test cannot give each of its\nplayers a distinct device, the request returns a `,_jsx(_components.code,{children:`400`}),` error.`]}),_jsxs(Expandable,{title:`entry properties`,children:[_jsx(ParamField,{body:`slot_deployment_configs.{index}.deployment_config_id`,type:`string`,required:true,id:`param-slot-deployment-configs-index-deployment-config-id`,children:_jsx(_components.p,{children:`Deployment config to use for this slot.`})}),_jsx(ParamField,{body:`slot_deployment_configs.{index}.build_id`,type:`string`,id:`param-slot-deployment-configs-index-build-id`,children:_jsx(_components.p,{children:`Optional nonblank build ID for this slot’s main app. Its deployment\nconfig determines its meaning: a Build Storage UUID or an opaque ID from\nan external platform. Omit it to use that config’s saved or default\nselection.`})}),_jsx(ParamField,{body:`slot_deployment_configs.{index}.extra_build_ids`,type:`object`,id:`param-slot-deployment-configs-index-extra-build-ids`,children:_jsxs(_components.p,{children:[`Optional extra-app Build Storage build IDs for this slot’s deployment\nconfig, keyed by extra app number (`,_jsx(_components.code,{children:`\"1\"`}),`–`,_jsx(_components.code,{children:`\"3\"`}),`). These numbers are\nindependent of the slot index. Omitted entries preserve saved selections;\n`,_jsx(_components.code,{children:`{}`}),` is a no-op. Each explicit build must belong to the project, be ready,\nmatch the extra app platform, and use a Build Storage source. Explicit\nIDs take precedence over `,_jsx(_components.code,{children:`required_tags`}),`.`]})})]})]}),`\n`,_jsx(ParamField,{body:`additional_tags`,type:`string[]`,id:`param-additional-tags`,children:_jsx(_components.p,{children:`Tags appended to every resulting run.`})}),`\n`,_jsx(ParamField,{body:`render_templates`,type:`boolean`,default:`false`,id:`param-render-templates`,children:_jsx(_components.p,{children:`Enable Handlebars-style templating in test step bodies.`})}),`\n`,_jsx(ParamField,{body:`template_data`,type:`object`,id:`param-template-data`,children:_jsxs(_components.p,{children:[`Key-value pairs for template variables. Used only when `,_jsx(_components.code,{children:`render_templates`}),` is `,_jsx(_components.code,{children:`true`}),`.`]})}),`\n`,_jsx(ParamField,{body:`options`,type:`object`,id:`param-options`,children:_jsxs(_components.p,{children:[`Per-run override knobs, with the same shape as `,_jsx(_components.code,{children:`options`}),` on\n`,_jsx(_components.a,{href:`/api-reference/runs/start-run`,children:`Start a Run`}),` (`,_jsx(_components.code,{children:`performance_monitoring`}),`,\n`,_jsx(_components.code,{children:`mobile_auto_grant_permissions`}),`, `,_jsx(_components.code,{children:`mobile_geolocation`}),`, `,_jsx(_components.code,{children:`mobile_gpslocation`}),`).\nTime-budget overrides are intentionally `,_jsx(_components.strong,{children:`not`}),` accepted here; the budget\nlives on the test version itself (`,_jsx(_components.code,{children:`min_seconds`}),` / `,_jsx(_components.code,{children:`max_seconds`}),`).`]})}),`\n`,_jsx(ParamField,{body:`run_on_all_configured_devices`,type:`boolean`,default:`false`,id:`param-run-on-all-configured-devices`,children:_jsxs(_components.p,{children:[`Start one independent test-plan run on every device configured in\n`,_jsx(_components.code,{children:`deployment_config_id`}),`. Supported for mobile deployment configurations\nwith multi-device runs enabled. Requires `,_jsx(_components.code,{children:`deployment_config_id`}),` and cannot\nbe combined with `,_jsx(_components.code,{children:`slot_deployment_configs`}),`. Normal concurrency and billing\nrules apply.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`response`,children:`Response`}),`\n`,_jsxs(_components.p,{children:[`Single-device requests return `,_jsx(_components.code,{children:`201 Created`}),`. Multi-device requests return\naggregate per-device results; see the fields below. The body contains the\nstarted-run data directly (no `,_jsx(_components.code,{children:`{ ok, status, message, data }`}),` envelope), typically including\n`,_jsx(_components.code,{children:`job_ids[]`}),` (one per test in the plan) and `,_jsx(_components.code,{children:`test_plan_execution_id`}),`, so the\ncaller can correlate results via\n`,_jsx(_components.a,{href:`/api-reference/test-plans/list-test-plan-executions`,children:`List Test Plan Executions`}),`.`]}),`\n`,_jsx(ResponseField,{name:`job_ids`,type:`string[]`,required:true,id:`param-job-ids`,children:_jsx(_components.p,{children:`Job IDs created for each test in the plan`})}),`\n`,_jsx(ResponseField,{name:`test_plan_execution_id`,type:`string`,id:`param-test-plan-execution-id`,children:_jsx(_components.p,{children:`ID of the test plan execution`})}),`\n`,_jsx(ResponseField,{name:`slot_build_ids`,type:`object`,id:`param-slot-build-ids`,children:_jsx(_components.p,{children:`For cross-platform plans: the build pinned for each extra slot, keyed by slot\nindex. Only present when slot configs resolved to builds.`})}),`\n`,_jsx(ResponseField,{name:`ok`,type:`boolean`,id:`param-ok`,children:_jsx(_components.p,{children:`Whether at least one device run started. Returned for multi-device requests.`})}),`\n`,_jsx(ResponseField,{name:`requested_count`,type:`integer`,id:`param-requested-count`,children:_jsx(_components.p,{children:`Number of test-plan runs requested across configured devices.`})}),`\n`,_jsx(ResponseField,{name:`started_count`,type:`integer`,id:`param-started-count`,children:_jsx(_components.p,{children:`Number of test-plan runs started successfully.`})}),`\n`,_jsx(ResponseField,{name:`successful_count`,type:`integer`,id:`param-successful-count`,children:_jsxs(_components.p,{children:[`Alias for `,_jsx(_components.code,{children:`started_count`}),` in multi-device responses.`]})}),`\n`,_jsx(ResponseField,{name:`failed_count`,type:`integer`,id:`param-failed-count`,children:_jsx(_components.p,{children:`Number of test-plan runs that failed to start.`})}),`\n`,_jsx(ResponseField,{name:`results`,type:`object[]`,id:`param-results`,children:_jsxs(_components.p,{children:[`Per-device start results. Each item includes `,_jsx(_components.code,{children:`device_label`}),`, `,_jsx(_components.code,{children:`ok`}),`, `,_jsx(_components.code,{children:`status`}),`,\nand failure `,_jsx(_components.code,{children:`message`}),`; successful items may include the upstream response\nunder `,_jsx(_components.code,{children:`data`}),`.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Multi-device requests return `,_jsx(_components.code,{children:`201`}),` when every device run starts, `,_jsx(_components.code,{children:`207`}),` when\nonly some start, and `,_jsx(_components.code,{children:`500`}),` when none start.`]})}),`\n`,_jsxs(_components.p,{children:[`On failure, returns `,_jsx(_components.code,{children:`{ \"error\": \"\u003cmessage>\" }`}),` with an appropriate HTTP status.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":{"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}},"config":{},"pageMetadata":{"title":"Start Test Plan Run","openapi":"POST /project/{projectId}/test-plans/{testPlanId}/runs","noindex":true,"description":"Start a run for a specific test plan.","href":"/api-reference/test-plans/start-test-plan-run"}}},"mdxSourceWithNoJs":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{CodeBlock,Expandable,Heading,Info,Note,ParamField,RequestExample,ResponseExample,ResponseField,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Expandable)_missingMdxReference(`Expandable`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!ParamField)_missingMdxReference(`ParamField`,true);if(!RequestExample)_missingMdxReference(`RequestExample`,true);if(!ResponseExample)_missingMdxReference(`ResponseExample`,true);if(!ResponseField)_missingMdxReference(`ResponseField`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Permission Required`}),`: `,_jsx(_components.code,{children:`project:operate-runs`})]})}),`\n`,_jsxs(_components.p,{children:[`Start a run for a specific test plan. This is the test-plan-scoped equivalent\nof `,_jsx(_components.a,{href:`/api-reference/runs/start-run`,children:`Start a Run`}),`: instead of supplying\n`,_jsx(_components.code,{children:`test_plan_id`}),` in the body, the plan is identified by the URL path. It is also\nthe only endpoint that accepts `,_jsx(_components.code,{children:`slot_deployment_configs`}),` for cross-platform\nplans.`]}),`\n`,_jsxs(_components.p,{children:[`The response contains one `,_jsx(_components.code,{children:`job_id`}),` per test in the plan; poll each one with\n`,_jsx(_components.a,{href:`/api-reference/jobs/get-job`,children:`Get Job Details`}),` to wait for completion.`]}),`\n`,_jsx(Heading,{level:`2`,id:`path-parameters`,children:`Path Parameters`}),`\n`,_jsx(ParamField,{path:`testPlanId`,type:`string`,required:true,id:`param-test-plan-id`,children:_jsx(_components.p,{children:`The test plan ID (UUID)`})}),`\n`,_jsx(Heading,{level:`2`,id:`request-body`,children:`Request Body`}),`\n`,_jsx(ParamField,{body:`deployment_config_id`,type:`string`,id:`param-deployment-config-id`,children:_jsxs(_components.p,{children:[`UUID of the deployment configuration for the plan’s `,_jsx(_components.strong,{children:`default slot`}),` (slot 1),\nused by every player not assigned to an extra slot; for plans without extra\nslots this is simply the config used by every test. Required unless the\nplan’s slot assignments cover every player of every test and\n`,_jsx(_components.code,{children:`slot_deployment_configs`}),` is supplied.`]})}),`\n`,_jsx(ParamField,{body:`agent_config_id`,type:`string`,id:`param-agent-config-id`,children:_jsx(_components.p,{children:`UUID of an agent configuration applied to every test in the plan.`})}),`\n`,_jsx(ParamField,{body:`build_id`,type:`string`,id:`param-build-id`,children:_jsxs(_components.p,{children:[`Nonblank build ID for the default slot. Requires `,_jsx(_components.code,{children:`deployment_config_id`}),`.\nThe selected config determines its meaning: a Build Storage UUID or the\nopaque ID returned by an external platform. Get the ID with\n`,_jsx(_components.a,{href:`/api-reference/builds/list-builds`,children:`List Builds`}),`. Omit it to use the config’s\nsaved or default selection.`]})}),`\n`,_jsxs(ParamField,{body:`extra_build_ids`,type:`object`,id:`param-extra-build-ids`,children:[_jsxs(_components.p,{children:[`Optional Build Storage UUIDs for extra apps in the top-level\n`,_jsx(_components.code,{children:`deployment_config_id`}),`, keyed by extra app number (`,_jsx(_components.code,{children:`\"1\"`}),`, `,_jsx(_components.code,{children:`\"2\"`}),`, or `,_jsx(_components.code,{children:`\"3\"`}),`).\nThese numbers refer to apps within a deployment config; they are independent\nof the plan’s slot indexes.`]}),_jsxs(_components.p,{children:[`Omit an entry to keep that app’s saved build selection. Omitting the whole\nfield preserves all saved extra-app selections; `,_jsx(_components.code,{children:`{}`}),` is a no-op. A non-empty\ntop-level map requires top-level `,_jsx(_components.code,{children:`deployment_config_id`}),`. When slot `,_jsx(_components.code,{children:`\"1\"`}),` is\nsupplied instead, use `,_jsx(_components.code,{children:`extra_build_ids`}),` inside that slot entry.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`Explicit extra build IDs work only when the corresponding extra app uses\nBuild Storage. Each build must belong to the project, be ready, and match\nthe extra app’s platform. An explicit ID takes precedence over that app’s\n`,_jsx(_components.code,{children:`required_tags`}),` filter.`]})})]}),`\n`,_jsxs(ParamField,{body:`slot_deployment_configs`,type:`object`,id:`param-slot-deployment-configs`,children:[_jsxs(_components.p,{children:[`Per-slot deployment configs for cross-platform test plans, keyed by slot\nindex (`,_jsx(_components.code,{children:`\"2\"`}),`, `,_jsx(_components.code,{children:`\"3\"`}),`, and so on). Fetch the plan with\n`,_jsx(_components.a,{href:`/api-reference/test-plans/get-test-plan`,children:`Get Test Plan`}),` to see its `,_jsx(_components.code,{children:`slots`}),`.\nEvery slot used by the plan’s player assignments needs an entry; keys\nreferencing slots the plan does not define return a `,_jsx(_components.code,{children:`400`}),` error. The key\n`,_jsx(_components.code,{children:`\"1\"`}),` addresses the default slot as an alternative to the top-level\n`,_jsx(_components.code,{children:`deployment_config_id`}),`/`,_jsx(_components.code,{children:`build_id`}),` (supplying both returns a `,_jsx(_components.code,{children:`400`}),` error).\nPrivate device configs are allowed, but every player on a private device\nneeds its own device; if the configs of a test cannot give each of its\nplayers a distinct device, the request returns a `,_jsx(_components.code,{children:`400`}),` error.`]}),_jsxs(Expandable,{title:`entry properties`,children:[_jsx(ParamField,{body:`slot_deployment_configs.{index}.deployment_config_id`,type:`string`,required:true,id:`param-slot-deployment-configs-index-deployment-config-id`,children:_jsx(_components.p,{children:`Deployment config to use for this slot.`})}),_jsx(ParamField,{body:`slot_deployment_configs.{index}.build_id`,type:`string`,id:`param-slot-deployment-configs-index-build-id`,children:_jsx(_components.p,{children:`Optional nonblank build ID for this slot’s main app. Its deployment\nconfig determines its meaning: a Build Storage UUID or an opaque ID from\nan external platform. Omit it to use that config’s saved or default\nselection.`})}),_jsx(ParamField,{body:`slot_deployment_configs.{index}.extra_build_ids`,type:`object`,id:`param-slot-deployment-configs-index-extra-build-ids`,children:_jsxs(_components.p,{children:[`Optional extra-app Build Storage build IDs for this slot’s deployment\nconfig, keyed by extra app number (`,_jsx(_components.code,{children:`\"1\"`}),`–`,_jsx(_components.code,{children:`\"3\"`}),`). These numbers are\nindependent of the slot index. Omitted entries preserve saved selections;\n`,_jsx(_components.code,{children:`{}`}),` is a no-op. Each explicit build must belong to the project, be ready,\nmatch the extra app platform, and use a Build Storage source. Explicit\nIDs take precedence over `,_jsx(_components.code,{children:`required_tags`}),`.`]})})]})]}),`\n`,_jsx(ParamField,{body:`additional_tags`,type:`string[]`,id:`param-additional-tags`,children:_jsx(_components.p,{children:`Tags appended to every resulting run.`})}),`\n`,_jsx(ParamField,{body:`render_templates`,type:`boolean`,default:`false`,id:`param-render-templates`,children:_jsx(_components.p,{children:`Enable Handlebars-style templating in test step bodies.`})}),`\n`,_jsx(ParamField,{body:`template_data`,type:`object`,id:`param-template-data`,children:_jsxs(_components.p,{children:[`Key-value pairs for template variables. Used only when `,_jsx(_components.code,{children:`render_templates`}),` is `,_jsx(_components.code,{children:`true`}),`.`]})}),`\n`,_jsx(ParamField,{body:`options`,type:`object`,id:`param-options`,children:_jsxs(_components.p,{children:[`Per-run override knobs, with the same shape as `,_jsx(_components.code,{children:`options`}),` on\n`,_jsx(_components.a,{href:`/api-reference/runs/start-run`,children:`Start a Run`}),` (`,_jsx(_components.code,{children:`performance_monitoring`}),`,\n`,_jsx(_components.code,{children:`mobile_auto_grant_permissions`}),`, `,_jsx(_components.code,{children:`mobile_geolocation`}),`, `,_jsx(_components.code,{children:`mobile_gpslocation`}),`).\nTime-budget overrides are intentionally `,_jsx(_components.strong,{children:`not`}),` accepted here; the budget\nlives on the test version itself (`,_jsx(_components.code,{children:`min_seconds`}),` / `,_jsx(_components.code,{children:`max_seconds`}),`).`]})}),`\n`,_jsx(ParamField,{body:`run_on_all_configured_devices`,type:`boolean`,default:`false`,id:`param-run-on-all-configured-devices`,children:_jsxs(_components.p,{children:[`Start one independent test-plan run on every device configured in\n`,_jsx(_components.code,{children:`deployment_config_id`}),`. Supported for mobile deployment configurations\nwith multi-device runs enabled. Requires `,_jsx(_components.code,{children:`deployment_config_id`}),` and cannot\nbe combined with `,_jsx(_components.code,{children:`slot_deployment_configs`}),`. Normal concurrency and billing\nrules apply.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`response`,children:`Response`}),`\n`,_jsxs(_components.p,{children:[`Single-device requests return `,_jsx(_components.code,{children:`201 Created`}),`. Multi-device requests return\naggregate per-device results; see the fields below. The body contains the\nstarted-run data directly (no `,_jsx(_components.code,{children:`{ ok, status, message, data }`}),` envelope), typically including\n`,_jsx(_components.code,{children:`job_ids[]`}),` (one per test in the plan) and `,_jsx(_components.code,{children:`test_plan_execution_id`}),`, so the\ncaller can correlate results via\n`,_jsx(_components.a,{href:`/api-reference/test-plans/list-test-plan-executions`,children:`List Test Plan Executions`}),`.`]}),`\n`,_jsx(ResponseField,{name:`job_ids`,type:`string[]`,required:true,id:`param-job-ids`,children:_jsx(_components.p,{children:`Job IDs created for each test in the plan`})}),`\n`,_jsx(ResponseField,{name:`test_plan_execution_id`,type:`string`,id:`param-test-plan-execution-id`,children:_jsx(_components.p,{children:`ID of the test plan execution`})}),`\n`,_jsx(ResponseField,{name:`slot_build_ids`,type:`object`,id:`param-slot-build-ids`,children:_jsx(_components.p,{children:`For cross-platform plans: the build pinned for each extra slot, keyed by slot\nindex. Only present when slot configs resolved to builds.`})}),`\n`,_jsx(ResponseField,{name:`ok`,type:`boolean`,id:`param-ok`,children:_jsx(_components.p,{children:`Whether at least one device run started. Returned for multi-device requests.`})}),`\n`,_jsx(ResponseField,{name:`requested_count`,type:`integer`,id:`param-requested-count`,children:_jsx(_components.p,{children:`Number of test-plan runs requested across configured devices.`})}),`\n`,_jsx(ResponseField,{name:`started_count`,type:`integer`,id:`param-started-count`,children:_jsx(_components.p,{children:`Number of test-plan runs started successfully.`})}),`\n`,_jsx(ResponseField,{name:`successful_count`,type:`integer`,id:`param-successful-count`,children:_jsxs(_components.p,{children:[`Alias for `,_jsx(_components.code,{children:`started_count`}),` in multi-device responses.`]})}),`\n`,_jsx(ResponseField,{name:`failed_count`,type:`integer`,id:`param-failed-count`,children:_jsx(_components.p,{children:`Number of test-plan runs that failed to start.`})}),`\n`,_jsx(ResponseField,{name:`results`,type:`object[]`,id:`param-results`,children:_jsxs(_components.p,{children:[`Per-device start results. Each item includes `,_jsx(_components.code,{children:`device_label`}),`, `,_jsx(_components.code,{children:`ok`}),`, `,_jsx(_components.code,{children:`status`}),`,\nand failure `,_jsx(_components.code,{children:`message`}),`; successful items may include the upstream response\nunder `,_jsx(_components.code,{children:`data`}),`.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Multi-device requests return `,_jsx(_components.code,{children:`201`}),` when every device run starts, `,_jsx(_components.code,{children:`207`}),` when\nonly some start, and `,_jsx(_components.code,{children:`500`}),` when none start.`]})}),`\n`,_jsxs(_components.p,{children:[`On failure, returns `,_jsx(_components.code,{children:`{ \"error\": \"\u003cmessage>\" }`}),` with an appropriate HTTP status.`]}),`\n`,_jsxs(RequestExample,{children:[_jsx(CodeBlock,{filename:`cURL`,numberOfLines:`7`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes catppuccin-latte catppuccin-mocha`,style:{backgroundColor:`#eff1f5`,\"--shiki-dark-bg\":`#1e1e2e`,color:`#4c4f69`,\"--shiki-dark\":`#cdd6f4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1E66F5`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`curl`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` -X`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` POST`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"https://nunu.ai/api/v1/project/your-project-id/test-plans/b3f1a2c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c/runs\"`}),_jsx(_components.span,{style:{color:`#EA76CB`,\"--shiki-dark\":`#F5C2E7`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` -H`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"X-Api-Key: YOUR_API_TOKEN\"`}),_jsx(_components.span,{style:{color:`#EA76CB`,\"--shiki-dark\":`#F5C2E7`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` -H`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#EA76CB`,\"--shiki-dark\":`#F5C2E7`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` -d`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"deployment_config_id\": \"456e7890-e89b-12d3-a456-426614174000\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"additional_tags\": [\"nightly\"]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` }'`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`cURL (cross-platform slots)`,numberOfLines:`13`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes catppuccin-latte catppuccin-mocha`,style:{backgroundColor:`#eff1f5`,\"--shiki-dark-bg\":`#1e1e2e`,color:`#4c4f69`,\"--shiki-dark\":`#cdd6f4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`13`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1E66F5`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`curl`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` -X`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` POST`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"https://nunu.ai/api/v1/project/your-project-id/test-plans/b3f1a2c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c/runs\"`}),_jsx(_components.span,{style:{color:`#EA76CB`,\"--shiki-dark\":`#F5C2E7`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` -H`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"X-Api-Key: YOUR_API_TOKEN\"`}),_jsx(_components.span,{style:{color:`#EA76CB`,\"--shiki-dark\":`#F5C2E7`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` -H`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#EA76CB`,\"--shiki-dark\":`#F5C2E7`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` -d`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"deployment_config_id\": \"456e7890-e89b-12d3-a456-426614174000\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"extra_build_ids\": { \"1\": \"123e4567-e89b-12d3-a456-426614174001\" },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"slot_deployment_configs\": {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"2\": {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"deployment_config_id\": \"9a1b2c3d-4e5f-6789-a0b1-c2d3e4f5a6b7\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"extra_build_ids\": { \"2\": \"123e4567-e89b-12d3-a456-426614174002\" }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` }'`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`cURL (All configured devices)`,numberOfLines:`7`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes catppuccin-latte catppuccin-mocha`,style:{backgroundColor:`#eff1f5`,\"--shiki-dark-bg\":`#1e1e2e`,color:`#4c4f69`,\"--shiki-dark\":`#cdd6f4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1E66F5`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#89B4FA`,\"--shiki-dark-font-style\":`italic`},children:`curl`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` -X`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` POST`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"https://nunu.ai/api/v1/project/your-project-id/test-plans/b3f1a2c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c/runs\"`}),_jsx(_components.span,{style:{color:`#EA76CB`,\"--shiki-dark\":`#F5C2E7`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` -H`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"X-Api-Key: YOUR_API_TOKEN\"`}),_jsx(_components.span,{style:{color:`#EA76CB`,\"--shiki-dark\":`#F5C2E7`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` -H`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#EA76CB`,\"--shiki-dark\":`#F5C2E7`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` -d`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"deployment_config_id\": \"456e7890-e89b-12d3-a456-426614174000\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"run_on_all_configured_devices\": true`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` }'`})}),`\n`]})})})]}),`\n`,_jsxs(ResponseExample,{children:[_jsx(CodeBlock,{filename:`201`,numberOfLines:`7`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes catppuccin-latte catppuccin-mocha`,style:{backgroundColor:`#eff1f5`,\"--shiki-dark-bg\":`#1e1e2e`,color:`#4c4f69`,\"--shiki-dark\":`#cdd6f4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:` \"`}),_jsx(_components.span,{style:{color:`#1E66F5`,\"--shiki-dark\":`#89B4FA`},children:`job_ids`}),_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:`\"`}),_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:`:`}),_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:` [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"cc6e3994-a714-4b6b-9879-0b3e53c0a3af\"`}),_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"dd1e4a55-b825-4c8b-baaf-1d4e63d1b4be\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:` ],`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:` \"`}),_jsx(_components.span,{style:{color:`#1E66F5`,\"--shiki-dark\":`#89B4FA`},children:`test_plan_execution_id`}),_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:`\"`}),_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:`:`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"abc12345-6789-def0-1234-56789abcdef0\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:`}`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`404 Not Found`,numberOfLines:`3`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes catppuccin-latte catppuccin-mocha`,style:{backgroundColor:`#eff1f5`,\"--shiki-dark-bg\":`#1e1e2e`,color:`#4c4f69`,\"--shiki-dark\":`#cdd6f4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:` \"`}),_jsx(_components.span,{style:{color:`#1E66F5`,\"--shiki-dark\":`#89B4FA`},children:`error`}),_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:`\"`}),_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:`:`}),_jsx(_components.span,{style:{color:`#40A02B`,\"--shiki-dark\":`#A6E3A1`},children:` \"test plan not found\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#7C7F93`,\"--shiki-dark\":`#9399B2`},children:`}`})}),`\n`]})})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":{"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}},"config":{},"pageMetadata":{"title":"Start Test Plan Run","openapi":"POST /project/{projectId}/test-plans/{testPlanId}/runs","noindex":true,"description":"Start a run for a specific test plan.","href":"/api-reference/test-plans/start-test-plan-run"}}}},"mdxExtracts":{"tableOfContents":[{"title":"Path Parameters","slug":"path-parameters","depth":2,"children":[]},{"title":"Request Body","slug":"request-body","depth":2,"children":[]},{"title":"Response","slug":"response","depth":2,"children":[]}],"codeExamples":{"request":{"type":"RequestExample","children":[{"filename":"cURL","html":"\u003cpre class=\"shiki shiki-themes catppuccin-latte catppuccin-mocha\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1e1e2e;color:#4c4f69;--shiki-dark:#cdd6f4\" language=\"shellscript\">\u003ccode language=\"shellscript\" numberOfLines=\"7\">\u003cspan class=\"line\">\u003cspan style=\"color:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic\">curl\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> -X\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> POST\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"https://nunu.ai/api/v1/project/your-project-id/test-plans/b3f1a2c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c/runs\"\u003c/span>\u003cspan style=\"color:#EA76CB;--shiki-dark:#F5C2E7\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> -H\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"X-Api-Key: YOUR_API_TOKEN\"\u003c/span>\u003cspan style=\"color:#EA76CB;--shiki-dark:#F5C2E7\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> -H\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"Content-Type: application/json\"\u003c/span>\u003cspan style=\"color:#EA76CB;--shiki-dark:#F5C2E7\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> -d\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> '{\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"deployment_config_id\": \"456e7890-e89b-12d3-a456-426614174000\",\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"additional_tags\": [\"nightly\"]\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> }'\u003c/span>\u003c/span>\n\u003c/code>\u003c/pre>"},{"filename":"cURL (cross-platform slots)","html":"\u003cpre class=\"shiki shiki-themes catppuccin-latte catppuccin-mocha\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1e1e2e;color:#4c4f69;--shiki-dark:#cdd6f4\" language=\"shellscript\">\u003ccode language=\"shellscript\" numberOfLines=\"13\">\u003cspan class=\"line\">\u003cspan style=\"color:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic\">curl\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> -X\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> POST\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"https://nunu.ai/api/v1/project/your-project-id/test-plans/b3f1a2c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c/runs\"\u003c/span>\u003cspan style=\"color:#EA76CB;--shiki-dark:#F5C2E7\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> -H\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"X-Api-Key: YOUR_API_TOKEN\"\u003c/span>\u003cspan style=\"color:#EA76CB;--shiki-dark:#F5C2E7\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> -H\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"Content-Type: application/json\"\u003c/span>\u003cspan style=\"color:#EA76CB;--shiki-dark:#F5C2E7\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> -d\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> '{\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"deployment_config_id\": \"456e7890-e89b-12d3-a456-426614174000\",\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"extra_build_ids\": { \"1\": \"123e4567-e89b-12d3-a456-426614174001\" },\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"slot_deployment_configs\": {\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"2\": {\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"deployment_config_id\": \"9a1b2c3d-4e5f-6789-a0b1-c2d3e4f5a6b7\",\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"extra_build_ids\": { \"2\": \"123e4567-e89b-12d3-a456-426614174002\" }\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> }\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> }\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> }'\u003c/span>\u003c/span>\n\u003c/code>\u003c/pre>"},{"filename":"cURL (All configured devices)","html":"\u003cpre class=\"shiki shiki-themes catppuccin-latte catppuccin-mocha\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1e1e2e;color:#4c4f69;--shiki-dark:#cdd6f4\" language=\"shellscript\">\u003ccode language=\"shellscript\" numberOfLines=\"7\">\u003cspan class=\"line\">\u003cspan style=\"color:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic\">curl\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> -X\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> POST\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"https://nunu.ai/api/v1/project/your-project-id/test-plans/b3f1a2c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c/runs\"\u003c/span>\u003cspan style=\"color:#EA76CB;--shiki-dark:#F5C2E7\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> -H\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"X-Api-Key: YOUR_API_TOKEN\"\u003c/span>\u003cspan style=\"color:#EA76CB;--shiki-dark:#F5C2E7\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> -H\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"Content-Type: application/json\"\u003c/span>\u003cspan style=\"color:#EA76CB;--shiki-dark:#F5C2E7\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> -d\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> '{\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"deployment_config_id\": \"456e7890-e89b-12d3-a456-426614174000\",\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"run_on_all_configured_devices\": true\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> }'\u003c/span>\u003c/span>\n\u003c/code>\u003c/pre>"}],"attributes":[]},"response":{"type":"ResponseExample","children":[{"filename":"201","html":"\u003cpre class=\"shiki shiki-themes catppuccin-latte catppuccin-mocha\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1e1e2e;color:#4c4f69;--shiki-dark:#cdd6f4\" language=\"json\">\u003ccode language=\"json\" numberOfLines=\"7\">\u003cspan class=\"line\">\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\">{\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\"> \"\u003c/span>\u003cspan style=\"color:#1E66F5;--shiki-dark:#89B4FA\">job_ids\u003c/span>\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\">\"\u003c/span>\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\">:\u003c/span>\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\"> [\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"cc6e3994-a714-4b6b-9879-0b3e53c0a3af\"\u003c/span>\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"dd1e4a55-b825-4c8b-baaf-1d4e63d1b4be\"\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\"> ],\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\"> \"\u003c/span>\u003cspan style=\"color:#1E66F5;--shiki-dark:#89B4FA\">test_plan_execution_id\u003c/span>\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\">\"\u003c/span>\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\">:\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"abc12345-6789-def0-1234-56789abcdef0\"\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\">}\u003c/span>\u003c/span>\n\u003c/code>\u003c/pre>"},{"filename":"404 Not Found","html":"\u003cpre class=\"shiki shiki-themes catppuccin-latte catppuccin-mocha\" style=\"background-color:#eff1f5;--shiki-dark-bg:#1e1e2e;color:#4c4f69;--shiki-dark:#cdd6f4\" language=\"json\">\u003ccode language=\"json\" numberOfLines=\"3\">\u003cspan class=\"line\">\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\">{\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\"> \"\u003c/span>\u003cspan style=\"color:#1E66F5;--shiki-dark:#89B4FA\">error\u003c/span>\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\">\"\u003c/span>\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\">:\u003c/span>\u003cspan style=\"color:#40A02B;--shiki-dark:#A6E3A1\"> \"test plan not found\"\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#7C7F93;--shiki-dark:#9399B2\">}\u003c/span>\u003c/span>\n\u003c/code>\u003c/pre>"}],"attributes":[]}}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"startTestPlanRun","summary":"Start Test Plan Run","description":"Start a run for a specific test plan.","tags":["Test Plans"],"parameters":["0046c8a0-e5ef-4423-9797-ace040ecd9cb"],"requestBody":"4fbba625-6281-4c8d-912f-c0d78ea66503","responses":{"201":"d3e5639f-cd77-4f85-89d9-d9187a032207","207":"3689b95e-1f78-49fe-802b-2b0de34b59a3","400":"3c6d22eb-f53d-41ad-96d4-355183ee80d7","401":"5d7fae6e-3a0e-4942-bbaf-3853e32e608a","403":"df1ad408-2e7e-46e2-9067-4423212fb7d6","404":"959f586e-ea44-4477-b5af-26ca8f7b00b0","500":"b2ffc972-1130-420a-a6c4-d66438e3c24b"},"method":"post","type":"path","servers":["b161a08e-c191-4bda-918d-220e6fca179f"],"security":["44f1f26a-c835-4039-a305-45f5f3c1f6c7"],"path":"/project/{projectId}/test-plans/{testPlanId}/runs","baseUrlOptions":["https://nunu.ai/api/v1"],"title":"Start Test Plan Run","codeSamples":[],"requiredOnlyExamples":false,"requestExamples":[{"dropdown":false,"language":"shellscript","code":{"type":"pre","key":null,"ref":null,"props":{"className":"shiki shiki-themes catppuccin-latte catppuccin-mocha","style":{"backgroundColor":"#eff1f5","--shiki-dark-bg":"#1e1e2e","color":"#4c4f69","--shiki-dark":"#cdd6f4"},"language":"shellscript","children":{"type":"code","key":null,"ref":null,"props":{"language":"shellscript","numberOfLines":"7","children":[{"type":"span","key":"0","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#1E66F5","--shiki-light-font-style":"italic","--shiki-dark":"#89B4FA","--shiki-dark-font-style":"italic"},"children":"curl"}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" -X"}},{"type":"span","key":"2","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" POST"}},{"type":"span","key":"3","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"https://nunu.ai/api/v1/project/your-project-id/test-plans/b3f1a2c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c/runs\""}},{"type":"span","key":"4","ref":null,"props":{"style":{"color":"#EA76CB","--shiki-dark":"#F5C2E7"},"children":" \\"}}]}},"\n",{"type":"span","key":"2","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" -H"}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"X-Api-Key: YOUR_API_TOKEN\""}},{"type":"span","key":"2","ref":null,"props":{"style":{"color":"#EA76CB","--shiki-dark":"#F5C2E7"},"children":" \\"}}]}},"\n",{"type":"span","key":"4","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" -H"}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"Content-Type: application/json\""}},{"type":"span","key":"2","ref":null,"props":{"style":{"color":"#EA76CB","--shiki-dark":"#F5C2E7"},"children":" \\"}}]}},"\n",{"type":"span","key":"6","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" -d"}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" '{"}}]}},"\n",{"type":"span","key":"8","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"deployment_config_id\": \"456e7890-e89b-12d3-a456-426614174000\","}}}},"\n",{"type":"span","key":"10","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"additional_tags\": [\"nightly\"]"}}}},"\n",{"type":"span","key":"12","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" }'"}}}},"\n"]}}}},"filename":"cURL"},{"dropdown":false,"language":"shellscript","code":{"type":"pre","key":null,"ref":null,"props":{"className":"shiki shiki-themes catppuccin-latte catppuccin-mocha","style":{"backgroundColor":"#eff1f5","--shiki-dark-bg":"#1e1e2e","color":"#4c4f69","--shiki-dark":"#cdd6f4"},"language":"shellscript","children":{"type":"code","key":null,"ref":null,"props":{"language":"shellscript","numberOfLines":"13","children":[{"type":"span","key":"0","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#1E66F5","--shiki-light-font-style":"italic","--shiki-dark":"#89B4FA","--shiki-dark-font-style":"italic"},"children":"curl"}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" -X"}},{"type":"span","key":"2","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" POST"}},{"type":"span","key":"3","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"https://nunu.ai/api/v1/project/your-project-id/test-plans/b3f1a2c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c/runs\""}},{"type":"span","key":"4","ref":null,"props":{"style":{"color":"#EA76CB","--shiki-dark":"#F5C2E7"},"children":" \\"}}]}},"\n",{"type":"span","key":"2","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" -H"}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"X-Api-Key: YOUR_API_TOKEN\""}},{"type":"span","key":"2","ref":null,"props":{"style":{"color":"#EA76CB","--shiki-dark":"#F5C2E7"},"children":" \\"}}]}},"\n",{"type":"span","key":"4","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" -H"}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"Content-Type: application/json\""}},{"type":"span","key":"2","ref":null,"props":{"style":{"color":"#EA76CB","--shiki-dark":"#F5C2E7"},"children":" \\"}}]}},"\n",{"type":"span","key":"6","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" -d"}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" '{"}}]}},"\n",{"type":"span","key":"8","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"deployment_config_id\": \"456e7890-e89b-12d3-a456-426614174000\","}}}},"\n",{"type":"span","key":"10","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"extra_build_ids\": { \"1\": \"123e4567-e89b-12d3-a456-426614174001\" },"}}}},"\n",{"type":"span","key":"12","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"slot_deployment_configs\": {"}}}},"\n",{"type":"span","key":"14","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"2\": {"}}}},"\n",{"type":"span","key":"16","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"deployment_config_id\": \"9a1b2c3d-4e5f-6789-a0b1-c2d3e4f5a6b7\","}}}},"\n",{"type":"span","key":"18","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"extra_build_ids\": { \"2\": \"123e4567-e89b-12d3-a456-426614174002\" }"}}}},"\n",{"type":"span","key":"20","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" }"}}}},"\n",{"type":"span","key":"22","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" }"}}}},"\n",{"type":"span","key":"24","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" }'"}}}},"\n"]}}}},"filename":"cURL (cross-platform slots)"},{"dropdown":false,"language":"shellscript","code":{"type":"pre","key":null,"ref":null,"props":{"className":"shiki shiki-themes catppuccin-latte catppuccin-mocha","style":{"backgroundColor":"#eff1f5","--shiki-dark-bg":"#1e1e2e","color":"#4c4f69","--shiki-dark":"#cdd6f4"},"language":"shellscript","children":{"type":"code","key":null,"ref":null,"props":{"language":"shellscript","numberOfLines":"7","children":[{"type":"span","key":"0","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#1E66F5","--shiki-light-font-style":"italic","--shiki-dark":"#89B4FA","--shiki-dark-font-style":"italic"},"children":"curl"}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" -X"}},{"type":"span","key":"2","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" POST"}},{"type":"span","key":"3","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"https://nunu.ai/api/v1/project/your-project-id/test-plans/b3f1a2c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c/runs\""}},{"type":"span","key":"4","ref":null,"props":{"style":{"color":"#EA76CB","--shiki-dark":"#F5C2E7"},"children":" \\"}}]}},"\n",{"type":"span","key":"2","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" -H"}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"X-Api-Key: YOUR_API_TOKEN\""}},{"type":"span","key":"2","ref":null,"props":{"style":{"color":"#EA76CB","--shiki-dark":"#F5C2E7"},"children":" \\"}}]}},"\n",{"type":"span","key":"4","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" -H"}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"Content-Type: application/json\""}},{"type":"span","key":"2","ref":null,"props":{"style":{"color":"#EA76CB","--shiki-dark":"#F5C2E7"},"children":" \\"}}]}},"\n",{"type":"span","key":"6","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" -d"}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" '{"}}]}},"\n",{"type":"span","key":"8","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"deployment_config_id\": \"456e7890-e89b-12d3-a456-426614174000\","}}}},"\n",{"type":"span","key":"10","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"run_on_all_configured_devices\": true"}}}},"\n",{"type":"span","key":"12","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" }'"}}}},"\n"]}}}},"filename":"cURL (All configured devices)"}],"requestExampleType":"mdx","responseExamples":[{"dropdown":false,"language":"json","code":{"type":"pre","key":null,"ref":null,"props":{"className":"shiki shiki-themes catppuccin-latte catppuccin-mocha","style":{"backgroundColor":"#eff1f5","--shiki-dark-bg":"#1e1e2e","color":"#4c4f69","--shiki-dark":"#cdd6f4"},"language":"json","children":{"type":"code","key":null,"ref":null,"props":{"language":"json","numberOfLines":"7","children":[{"type":"span","key":"0","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":"{"}}}},"\n",{"type":"span","key":"2","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":" \""}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#1E66F5","--shiki-dark":"#89B4FA"},"children":"job_ids"}},{"type":"span","key":"2","ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":"\""}},{"type":"span","key":"3","ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":":"}},{"type":"span","key":"4","ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":" ["}}]}},"\n",{"type":"span","key":"4","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"cc6e3994-a714-4b6b-9879-0b3e53c0a3af\""}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":","}}]}},"\n",{"type":"span","key":"6","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"dd1e4a55-b825-4c8b-baaf-1d4e63d1b4be\""}}}},"\n",{"type":"span","key":"8","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":" ],"}}}},"\n",{"type":"span","key":"10","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":" \""}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#1E66F5","--shiki-dark":"#89B4FA"},"children":"test_plan_execution_id"}},{"type":"span","key":"2","ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":"\""}},{"type":"span","key":"3","ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":":"}},{"type":"span","key":"4","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"abc12345-6789-def0-1234-56789abcdef0\""}}]}},"\n",{"type":"span","key":"12","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":"}"}}}},"\n"]}}}},"filename":"201"},{"dropdown":false,"language":"json","code":{"type":"pre","key":null,"ref":null,"props":{"className":"shiki shiki-themes catppuccin-latte catppuccin-mocha","style":{"backgroundColor":"#eff1f5","--shiki-dark-bg":"#1e1e2e","color":"#4c4f69","--shiki-dark":"#cdd6f4"},"language":"json","children":{"type":"code","key":null,"ref":null,"props":{"language":"json","numberOfLines":"3","children":[{"type":"span","key":"0","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":"{"}}}},"\n",{"type":"span","key":"2","ref":null,"props":{"className":"line","children":[{"type":"span","key":"0","ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":" \""}},{"type":"span","key":"1","ref":null,"props":{"style":{"color":"#1E66F5","--shiki-dark":"#89B4FA"},"children":"error"}},{"type":"span","key":"2","ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":"\""}},{"type":"span","key":"3","ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":":"}},{"type":"span","key":"4","ref":null,"props":{"style":{"color":"#40A02B","--shiki-dark":"#A6E3A1"},"children":" \"test plan not found\""}}]}},"\n",{"type":"span","key":"4","ref":null,"props":{"className":"line","children":{"type":"span","key":null,"ref":null,"props":{"style":{"color":"#7C7F93","--shiki-dark":"#9399B2"},"children":"}"}}}},"\n"]}}}},"filename":"404 Not Found"}],"responseExampleType":"mdx"},"dependencies":{"parameters":{"0046c8a0-e5ef-4423-9797-ace040ecd9cb":{"name":"testPlanId","in":"path","required":true,"description":"Test plan ID (UUID)","schema":{"type":"string","format":"uuid","isRequired":true,"description":"Test plan ID (UUID)","uniqueKey":"","typeLabel":"string\u003cuuid>"}},"9250f2e1-10e3-4d4a-a101-98cfffff386a":{"name":"projectId","in":"path","required":true,"schema":{"type":"string","isRequired":true,"description":"The project ID. You can copy it from the project settings page or the project URL in the dashboard.","uniqueKey":"","typeLabel":"string"},"description":"The project ID. You can copy it from the project settings page or the project URL in the dashboard."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["deployment_config_id"],"properties":{"deployment_config_id":{"type":"string","format":"uuid","description":"UUID of the deployment config for the plan's default slot (slot 1), used by every player not assigned to an extra slot. Required unless the plan's slot assignments cover every player and `slot_deployment_configs` is supplied.","isRequired":true,"uniqueKey":"oneOf.0.deployment_config_id","typeLabel":"string\u003cuuid>"},"agent_config_id":{"type":"string","format":"uuid","uniqueKey":"oneOf.0.agent_config_id","typeLabel":"string\u003cuuid>"},"build_id":{"type":"string","minLength":1,"pattern":"\\S","description":"Nonblank main-app build ID for the default slot, interpreted by the selected deployment config's source: a UUID for Build Storage or an opaque external-platform ID. Requires `deployment_config_id`. Omit it to use the config's saved or default selection.","uniqueKey":"oneOf.0.build_id","typeLabel":"string"},"extra_build_ids":{"type":"object","description":"Build pins for extra apps in the top-level deployment_config_id. A nonempty map requires that config ID; put per-player or per-slot pins inside their respective entries. Supported for all request variants.","propertyNames":{"pattern":"^[1-3]$"},"additionalProperties":{"type":"string","format":"uuid","uniqueKey":"oneOf.0.extra_build_ids.additionalProperties","typeLabel":"string\u003cuuid>"},"example":{"1":"33333333-3333-4333-8333-333333333333"},"uniqueKey":"oneOf.0.extra_build_ids","typeLabel":"object"},"slot_deployment_configs":{"type":"object","description":"Per-slot deployment configs for cross-platform test plans, keyed by slot index (\"2\", \"3\", and so on; see the plan's `slots`). The key \"1\" addresses the default slot and cannot be combined with `deployment_config_id`/`build_id`. Every slot used by the plan's player assignments needs an entry. Private device configs are allowed, but every player on a private device needs its own device; if the configs of a test cannot give each of its players a distinct device, the request returns a 400 error. Extra app numbers in each entry are local to that deployment config, not slot numbers.","additionalProperties":{"type":"object","required":["deployment_config_id"],"properties":{"deployment_config_id":{"type":"string","format":"uuid","description":"Deployment config to use for this slot","isRequired":true,"uniqueKey":"oneOf.0.slot_deployment_configs.additionalProperties.deployment_config_id","typeLabel":"string\u003cuuid>"},"build_id":{"type":"string","minLength":1,"pattern":"\\S","description":"Optional nonblank main-app build ID for this slot, interpreted by the slot's deployment config as a Build Storage UUID or opaque external-platform ID. Omit it to use that config's saved or default selection.","uniqueKey":"oneOf.0.slot_deployment_configs.additionalProperties.build_id","typeLabel":"string"},"extra_build_ids":{"type":"object","description":"Build Storage UUIDs keyed by one-based extra app number (\"1\", \"2\", \"3\") in the selected deployment config. Omitted entries retain saved source settings, filters, and build pins; {} makes no changes and does not remove apps. Explicit build IDs take precedence over required tags. Each selected app must use Build Storage and each build must be ready, in the same project, and on the matching platform. Extra apps can be pinned even when the main app skips installation.","propertyNames":{"pattern":"^[1-3]$"},"additionalProperties":{"type":"string","format":"uuid","uniqueKey":"oneOf.0.slot_deployment_configs.additionalProperties.extra_build_ids.additionalProperties","typeLabel":"string\u003cuuid>"},"example":{"1":"33333333-3333-4333-8333-333333333333"},"uniqueKey":"oneOf.0.slot_deployment_configs.additionalProperties.extra_build_ids","typeLabel":"object"}},"uniqueKey":"oneOf.0.slot_deployment_configs.additionalProperties","typeLabel":"object"},"uniqueKey":"oneOf.0.slot_deployment_configs","typeLabel":"object"},"additional_tags":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.additional_tags.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.additional_tags","typeLabel":"string[]"},"render_templates":{"type":"boolean","default":false,"uniqueKey":"oneOf.0.render_templates","typeLabel":"boolean"},"template_data":{"type":"object","uniqueKey":"oneOf.0.template_data","typeLabel":"object"},"options":{"type":"object","description":"Per-run override knobs. The time budget is intentionally not overridable here; it lives on the test version itself (see `min_seconds` / `max_seconds` on the test body), so callers should edit the test (or create a new version) when they want to change the budget.","properties":{"performance_monitoring":{"type":"boolean","description":"Enable performance data collection","uniqueKey":"oneOf.0.options.performance_monitoring","typeLabel":"boolean"},"mobile_auto_grant_permissions":{"type":"boolean","description":"Auto-grant app permissions on mobile","uniqueKey":"oneOf.0.options.mobile_auto_grant_permissions","typeLabel":"boolean"},"mobile_geolocation":{"type":"string","description":"IP geolocation proxy location","uniqueKey":"oneOf.0.options.mobile_geolocation","typeLabel":"string"},"mobile_gpslocation":{"oneOf":[{"type":"string","description":"GPS location proxy location, either 'auto' or an object with 'lat' and 'long' string properties. Note: 'auto' requires `mobile_geolocation` to be set","uniqueKey":"oneOf.0.options.mobile_gpslocation.oneOf.0","typeLabel":"string"},{"type":"object","description":"GPS location proxy location, either 'auto' or an object with 'lat' and 'long' string properties. Note: 'auto' requires `mobile_geolocation` to be set","uniqueKey":"oneOf.0.options.mobile_gpslocation.oneOf.1","typeLabel":"object"}],"uniqueKey":"oneOf.0.options.mobile_gpslocation","typeLabel":"string | object"}},"uniqueKey":"oneOf.0.options","typeLabel":"object"},"run_on_all_configured_devices":{"type":"boolean","default":false,"description":"Start one independent test-plan run on every device configured in `deployment_config_id`. Supported for mobile deployment configurations with multi-device runs enabled. Requires `deployment_config_id` and cannot be combined with `slot_deployment_configs`.","uniqueKey":"oneOf.0.run_on_all_configured_devices","typeLabel":"boolean"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","required":["slot_deployment_configs"],"properties":{"slot_deployment_configs":{"type":"object","description":"Per-slot deployment configs for cross-platform test plans, keyed by slot index (\"2\", \"3\", and so on; see the plan's `slots`). The key \"1\" addresses the default slot and cannot be combined with `deployment_config_id`/`build_id`. Every slot used by the plan's player assignments needs an entry. Private device configs are allowed, but every player on a private device needs its own device; if the configs of a test cannot give each of its players a distinct device, the request returns a 400 error. Extra app numbers in each entry are local to that deployment config, not slot numbers.","additionalProperties":{"type":"object","required":["deployment_config_id"],"properties":{"deployment_config_id":{"type":"string","format":"uuid","description":"Deployment config to use for this slot","isRequired":true,"uniqueKey":"oneOf.1.slot_deployment_configs.additionalProperties.deployment_config_id","typeLabel":"string\u003cuuid>"},"build_id":{"type":"string","minLength":1,"pattern":"\\S","description":"Optional nonblank main-app build ID for this slot, interpreted by the slot's deployment config as a Build Storage UUID or opaque external-platform ID. Omit it to use that config's saved or default selection.","uniqueKey":"oneOf.1.slot_deployment_configs.additionalProperties.build_id","typeLabel":"string"},"extra_build_ids":{"type":"object","description":"Build Storage UUIDs keyed by one-based extra app number (\"1\", \"2\", \"3\") in the selected deployment config. Omitted entries retain saved source settings, filters, and build pins; {} makes no changes and does not remove apps. Explicit build IDs take precedence over required tags. Each selected app must use Build Storage and each build must be ready, in the same project, and on the matching platform. Extra apps can be pinned even when the main app skips installation.","propertyNames":{"pattern":"^[1-3]$"},"additionalProperties":{"type":"string","format":"uuid","uniqueKey":"oneOf.1.slot_deployment_configs.additionalProperties.extra_build_ids.additionalProperties","typeLabel":"string\u003cuuid>"},"example":{"1":"33333333-3333-4333-8333-333333333333"},"uniqueKey":"oneOf.1.slot_deployment_configs.additionalProperties.extra_build_ids","typeLabel":"object"}},"uniqueKey":"oneOf.1.slot_deployment_configs.additionalProperties","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.1.slot_deployment_configs","typeLabel":"object"},"deployment_config_id":{"type":"string","format":"uuid","description":"UUID of the deployment config for the plan's default slot (slot 1), used by every player not assigned to an extra slot. Required unless the plan's slot assignments cover every player and `slot_deployment_configs` is supplied.","uniqueKey":"oneOf.1.deployment_config_id","typeLabel":"string\u003cuuid>"},"agent_config_id":{"type":"string","format":"uuid","uniqueKey":"oneOf.1.agent_config_id","typeLabel":"string\u003cuuid>"},"build_id":{"type":"string","minLength":1,"pattern":"\\S","description":"Nonblank main-app build ID for the default slot, interpreted by the selected deployment config's source: a UUID for Build Storage or an opaque external-platform ID. Requires `deployment_config_id`. Omit it to use the config's saved or default selection.","uniqueKey":"oneOf.1.build_id","typeLabel":"string"},"extra_build_ids":{"type":"object","description":"Build pins for extra apps in the top-level deployment_config_id. A nonempty map requires that config ID; put per-player or per-slot pins inside their respective entries. Supported for all request variants.","propertyNames":{"pattern":"^[1-3]$"},"additionalProperties":{"type":"string","format":"uuid","uniqueKey":"oneOf.1.extra_build_ids.additionalProperties","typeLabel":"string\u003cuuid>"},"example":{"1":"33333333-3333-4333-8333-333333333333"},"uniqueKey":"oneOf.1.extra_build_ids","typeLabel":"object"},"additional_tags":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.additional_tags.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.1.additional_tags","typeLabel":"string[]"},"render_templates":{"type":"boolean","default":false,"uniqueKey":"oneOf.1.render_templates","typeLabel":"boolean"},"template_data":{"type":"object","uniqueKey":"oneOf.1.template_data","typeLabel":"object"},"options":{"type":"object","description":"Per-run override knobs. The time budget is intentionally not overridable here; it lives on the test version itself (see `min_seconds` / `max_seconds` on the test body), so callers should edit the test (or create a new version) when they want to change the budget.","properties":{"performance_monitoring":{"type":"boolean","description":"Enable performance data collection","uniqueKey":"oneOf.1.options.performance_monitoring","typeLabel":"boolean"},"mobile_auto_grant_permissions":{"type":"boolean","description":"Auto-grant app permissions on mobile","uniqueKey":"oneOf.1.options.mobile_auto_grant_permissions","typeLabel":"boolean"},"mobile_geolocation":{"type":"string","description":"IP geolocation proxy location","uniqueKey":"oneOf.1.options.mobile_geolocation","typeLabel":"string"},"mobile_gpslocation":{"oneOf":[{"type":"string","description":"GPS location proxy location, either 'auto' or an object with 'lat' and 'long' string properties. Note: 'auto' requires `mobile_geolocation` to be set","uniqueKey":"oneOf.1.options.mobile_gpslocation.oneOf.0","typeLabel":"string"},{"type":"object","description":"GPS location proxy location, either 'auto' or an object with 'lat' and 'long' string properties. Note: 'auto' requires `mobile_geolocation` to be set","uniqueKey":"oneOf.1.options.mobile_gpslocation.oneOf.1","typeLabel":"object"}],"uniqueKey":"oneOf.1.options.mobile_gpslocation","typeLabel":"string | object"}},"uniqueKey":"oneOf.1.options","typeLabel":"object"},"run_on_all_configured_devices":{"type":"boolean","default":false,"description":"Start one independent test-plan run on every device configured in `deployment_config_id`. Supported for mobile deployment configurations with multi-device runs enabled. Requires `deployment_config_id` and cannot be combined with `slot_deployment_configs`.","uniqueKey":"oneOf.1.run_on_all_configured_devices","typeLabel":"boolean"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"deployment_config_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","agent_config_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","build_id":"\u003cstring>","extra_build_ids":{"1":"33333333-3333-4333-8333-333333333333"},"slot_deployment_configs":{},"additional_tags":["\u003cstring>"],"render_templates":false,"template_data":{},"options":{"performance_monitoring":true,"mobile_auto_grant_permissions":true,"mobile_geolocation":"\u003cstring>","mobile_gpslocation":"\u003cstring>"},"run_on_all_configured_devices":false}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"d3e5639f-cd77-4f85-89d9-d9187a032207":{"description":"Run queued","content":{"application/json":{"schema":{"type":"object","description":"Response body for POST /runs and POST /test-plans/{testPlanId}/runs. Single-device responses are returned with HTTP 201. Multi-device responses include per-device results and aggregate counts; HTTP 201 means all devices started, HTTP 207 means partial success, and HTTP 500 means none started.","properties":{"ok":{"type":"boolean","description":"Whether at least one device run started. Returned for multi-device requests.","uniqueKey":"ok","typeLabel":"boolean"},"job_ids":{"type":"array","items":{"type":"string","format":"uuid","uniqueKey":"job_ids.items.[INDEX]","typeLabel":"string\u003cuuid>"},"description":"Array of job IDs created. Single test returns 1 job; test plan returns one job per test.","uniqueKey":"job_ids","typeLabel":"string\u003cuuid>[]"},"build_id":{"type":"string","format":"uuid","description":"Build ID used for the run. Returned for multiplayer test and test plan runs.","uniqueKey":"build_id","typeLabel":"string\u003cuuid>"},"test_id":{"type":"string","format":"uuid","description":"UUID of the created ephemeral test. Only returned for ephemeral (instructions) runs.","uniqueKey":"test_id","typeLabel":"string\u003cuuid>"},"test_plan_execution_id":{"type":"string","format":"uuid","description":"Test plan execution ID. Returned for test plan runs.","uniqueKey":"test_plan_execution_id","typeLabel":"string\u003cuuid>"},"slot_build_ids":{"type":"object","additionalProperties":{"type":"string","format":"uuid","uniqueKey":"slot_build_ids.additionalProperties","typeLabel":"string\u003cuuid>"},"description":"For cross-platform test plan runs: the build pinned for each extra slot, keyed by slot index. Only present when slot configs resolved to builds.","uniqueKey":"slot_build_ids","typeLabel":"object"},"message":{"type":"string","description":"Optional status message returned for multiplayer test and test plan runs.","uniqueKey":"message","typeLabel":"string"},"requested_count":{"type":"integer","description":"Number of runs requested across configured devices. For multiplayer tests, includes the `instances` multiplier.","uniqueKey":"requested_count","typeLabel":"integer"},"started_count":{"type":"integer","description":"Number of runs started successfully. For multiplayer tests, includes the `instances` multiplier.","uniqueKey":"started_count","typeLabel":"integer"},"successful_count":{"type":"integer","description":"Alias for `started_count` in multi-device existing-test and test-plan responses.","uniqueKey":"successful_count","typeLabel":"integer"},"failed_count":{"type":"integer","description":"Number of requested runs that failed to start.","uniqueKey":"failed_count","typeLabel":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"device_label":{"type":"string","description":"Label of the configured device.","uniqueKey":"results.items.[INDEX].device_label","typeLabel":"string"},"ok":{"type":"boolean","description":"Whether the run started on this device.","uniqueKey":"results.items.[INDEX].ok","typeLabel":"boolean"},"status":{"type":"integer","description":"HTTP-like status for this device start attempt.","uniqueKey":"results.items.[INDEX].status","typeLabel":"integer"},"message":{"type":"string","description":"Failure or status message for this device attempt.","uniqueKey":"results.items.[INDEX].message","typeLabel":"string"},"error":{"type":"string","description":"Error returned for this device attempt, when present.","uniqueKey":"results.items.[INDEX].error","typeLabel":"string"},"data":{"type":"object","description":"Upstream start response for this device, when present.","uniqueKey":"results.items.[INDEX].data","typeLabel":"object"}},"uniqueKey":"results.items.[INDEX]","typeLabel":"object"},"description":"Per-device start results for existing-test and test-plan requests.","uniqueKey":"results","typeLabel":"object[]"},"device_runs":{"type":"array","items":{"type":"object","properties":{"device_label":{"type":"string","description":"Label of the configured device.","uniqueKey":"device_runs.items.[INDEX].device_label","typeLabel":"string"},"ok":{"type":"boolean","description":"Whether the run started on this device.","uniqueKey":"device_runs.items.[INDEX].ok","typeLabel":"boolean"},"status":{"type":"integer","description":"HTTP-like status for this device start attempt.","uniqueKey":"device_runs.items.[INDEX].status","typeLabel":"integer"},"message":{"type":"string","description":"Failure or status message for this device attempt.","uniqueKey":"device_runs.items.[INDEX].message","typeLabel":"string"},"error":{"type":"string","description":"Error returned for this device attempt, when present.","uniqueKey":"device_runs.items.[INDEX].error","typeLabel":"string"},"data":{"type":"object","description":"Upstream start response for this device, when present.","uniqueKey":"device_runs.items.[INDEX].data","typeLabel":"object"}},"uniqueKey":"device_runs.items.[INDEX]","typeLabel":"object"},"description":"Per-device start results for ephemeral (`instructions`) requests.","uniqueKey":"device_runs","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"ok":true,"job_ids":["3c90c3cc-0d44-4b50-8888-8dd25736052a"],"build_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","test_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","test_plan_execution_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","slot_build_ids":{},"message":"\u003cstring>","requested_count":123,"started_count":123,"successful_count":123,"failed_count":123,"results":[{"device_label":"\u003cstring>","ok":true,"status":123,"message":"\u003cstring>","error":"\u003cstring>","data":{}}],"device_runs":[{"device_label":"\u003cstring>","ok":true,"status":123,"message":"\u003cstring>","error":"\u003cstring>","data":{}}]}}},"exampleType":"generated"}},"exampleType":"generated"},"3689b95e-1f78-49fe-802b-2b0de34b59a3":{"description":"Multi-device test-plan run partially started","content":{"application/json":{"schema":{"type":"object","description":"Response body for POST /runs and POST /test-plans/{testPlanId}/runs. Single-device responses are returned with HTTP 201. Multi-device responses include per-device results and aggregate counts; HTTP 201 means all devices started, HTTP 207 means partial success, and HTTP 500 means none started.","properties":{"ok":{"type":"boolean","description":"Whether at least one device run started. Returned for multi-device requests.","uniqueKey":"ok","typeLabel":"boolean"},"job_ids":{"type":"array","items":{"type":"string","format":"uuid","uniqueKey":"job_ids.items.[INDEX]","typeLabel":"string\u003cuuid>"},"description":"Array of job IDs created. Single test returns 1 job; test plan returns one job per test.","uniqueKey":"job_ids","typeLabel":"string\u003cuuid>[]"},"build_id":{"type":"string","format":"uuid","description":"Build ID used for the run. Returned for multiplayer test and test plan runs.","uniqueKey":"build_id","typeLabel":"string\u003cuuid>"},"test_id":{"type":"string","format":"uuid","description":"UUID of the created ephemeral test. Only returned for ephemeral (instructions) runs.","uniqueKey":"test_id","typeLabel":"string\u003cuuid>"},"test_plan_execution_id":{"type":"string","format":"uuid","description":"Test plan execution ID. Returned for test plan runs.","uniqueKey":"test_plan_execution_id","typeLabel":"string\u003cuuid>"},"slot_build_ids":{"type":"object","additionalProperties":{"type":"string","format":"uuid","uniqueKey":"slot_build_ids.additionalProperties","typeLabel":"string\u003cuuid>"},"description":"For cross-platform test plan runs: the build pinned for each extra slot, keyed by slot index. Only present when slot configs resolved to builds.","uniqueKey":"slot_build_ids","typeLabel":"object"},"message":{"type":"string","description":"Optional status message returned for multiplayer test and test plan runs.","uniqueKey":"message","typeLabel":"string"},"requested_count":{"type":"integer","description":"Number of runs requested across configured devices. For multiplayer tests, includes the `instances` multiplier.","uniqueKey":"requested_count","typeLabel":"integer"},"started_count":{"type":"integer","description":"Number of runs started successfully. For multiplayer tests, includes the `instances` multiplier.","uniqueKey":"started_count","typeLabel":"integer"},"successful_count":{"type":"integer","description":"Alias for `started_count` in multi-device existing-test and test-plan responses.","uniqueKey":"successful_count","typeLabel":"integer"},"failed_count":{"type":"integer","description":"Number of requested runs that failed to start.","uniqueKey":"failed_count","typeLabel":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"device_label":{"type":"string","description":"Label of the configured device.","uniqueKey":"results.items.[INDEX].device_label","typeLabel":"string"},"ok":{"type":"boolean","description":"Whether the run started on this device.","uniqueKey":"results.items.[INDEX].ok","typeLabel":"boolean"},"status":{"type":"integer","description":"HTTP-like status for this device start attempt.","uniqueKey":"results.items.[INDEX].status","typeLabel":"integer"},"message":{"type":"string","description":"Failure or status message for this device attempt.","uniqueKey":"results.items.[INDEX].message","typeLabel":"string"},"error":{"type":"string","description":"Error returned for this device attempt, when present.","uniqueKey":"results.items.[INDEX].error","typeLabel":"string"},"data":{"type":"object","description":"Upstream start response for this device, when present.","uniqueKey":"results.items.[INDEX].data","typeLabel":"object"}},"uniqueKey":"results.items.[INDEX]","typeLabel":"object"},"description":"Per-device start results for existing-test and test-plan requests.","uniqueKey":"results","typeLabel":"object[]"},"device_runs":{"type":"array","items":{"type":"object","properties":{"device_label":{"type":"string","description":"Label of the configured device.","uniqueKey":"device_runs.items.[INDEX].device_label","typeLabel":"string"},"ok":{"type":"boolean","description":"Whether the run started on this device.","uniqueKey":"device_runs.items.[INDEX].ok","typeLabel":"boolean"},"status":{"type":"integer","description":"HTTP-like status for this device start attempt.","uniqueKey":"device_runs.items.[INDEX].status","typeLabel":"integer"},"message":{"type":"string","description":"Failure or status message for this device attempt.","uniqueKey":"device_runs.items.[INDEX].message","typeLabel":"string"},"error":{"type":"string","description":"Error returned for this device attempt, when present.","uniqueKey":"device_runs.items.[INDEX].error","typeLabel":"string"},"data":{"type":"object","description":"Upstream start response for this device, when present.","uniqueKey":"device_runs.items.[INDEX].data","typeLabel":"object"}},"uniqueKey":"device_runs.items.[INDEX]","typeLabel":"object"},"description":"Per-device start results for ephemeral (`instructions`) requests.","uniqueKey":"device_runs","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"ok":true,"job_ids":["3c90c3cc-0d44-4b50-8888-8dd25736052a"],"build_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","test_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","test_plan_execution_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","slot_build_ids":{},"message":"\u003cstring>","requested_count":123,"started_count":123,"successful_count":123,"failed_count":123,"results":[{"device_label":"\u003cstring>","ok":true,"status":123,"message":"\u003cstring>","error":"\u003cstring>","data":{}}],"device_runs":[{"device_label":"\u003cstring>","ok":true,"status":123,"message":"\u003cstring>","error":"\u003cstring>","data":{}}]}}},"exampleType":"generated"}},"exampleType":"generated"},"3c6d22eb-f53d-41ad-96d4-355183ee80d7":{"description":"Bad Request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","uniqueKey":"code","typeLabel":"string"},"details":{"type":"object","uniqueKey":"details","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","code":"\u003cstring>","details":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"5d7fae6e-3a0e-4942-bbaf-3853e32e608a":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","uniqueKey":"code","typeLabel":"string"},"details":{"type":"object","uniqueKey":"details","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","code":"\u003cstring>","details":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"df1ad408-2e7e-46e2-9067-4423212fb7d6":{"description":"Forbidden - missing project:operate-runs","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","uniqueKey":"code","typeLabel":"string"},"details":{"type":"object","uniqueKey":"details","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","code":"\u003cstring>","details":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"959f586e-ea44-4477-b5af-26ca8f7b00b0":{"description":"Test, test plan, deployment config, or selected build not found in the project","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","uniqueKey":"code","typeLabel":"string"},"details":{"type":"object","uniqueKey":"details","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","code":"\u003cstring>","details":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"b2ffc972-1130-420a-a6c4-d66438e3c24b":{"description":"No device runs started or internal server error","content":{"application/json":{"schema":{"oneOf":[{"type":"object","description":"Response body for POST /runs and POST /test-plans/{testPlanId}/runs. Single-device responses are returned with HTTP 201. Multi-device responses include per-device results and aggregate counts; HTTP 201 means all devices started, HTTP 207 means partial success, and HTTP 500 means none started.","properties":{"ok":{"type":"boolean","description":"Whether at least one device run started. Returned for multi-device requests.","uniqueKey":"oneOf.0.ok","typeLabel":"boolean"},"job_ids":{"type":"array","items":{"type":"string","format":"uuid","uniqueKey":"oneOf.0.job_ids.items.[INDEX]","typeLabel":"string\u003cuuid>"},"description":"Array of job IDs created. Single test returns 1 job; test plan returns one job per test.","uniqueKey":"oneOf.0.job_ids","typeLabel":"string\u003cuuid>[]"},"build_id":{"type":"string","format":"uuid","description":"Build ID used for the run. Returned for multiplayer test and test plan runs.","uniqueKey":"oneOf.0.build_id","typeLabel":"string\u003cuuid>"},"test_id":{"type":"string","format":"uuid","description":"UUID of the created ephemeral test. Only returned for ephemeral (instructions) runs.","uniqueKey":"oneOf.0.test_id","typeLabel":"string\u003cuuid>"},"test_plan_execution_id":{"type":"string","format":"uuid","description":"Test plan execution ID. Returned for test plan runs.","uniqueKey":"oneOf.0.test_plan_execution_id","typeLabel":"string\u003cuuid>"},"slot_build_ids":{"type":"object","additionalProperties":{"type":"string","format":"uuid","uniqueKey":"oneOf.0.slot_build_ids.additionalProperties","typeLabel":"string\u003cuuid>"},"description":"For cross-platform test plan runs: the build pinned for each extra slot, keyed by slot index. Only present when slot configs resolved to builds.","uniqueKey":"oneOf.0.slot_build_ids","typeLabel":"object"},"message":{"type":"string","description":"Optional status message returned for multiplayer test and test plan runs.","uniqueKey":"oneOf.0.message","typeLabel":"string"},"requested_count":{"type":"integer","description":"Number of runs requested across configured devices. For multiplayer tests, includes the `instances` multiplier.","uniqueKey":"oneOf.0.requested_count","typeLabel":"integer"},"started_count":{"type":"integer","description":"Number of runs started successfully. For multiplayer tests, includes the `instances` multiplier.","uniqueKey":"oneOf.0.started_count","typeLabel":"integer"},"successful_count":{"type":"integer","description":"Alias for `started_count` in multi-device existing-test and test-plan responses.","uniqueKey":"oneOf.0.successful_count","typeLabel":"integer"},"failed_count":{"type":"integer","description":"Number of requested runs that failed to start.","uniqueKey":"oneOf.0.failed_count","typeLabel":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"device_label":{"type":"string","description":"Label of the configured device.","uniqueKey":"oneOf.0.results.items.[INDEX].device_label","typeLabel":"string"},"ok":{"type":"boolean","description":"Whether the run started on this device.","uniqueKey":"oneOf.0.results.items.[INDEX].ok","typeLabel":"boolean"},"status":{"type":"integer","description":"HTTP-like status for this device start attempt.","uniqueKey":"oneOf.0.results.items.[INDEX].status","typeLabel":"integer"},"message":{"type":"string","description":"Failure or status message for this device attempt.","uniqueKey":"oneOf.0.results.items.[INDEX].message","typeLabel":"string"},"error":{"type":"string","description":"Error returned for this device attempt, when present.","uniqueKey":"oneOf.0.results.items.[INDEX].error","typeLabel":"string"},"data":{"type":"object","description":"Upstream start response for this device, when present.","uniqueKey":"oneOf.0.results.items.[INDEX].data","typeLabel":"object"}},"uniqueKey":"oneOf.0.results.items.[INDEX]","typeLabel":"object"},"description":"Per-device start results for existing-test and test-plan requests.","uniqueKey":"oneOf.0.results","typeLabel":"object[]"},"device_runs":{"type":"array","items":{"type":"object","properties":{"device_label":{"type":"string","description":"Label of the configured device.","uniqueKey":"oneOf.0.device_runs.items.[INDEX].device_label","typeLabel":"string"},"ok":{"type":"boolean","description":"Whether the run started on this device.","uniqueKey":"oneOf.0.device_runs.items.[INDEX].ok","typeLabel":"boolean"},"status":{"type":"integer","description":"HTTP-like status for this device start attempt.","uniqueKey":"oneOf.0.device_runs.items.[INDEX].status","typeLabel":"integer"},"message":{"type":"string","description":"Failure or status message for this device attempt.","uniqueKey":"oneOf.0.device_runs.items.[INDEX].message","typeLabel":"string"},"error":{"type":"string","description":"Error returned for this device attempt, when present.","uniqueKey":"oneOf.0.device_runs.items.[INDEX].error","typeLabel":"string"},"data":{"type":"object","description":"Upstream start response for this device, when present.","uniqueKey":"oneOf.0.device_runs.items.[INDEX].data","typeLabel":"object"}},"uniqueKey":"oneOf.0.device_runs.items.[INDEX]","typeLabel":"object"},"description":"Per-device start results for ephemeral (`instructions`) requests.","uniqueKey":"oneOf.0.device_runs","typeLabel":"object[]"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","properties":{"error":{"type":"string","uniqueKey":"oneOf.1.error","typeLabel":"string"},"code":{"type":"string","uniqueKey":"oneOf.1.code","typeLabel":"string"},"details":{"type":"object","uniqueKey":"oneOf.1.details","typeLabel":"object"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"ok":true,"job_ids":["3c90c3cc-0d44-4b50-8888-8dd25736052a"],"build_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","test_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","test_plan_execution_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","slot_build_ids":{},"message":"\u003cstring>","requested_count":123,"started_count":123,"successful_count":123,"failed_count":123,"results":[{"device_label":"\u003cstring>","ok":true,"status":123,"message":"\u003cstring>","error":"\u003cstring>","data":{}}],"device_runs":[{"device_label":"\u003cstring>","ok":true,"status":123,"message":"\u003cstring>","error":"\u003cstring>","data":{}}]}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"44f1f26a-c835-4039-a305-45f5f3c1f6c7":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"API key for authentication","scopes":[],"schemeName":"apiKeyAuth"}}},"servers":{"b161a08e-c191-4bda-918d-220e6fca179f":{"url":"https://nunu.ai/api/v1"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"API key for authentication","scopes":[],"schemeName":"apiKeyAuth"},"schema":{"title":"X-Api-Key","type":"string","description":"API key for authentication","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKeyAuth","name":"X-Api-Key"}],"title":"apiKeyAuth"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"nunuai","siteName":"nunu.ai","title":"Start Test Plan Run - nunu.ai","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-26T12:12:16.097Z","originalFileLocation":"api-reference/test-plans/start-test-plan-run.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Start a run for a specific test plan.\">\u003cmeta data-mint-head name=\"application-name\" content=\"nunu.ai\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"noindex\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nunuai/CX_3dxSgbcmNqPIc/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/nunuai/CX_3dxSgbcmNqPIc/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nunuai/CX_3dxSgbcmNqPIc/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/nunuai/CX_3dxSgbcmNqPIc/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/nunuai/CX_3dxSgbcmNqPIc/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nunuai/CX_3dxSgbcmNqPIc/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nunuai/CX_3dxSgbcmNqPIc/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/nunuai/CX_3dxSgbcmNqPIc/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/nunuai/CX_3dxSgbcmNqPIc/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Start Test Plan Run - nunu.ai\">\u003cmeta data-mint-head property=\"og:description\" content=\"Start a run for a specific test plan.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"nunu.ai\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://api-docs.nunu.ai/api-reference/test-plans/start-test-plan-run\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://nunuai.mintlify.app/_mintlify/api/og/v2?division=Test+Plans\u0026amp;title=Start+Test+Plan+Run\u0026amp;description=Start+a+run+for+a+specific+test+plan.\u0026amp;theme=0d97650000a7b5dd625bee00\u0026amp;signature=6d6f13bd981eef1031ada33755d60dd7ddbe559c5a95869c460a644ea261ee18\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Start Test Plan Run - nunu.ai\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Start a run for a specific test plan.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://nunuai.mintlify.app/_mintlify/api/og/v2?division=Test+Plans\u0026amp;title=Start+Test+Plan+Run\u0026amp;description=Start+a+run+for+a+specific+test+plan.\u0026amp;theme=0d97650000a7b5dd625bee00\u0026amp;signature=6d6f13bd981eef1031ada33755d60dd7ddbe559c5a95869c460a644ea261ee18\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/nunuai/CX_3dxSgbcmNqPIc/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"nunu.ai\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#E55CD8\">\u003clink data-mint-head rel=\"canonical\" href=\"https://api-docs.nunu.ai/api-reference/test-plans/start-test-plan-run\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/test-plans/start-test-plan-run.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"nunu.ai\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"nunu.ai","nav":{"global":{"anchors":[{"anchor":"Nexus Documentation","icon":"newspaper","href":"https://docs.nunu.ai"}]},"tabs":[{"tab":"API Reference","groups":[{"group":"Overview","pages":[{"title":"Introduction","href":"/api-reference/introduction"},{"title":"Authentication","href":"/api-reference/authentication"}]},{"group":"Runs","pages":[{"title":"List Runs","openapi":"GET /project/{projectId}/runs","href":"/api-reference/runs/list-runs"},{"title":"Start a Run","openapi":"POST /project/{projectId}/runs","href":"/api-reference/runs/start-run"},{"title":"Get Run Details","openapi":"GET /project/{projectId}/runs/{runId}","href":"/api-reference/runs/get-run"},{"title":"Get Live Run Snapshot","openapi":"GET /project/{projectId}/runs/{runId}/live","href":"/api-reference/runs/get-live-run"},{"title":"List Run Bugs","openapi":"GET /project/{projectId}/runs/{runId}/bugs","href":"/api-reference/runs/list-bugs"},{"title":"Stop Runs","openapi":"POST /project/{projectId}/runs/stop","href":"/api-reference/runs/stop-runs"},{"title":"Export to TestRail","openapi":"POST /project/{projectId}/runs/export/testrail","href":"/api-reference/runs/export-testrail"}]},{"group":"Jobs","pages":[{"title":"List Jobs","openapi":"GET /project/{projectId}/jobs","href":"/api-reference/jobs/list-jobs"},{"title":"Get Job Details","openapi":"GET /project/{projectId}/jobs/{jobId}","href":"/api-reference/jobs/get-job"}]},{"group":"Bugs","pages":[{"title":"List Reviewed Bugs","openapi":"GET /project/{projectId}/bugs","href":"/api-reference/bugs/list-bugs"},{"title":"Get Reviewed Bug","openapi":"GET /project/{projectId}/bugs/{bugId}","href":"/api-reference/bugs/get-bug"}]},{"group":"Artifacts","pages":[{"title":"List Run Artifacts","openapi":"GET /runs/{runId}/artifacts","href":"/api-reference/artifacts/list-artifacts"},{"title":"Get Artifact File","openapi":"GET /runs/{runId}/artifacts/{filename}","href":"/api-reference/artifacts/get-artifact"}]},{"group":"Knowledge","pages":[{"title":"List Knowledge Files","openapi":"GET /file-storage/{projectId}","href":"/api-reference/knowledge/list-files"},{"title":"List Project-Scope Knowledge","openapi":"GET /file-storage/{projectId}/project","href":"/api-reference/knowledge/list-project-files"},{"title":"List Agent-Scope Knowledge","openapi":"GET /file-storage/{projectId}/agent/{agentId}","href":"/api-reference/knowledge/list-agent-files"},{"title":"List Test-Case-Scope Knowledge","openapi":"GET /file-storage/{projectId}/test_case/{testCaseId}","href":"/api-reference/knowledge/list-test-case-files"}]},{"group":"Tests","pages":[{"title":"List Tests","openapi":"GET /project/{projectId}/tests","href":"/api-reference/tests/list-tests"},{"title":"Get Test","openapi":"GET /project/{projectId}/tests/{testId}","href":"/api-reference/tests/get-test"},{"title":"Create Test","openapi":"POST /project/{projectId}/tests","href":"/api-reference/tests/create-test"},{"title":"Update Test","openapi":"PATCH /project/{projectId}/tests/{testId}","href":"/api-reference/tests/update-test"},{"title":"Delete Test","openapi":"DELETE /project/{projectId}/tests/{testId}","href":"/api-reference/tests/delete-test"}]},{"group":"Test Folders","pages":[{"title":"List Test Folders","openapi":"GET /project/{projectId}/test-folders","href":"/api-reference/test-folders/list-test-folders"},{"title":"Create Test Folder","openapi":"POST /project/{projectId}/test-folders","href":"/api-reference/test-folders/create-test-folder"}]},{"group":"Shared Steps","pages":[{"title":"List Shared Steps","openapi":"GET /project/{projectId}/shared-steps","href":"/api-reference/shared-steps/list-shared-steps"},{"title":"Get Shared Step","openapi":"GET /project/{projectId}/shared-steps/{sharedStepId}","href":"/api-reference/shared-steps/get-shared-step"},{"title":"Create Shared Step","openapi":"POST /project/{projectId}/shared-steps","href":"/api-reference/shared-steps/create-shared-step"},{"title":"Update Shared Step","openapi":"PATCH /project/{projectId}/shared-steps/{sharedStepId}","href":"/api-reference/shared-steps/update-shared-step"},{"title":"Delete Shared Step","openapi":"DELETE /project/{projectId}/shared-steps/{sharedStepId}","href":"/api-reference/shared-steps/delete-shared-step"}]},{"group":"Test Plans","pages":[{"title":"List Test Plans","openapi":"GET /project/{projectId}/test-plans","href":"/api-reference/test-plans/list-test-plans"},{"title":"Get Test Plan","openapi":"GET /project/{projectId}/test-plans/{testPlanId}","href":"/api-reference/test-plans/get-test-plan"},{"title":"Create Test Plan","openapi":"POST /project/{projectId}/test-plans","href":"/api-reference/test-plans/create-test-plan"},{"title":"Update Test Plan","openapi":"PATCH /project/{projectId}/test-plans/{testPlanId}","href":"/api-reference/test-plans/update-test-plan"},{"title":"Delete Test Plan","openapi":"DELETE /project/{projectId}/test-plans/{testPlanId}","description":"Delete a test plan.","href":"/api-reference/test-plans/delete-test-plan"},{"title":"Start Test Plan Run","openapi":"POST /project/{projectId}/test-plans/{testPlanId}/runs","href":"/api-reference/test-plans/start-test-plan-run"},{"title":"List Test Plan Executions","openapi":"GET /project/{projectId}/test-plan-executions","description":"Retrieve a paginated list of test plan executions for your project.","href":"/api-reference/test-plans/list-test-plan-executions"}]},{"group":"Configs","pages":[{"title":"List Agent Configs","openapi":"GET /project/{projectId}/agent-configs","href":"/api-reference/configs/list-agent-configs"},{"title":"List Deployment Configs","openapi":"GET /project/{projectId}/deployment-configs","href":"/api-reference/configs/list-deployment-configs"},{"title":"List Credential Kinds","openapi":"GET /project/{projectId}/credential-kinds","href":"/api-reference/configs/list-credential-kinds"}]},{"group":"Builds","pages":[{"title":"List Builds","openapi":"GET /project/{projectId}/builds","href":"/api-reference/builds/list-builds"},{"title":"Get Build Details","openapi":"GET /project/{projectId}/builds/{buildId}","href":"/api-reference/builds/get-build"},{"title":"Delete Build","openapi":"DELETE /project/{projectId}/builds/{buildId}","href":"/api-reference/builds/delete-build"},{"title":"Initiate Upload","openapi":"POST /project/{projectId}/builds/upload","href":"/api-reference/builds/initiate-upload"},{"title":"Get Upload URLs for Parts","openapi":"GET /project/{projectId}/builds/upload/parts","href":"/api-reference/builds/get-upload-parts"},{"title":"Complete Upload","openapi":"POST /project/{projectId}/builds/upload/complete","href":"/api-reference/builds/complete-upload"},{"title":"Cancel Upload","openapi":"DELETE /project/{projectId}/builds/upload","href":"/api-reference/builds/cancel-upload"}]},{"group":"Minions","pages":[{"title":"Download Minion","openapi":"GET /minions/download","href":"/api-reference/minions/download-minion"}]}]}]},"basePath":"","title":"Start Test Plan Run - nunu.ai","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CS552b7R.js","utils-DDTCYAF2.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-De8ttokP.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DrwRDvAh.js","snippetPresets-DtAN0nWx.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-D5rWArI6.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-O2i12wsz.js","shallow-DV8xABTt.js","getApiPlaygroundDisplay-DBZ0B5Jx.js","CodeSnippet-BVi0tPUX.js","CodeSnippets-CqASbIwY.js","Page-m07pfKpT.js","getPastedJson-DG9vsMS8.js","icon-CXzRSCr8.js","MethodPill-BdKVtEuX.js","DuplicateIcon-CZlmBrJI.js","createIcon-biFEUKPL.js","DynamicMarkdown-B54_zNBF.js","SectionHeading-DwwHK3Pt.js","axios-vUo_bRtp.js","Markdown-DfhCTwyA.js","clsx-xpJZXxdP.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BTZUMDnx.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-DqdKa2R4.js"]}