Get the status and per-test results of a run. Pass the runId that POST /tests/execute returned.
Poll until status is completed or cancelled. Each test is then in succeededTests, failedTests or blockedTests, unless it was cancelled. While the run is in progress, runningTests lists the tests that are on a device and queuedTests the ones waiting for one. A test that is being set up, or re-checked after a failure, is in none of the lists for that time, so the lists can add up to less than totalTests.
skippedTests lists the tests that matched tags when the run was started but were not runnable on its platform yet, so they were left out. They are not counted in totalTests and never change the run’s status.
When to start polling.POST /tests/execute returns just before the run is saved. The run is usually saved within half a second, so wait 2 seconds before your first call. If it answers 404, retry every 2 seconds. A 404 that lasts longer than 30 seconds means the run was not created: check the runId, then start the run again.
While status is initial, tests are still being added to the run, so totalTests can still grow. This takes under a second for a run of a few tests, and up to about 10 seconds for a run of 100 tests. Once the run is running, polling every 15 to 30 seconds is enough.
The organisation is taken from your API key. A run that belongs to another organisation answers 404, the same as a run that does not exist.
Overall status of the run: initial while it is being set up, running, then completed or cancelled once every test has finished. A completed run can still contain failed tests: read the lists below for the results.
Tests that matched tags but were left out of the run because they were not runnable on its platform yet. Not counted in totalTests, and never a reason to fail the run.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"MobileBoost","colors":{"primary":"#16A34A","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/mobileboost-321ad6a9/OGuA69W71_lGnu9x/logo/light.png?fit=max\u0026auto=format\u0026n=OGuA69W71_lGnu9x\u0026q=85\u0026s=b6a6cc5ef5708fb7e589eb22c4e758e5","dark":"https://mintcdn.com/mobileboost-321ad6a9/BUpecZhwuqipr6rG/logo/dark.png?fit=max\u0026auto=format\u0026n=BUpecZhwuqipr6rG\u0026q=85\u0026s=fa051814a401e3fac77cd87f86f198b5"},"favicon":"https://mintcdn.com/mobileboost-321ad6a9/6v1OHjEJe7b4HZwT/favicon.png?fit=max\u0026auto=format\u0026n=6v1OHjEJe7b4HZwT\u0026q=85\u0026s=f0fa31f2c8ddd8d4e252cd3702d4f0c4","api":{"playground":{"display":"interactive"}},"footer":{"socials":{}},"seo":{},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"metadata":{"timestamp":false},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"mobileboost-321ad6a9","hasAudioNarration":false,"actualSubdomain":"mobileboost-321ad6a9","customDomains":["docs.mobileboost.io"],"gitSource":{"type":"github","owner":"mobileboosthq","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"entitlements":{},"buildId":"6af450ddbc2b4cf012828780","clientVersion":"0.0.4111","searchFilterCounts":[{"language":"default","tag":"Local Tooling","count":21},{"language":"default","tag":"API","count":19},{"language":"default","tag":"SDK","count":18},{"language":"default","tag":"Test Agent","count":15},{"language":"default","tag":"QA Studio","count":14},{"language":"default","tag":"Appium","count":11},{"language":"default","tag":"No-code test editor","count":7},{"language":"default","tag":"Test execution","count":7},{"language":"default","tag":"Tests","count":6},{"language":"default","tag":"Folders","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":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":"custom-rbac-roles","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":"rbac-expansion","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":"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":"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":"editor-metadata","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},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"changelog.css","content":".changelog-filters{display:flex;flex-wrap:wrap;gap:0.5rem;margin:1.5rem 0 2rem}.changelog-chip{padding:0.25rem 0.75rem;font-size:0.8125rem;line-height:1.4;border-radius:9999px;border:1px solid rgb(229 231 235);background:transparent;color:rgb(75 85 99);cursor:pointer;transition:background-color 0.12s ease, color 0.12s ease, border-color 0.12s ease}.changelog-chip:hover{background:rgb(243 244 246);color:rgb(17 24 39)}.changelog-chip.is-active{background:#16a34a;background:rgb(var(--primary));border-color:#16a34a;border-color:rgb(var(--primary));color:#fff}.changelog-list{border-top:1px solid rgb(229 231 235)}.changelog-row{display:block;padding:1rem 0.75rem;margin:0 -0.75rem;border-bottom:1px solid rgb(229 231 235);text-decoration:none!important;color:inherit;border-radius:0.375rem;transition:background-color 0.12s ease}.changelog-row:hover{background:rgb(249 250 251)}.changelog-row-head{display:flex;align-items:baseline;justify-content:space-between;gap:1.5rem}.changelog-row-title{font-weight:600;font-size:1rem;line-height:1.5;color:rgb(17 24 39)}.changelog-row:hover .changelog-row-title{color:#16a34a;color:rgb(var(--primary))}.changelog-row-date{flex:none;font-size:0.8125rem;color:rgb(107 114 128);white-space:nowrap}.changelog-row-desc{margin:0.25rem 0 0;font-size:0.875rem;font-weight:400;line-height:1.6;color:rgb(107 114 128);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.changelog-meta{display:flex;flex-wrap:wrap;align-items:center;gap:0.75rem;margin-bottom:2rem;font-size:0.8125rem;color:rgb(107 114 128)}.changelog-meta span{padding:0.125rem 0.5rem;border-radius:9999px;background:rgb(243 244 246);color:rgb(75 85 99)}.changelog-back{margin-top:3rem;padding-top:1.5rem;border-top:1px solid rgb(229 231 235);font-size:0.875rem}.changelog-back p{margin:0}.changelog-back a::before{content:\"\\2190\\00a0\"}.dark .changelog-chip{border-color:rgb(55 65 81);color:rgb(156 163 175)}.dark .changelog-chip:hover{background:rgb(31 41 55);color:rgb(243 244 246)}.dark .changelog-chip.is-active{color:#fff}.dark .changelog-list,.dark .changelog-row,.dark .changelog-back{border-color:rgb(38 45 58)}.dark .changelog-row:hover{background:rgb(24 30 40)}.dark .changelog-row-title{color:rgb(243 244 246)}.dark .changelog-row-date,.dark .changelog-row-desc,.dark .changelog-meta{color:rgb(148 156 168)}.dark .changelog-meta span{background:rgb(31 41 55);color:rgb(203 213 225)}@media (max-width: 640px){.changelog-row-head{display:block}.changelog-row-date{display:block;margin-top:0.25rem}}.changelog-pager{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-top:2rem;flex-wrap:wrap}.changelog-pager-pages{display:flex;gap:0.25rem;flex-wrap:wrap}.changelog-pager-step,.changelog-pager-page{min-width:2rem;padding:0.3rem 0.75rem;font-size:0.8125rem;line-height:1.4;border-radius:0.375rem;border:1px solid rgb(229 231 235);background:transparent;color:rgb(75 85 99);cursor:pointer;transition:background-color 0.12s ease, color 0.12s ease, border-color 0.12s ease}.changelog-pager-step:hover:not(:disabled),.changelog-pager-page:hover:not(.is-active){background:rgb(243 244 246);color:rgb(17 24 39)}.changelog-pager-step:disabled{opacity:0.4;cursor:default}.changelog-pager-page.is-active{background:#16a34a;background:rgb(var(--primary));border-color:#16a34a;border-color:rgb(var(--primary));color:#fff}.dark .changelog-pager-step,.dark .changelog-pager-page{border-color:rgb(55 65 81);color:rgb(156 163 175)}.dark .changelog-pager-step:hover:not(:disabled),.dark .changelog-pager-page:hover:not(.is-active){background:rgb(31 41 55);color:rgb(243 244 246)}.dark .changelog-pager-page.is-active{color:#fff}"}],"page":{"pagePath":"api-reference/get-run-status","slug":"/api-reference/get-run-status","pageMetadata":{"title":"Get run status","description":"Get the status and per-test results of a run. Pass the `runId` that `POST /tests/execute` returned.\n\nPoll until `status` is `completed` or `cancelled`. Each test is then in `succeededTests`, `failedTests` or `blockedTests`, unless it was cancelled. While the run is in progress, `runningTests` lists the tests that are on a device and `queuedTests` the ones waiting for one. A test that is being set up, or re-checked after a failure, is in none of the lists for that time, so the lists can add up to less than `totalTests`.\n\n`skippedTests` lists the tests that matched `tags` when the run was started but were not runnable on its platform yet, so they were left out. They are not counted in `totalTests` and never change the run's `status`.\n\n**When to start polling.** `POST /tests/execute` returns just before the run is saved. The run is usually saved within half a second, so wait 2 seconds before your first call. If it answers 404, retry every 2 seconds. A 404 that lasts longer than 30 seconds means the run was not created: check the `runId`, then start the run again.\n\nWhile `status` is `initial`, tests are still being added to the run, so `totalTests` can still grow. This takes under a second for a run of a few tests, and up to about 10 seconds for a run of 100 tests. Once the run is `running`, polling every 15 to 30 seconds is enough.\n\nThe organisation is taken from your API key. A run that belongs to another organisation answers 404, the same as a run that does not exist.","deprecated":null,"version":null,"openapi":"/openapi.json get /runs/{runId}","href":"/api-reference/get-run-status","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Get the status and per-test results of a run. Pass the \", _jsx(_components.code, {\n children: \"runId\"\n }), \" that \", _jsx(_components.code, {\n children: \"POST /tests/execute\"\n }), \" returned.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Poll until \", _jsx(_components.code, {\n children: \"status\"\n }), \" is \", _jsx(_components.code, {\n children: \"completed\"\n }), \" or \", _jsx(_components.code, {\n children: \"cancelled\"\n }), \". Each test is then in \", _jsx(_components.code, {\n children: \"succeededTests\"\n }), \", \", _jsx(_components.code, {\n children: \"failedTests\"\n }), \" or \", _jsx(_components.code, {\n children: \"blockedTests\"\n }), \", unless it was cancelled. While the run is in progress, \", _jsx(_components.code, {\n children: \"runningTests\"\n }), \" lists the tests that are on a device and \", _jsx(_components.code, {\n children: \"queuedTests\"\n }), \" the ones waiting for one. A test that is being set up, or re-checked after a failure, is in none of the lists for that time, so the lists can add up to less than \", _jsx(_components.code, {\n children: \"totalTests\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"skippedTests\"\n }), \" lists the tests that matched \", _jsx(_components.code, {\n children: \"tags\"\n }), \" when the run was started but were not runnable on its platform yet, so they were left out. They are not counted in \", _jsx(_components.code, {\n children: \"totalTests\"\n }), \" and never change the run’s \", _jsx(_components.code, {\n children: \"status\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"When to start polling.\"\n }), \" \", _jsx(_components.code, {\n children: \"POST /tests/execute\"\n }), \" returns just before the run is saved. The run is usually saved within half a second, so wait 2 seconds before your first call. If it answers 404, retry every 2 seconds. A 404 that lasts longer than 30 seconds means the run was not created: check the \", _jsx(_components.code, {\n children: \"runId\"\n }), \", then start the run again.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"While \", _jsx(_components.code, {\n children: \"status\"\n }), \" is \", _jsx(_components.code, {\n children: \"initial\"\n }), \", tests are still being added to the run, so \", _jsx(_components.code, {\n children: \"totalTests\"\n }), \" can still grow. This takes under a second for a run of a few tests, and up to about 10 seconds for a run of 100 tests. Once the run is \", _jsx(_components.code, {\n children: \"running\"\n }), \", polling every 15 to 30 seconds is enough.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"The organisation is taken from your API key. A run that belongs to another organisation answers 404, the same as a run that does not exist.\"\n })]\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}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Get run status","description":"Get the status and per-test results of a run. Pass the `runId` that `POST /tests/execute` returned.\n\nPoll until `status` is `completed` or `cancelled`. Each test is then in `succeededTests`, `failedTests` or `blockedTests`, unless it was cancelled. While the run is in progress, `runningTests` lists the tests that are on a device and `queuedTests` the ones waiting for one. A test that is being set up, or re-checked after a failure, is in none of the lists for that time, so the lists can add up to less than `totalTests`.\n\n`skippedTests` lists the tests that matched `tags` when the run was started but were not runnable on its platform yet, so they were left out. They are not counted in `totalTests` and never change the run's `status`.\n\n**When to start polling.** `POST /tests/execute` returns just before the run is saved. The run is usually saved within half a second, so wait 2 seconds before your first call. If it answers 404, retry every 2 seconds. A 404 that lasts longer than 30 seconds means the run was not created: check the `runId`, then start the run again.\n\nWhile `status` is `initial`, tests are still being added to the run, so `totalTests` can still grow. This takes under a second for a run of a few tests, and up to about 10 seconds for a run of 100 tests. Once the run is `running`, polling every 15 to 30 seconds is enough.\n\nThe organisation is taken from your API key. A run that belongs to another organisation answers 404, the same as a run that does not exist.","deprecated":null,"version":null,"openapi":"/openapi.json get /runs/{runId}","href":"/api-reference/get-run-status","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Get run status","description":"Get the status and per-test results of a run. Pass the `runId` that `POST /tests/execute` returned.\n\nPoll until `status` is `completed` or `cancelled`. Each test is then in `succeededTests`, `failedTests` or `blockedTests`, unless it was cancelled. While the run is in progress, `runningTests` lists the tests that are on a device and `queuedTests` the ones waiting for one. A test that is being set up, or re-checked after a failure, is in none of the lists for that time, so the lists can add up to less than `totalTests`.\n\n`skippedTests` lists the tests that matched `tags` when the run was started but were not runnable on its platform yet, so they were left out. They are not counted in `totalTests` and never change the run's `status`.\n\n**When to start polling.** `POST /tests/execute` returns just before the run is saved. The run is usually saved within half a second, so wait 2 seconds before your first call. If it answers 404, retry every 2 seconds. A 404 that lasts longer than 30 seconds means the run was not created: check the `runId`, then start the run again.\n\nWhile `status` is `initial`, tests are still being added to the run, so `totalTests` can still grow. This takes under a second for a run of a few tests, and up to about 10 seconds for a run of 100 tests. Once the run is `running`, polling every 15 to 30 seconds is enough.\n\nThe organisation is taken from your API key. A run that belongs to another organisation answers 404, the same as a run that does not exist.","operationId":"get_run_status","parameters":["ee018e85-4eb3-4a21-afb0-889291410acd"],"responses":{"200":"fee18dc5-fbcf-47a1-a96e-da4bc092c2a2","401":"55224057-df0a-4494-85be-b2655c00251c","404":"27f66cd3-e4b9-43bd-8e65-37e46e35d514"},"method":"get","type":"path","servers":["31979921-3f5d-458f-a621-e5d47d63d435"],"security":["a850a53c-b5e8-41a3-aa4e-562819e828db"],"path":"/runs/{runId}","baseUrlOptions":["https://api.mobileboost.io"],"title":"Get run status","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"ee018e85-4eb3-4a21-afb0-889291410acd":{"required":true,"schema":{"title":"Run ID","type":"string","isRequired":true,"description":"The `runId` returned by `POST /tests/execute`.","uniqueKey":"","typeLabel":"string"},"name":"runId","in":"path","description":"The `runId` returned by `POST /tests/execute`."}},"responses":{"fee18dc5-fbcf-47a1-a96e-da4bc092c2a2":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","description":"The ID of the run.","isRequired":true,"uniqueKey":"runId","typeLabel":"string"},"status":{"type":"string","description":"Overall status of the run: `initial` while it is being set up, `running`, then `completed` or `cancelled` once every test has finished. A completed run can still contain failed tests: read the lists below for the results.","isRequired":true,"uniqueKey":"status","typeLabel":"string"},"totalTests":{"type":"integer","description":"Number of tests in the run.","isRequired":true,"uniqueKey":"totalTests","typeLabel":"integer"},"succeededTests":{"type":"array","items":{"title":"TestRunResult","type":"object","properties":{"id":{"type":"string","description":"The ID of this test's execution within the run. This is not the test ID.","uniqueKey":"succeededTests.items.[INDEX].id","typeLabel":"string"},"title":{"type":"string","description":"The name of the test's automation file.","uniqueKey":"succeededTests.items.[INDEX].title","typeLabel":"string"},"status":{"type":"string","description":"`succeeded`, `failed`, `blocked`, `running` or `queued`, matching the list the entry is in.","uniqueKey":"succeededTests.items.[INDEX].status","typeLabel":"string"},"runtimeSeconds":{"oneOf":[{"type":"integer","description":"Time this test spent on a device, in seconds. `null` until it reaches one.","uniqueKey":"succeededTests.items.[INDEX].runtimeSeconds.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Time this test spent on a device, in seconds. `null` until it reaches one.","uniqueKey":"succeededTests.items.[INDEX].runtimeSeconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"succeededTests.items.[INDEX].runtimeSeconds","typeLabel":"integer | null"},"recording":{"type":"string","description":"The test's report in the MobileBoost Platform, with its recording, steps and logs.","uniqueKey":"succeededTests.items.[INDEX].recording","typeLabel":"string"}},"uniqueKey":"succeededTests.items.[INDEX]","typeLabel":"TestRunResult · object"},"description":"Tests that passed.","isRequired":true,"uniqueKey":"succeededTests","typeLabel":"TestRunResult · object[]"},"failedTests":{"type":"array","items":{"title":"TestRunResult","type":"object","properties":{"id":{"type":"string","description":"The ID of this test's execution within the run. This is not the test ID.","uniqueKey":"failedTests.items.[INDEX].id","typeLabel":"string"},"title":{"type":"string","description":"The name of the test's automation file.","uniqueKey":"failedTests.items.[INDEX].title","typeLabel":"string"},"status":{"type":"string","description":"`succeeded`, `failed`, `blocked`, `running` or `queued`, matching the list the entry is in.","uniqueKey":"failedTests.items.[INDEX].status","typeLabel":"string"},"runtimeSeconds":{"oneOf":[{"type":"integer","description":"Time this test spent on a device, in seconds. `null` until it reaches one.","uniqueKey":"failedTests.items.[INDEX].runtimeSeconds.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Time this test spent on a device, in seconds. `null` until it reaches one.","uniqueKey":"failedTests.items.[INDEX].runtimeSeconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"failedTests.items.[INDEX].runtimeSeconds","typeLabel":"integer | null"},"recording":{"type":"string","description":"The test's report in the MobileBoost Platform, with its recording, steps and logs.","uniqueKey":"failedTests.items.[INDEX].recording","typeLabel":"string"}},"uniqueKey":"failedTests.items.[INDEX]","typeLabel":"TestRunResult · object"},"description":"Tests that failed.","isRequired":true,"uniqueKey":"failedTests","typeLabel":"TestRunResult · object[]"},"blockedTests":{"type":"array","items":{"title":"TestRunResult","type":"object","properties":{"id":{"type":"string","description":"The ID of this test's execution within the run. This is not the test ID.","uniqueKey":"blockedTests.items.[INDEX].id","typeLabel":"string"},"title":{"type":"string","description":"The name of the test's automation file.","uniqueKey":"blockedTests.items.[INDEX].title","typeLabel":"string"},"status":{"type":"string","description":"`succeeded`, `failed`, `blocked`, `running` or `queued`, matching the list the entry is in.","uniqueKey":"blockedTests.items.[INDEX].status","typeLabel":"string"},"runtimeSeconds":{"oneOf":[{"type":"integer","description":"Time this test spent on a device, in seconds. `null` until it reaches one.","uniqueKey":"blockedTests.items.[INDEX].runtimeSeconds.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Time this test spent on a device, in seconds. `null` until it reaches one.","uniqueKey":"blockedTests.items.[INDEX].runtimeSeconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"blockedTests.items.[INDEX].runtimeSeconds","typeLabel":"integer | null"},"recording":{"type":"string","description":"The test's report in the MobileBoost Platform, with its recording, steps and logs.","uniqueKey":"blockedTests.items.[INDEX].recording","typeLabel":"string"}},"uniqueKey":"blockedTests.items.[INDEX]","typeLabel":"TestRunResult · object"},"description":"Tests that could not run to a result, for example because no device became available. A blocked test says nothing about your app.","isRequired":true,"uniqueKey":"blockedTests","typeLabel":"TestRunResult · object[]"},"runningTests":{"type":"array","items":{"title":"TestRunResult","type":"object","properties":{"id":{"type":"string","description":"The ID of this test's execution within the run. This is not the test ID.","uniqueKey":"runningTests.items.[INDEX].id","typeLabel":"string"},"title":{"type":"string","description":"The name of the test's automation file.","uniqueKey":"runningTests.items.[INDEX].title","typeLabel":"string"},"status":{"type":"string","description":"`succeeded`, `failed`, `blocked`, `running` or `queued`, matching the list the entry is in.","uniqueKey":"runningTests.items.[INDEX].status","typeLabel":"string"},"runtimeSeconds":{"oneOf":[{"type":"integer","description":"Time this test spent on a device, in seconds. `null` until it reaches one.","uniqueKey":"runningTests.items.[INDEX].runtimeSeconds.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Time this test spent on a device, in seconds. `null` until it reaches one.","uniqueKey":"runningTests.items.[INDEX].runtimeSeconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"runningTests.items.[INDEX].runtimeSeconds","typeLabel":"integer | null"},"recording":{"type":"string","description":"The test's report in the MobileBoost Platform, with its recording, steps and logs.","uniqueKey":"runningTests.items.[INDEX].recording","typeLabel":"string"}},"uniqueKey":"runningTests.items.[INDEX]","typeLabel":"TestRunResult · object"},"description":"Tests that are running on a device now.","isRequired":true,"uniqueKey":"runningTests","typeLabel":"TestRunResult · object[]"},"queuedTests":{"type":"array","items":{"title":"TestRunResult","type":"object","properties":{"id":{"type":"string","description":"The ID of this test's execution within the run. This is not the test ID.","uniqueKey":"queuedTests.items.[INDEX].id","typeLabel":"string"},"title":{"type":"string","description":"The name of the test's automation file.","uniqueKey":"queuedTests.items.[INDEX].title","typeLabel":"string"},"status":{"type":"string","description":"`succeeded`, `failed`, `blocked`, `running` or `queued`, matching the list the entry is in.","uniqueKey":"queuedTests.items.[INDEX].status","typeLabel":"string"},"runtimeSeconds":{"oneOf":[{"type":"integer","description":"Time this test spent on a device, in seconds. `null` until it reaches one.","uniqueKey":"queuedTests.items.[INDEX].runtimeSeconds.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Time this test spent on a device, in seconds. `null` until it reaches one.","uniqueKey":"queuedTests.items.[INDEX].runtimeSeconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"queuedTests.items.[INDEX].runtimeSeconds","typeLabel":"integer | null"},"recording":{"type":"string","description":"The test's report in the MobileBoost Platform, with its recording, steps and logs.","uniqueKey":"queuedTests.items.[INDEX].recording","typeLabel":"string"}},"uniqueKey":"queuedTests.items.[INDEX]","typeLabel":"TestRunResult · object"},"description":"Tests waiting for a device.","isRequired":true,"uniqueKey":"queuedTests","typeLabel":"TestRunResult · object[]"},"runtimeSeconds":{"oneOf":[{"type":"integer","description":"The run's wall-clock time in seconds, counted from when its first test reached a device. `null` until one has.","uniqueKey":"runtimeSeconds.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The run's wall-clock time in seconds, counted from when its first test reached a device. `null` until one has.","uniqueKey":"runtimeSeconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"runtimeSeconds","typeLabel":"integer | null"},"skippedTests":{"type":"array","items":{"title":"SkippedTest","type":"object","properties":{"testId":{"type":"string","description":"The ID of the test, as in `GET /tests`.","uniqueKey":"skippedTests.items.[INDEX].testId","typeLabel":"string"},"title":{"type":"string","description":"The test's title.","uniqueKey":"skippedTests.items.[INDEX].title","typeLabel":"string"},"platform":{"type":"string","description":"The run's platform, `ios` or `android`, which the test is not runnable on yet.","uniqueKey":"skippedTests.items.[INDEX].platform","typeLabel":"string"},"reason":{"type":"string","enum":["not_automated","generation_in_progress","generation_failed","generation_blocked","not_ready"],"description":"Why the test was skipped. `not_automated`: no automation has been generated for it yet. `generation_in_progress`: its automation for this platform is being written or is queued. `generation_failed`: writing it for this platform failed. `generation_blocked`: writing it stopped and is waiting on an answer from you. `not_ready`: it is not runnable on this platform for another reason.","uniqueKey":"skippedTests.items.[INDEX].reason","typeLabel":"enum\u003cstring>"},"detail":{"type":"string","description":"The reason as a sentence, for a log or a message.","uniqueKey":"skippedTests.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"skippedTests.items.[INDEX]","typeLabel":"SkippedTest · object"},"description":"Tests that matched `tags` but were left out of the run because they were not runnable on its platform yet. Not counted in `totalTests`, and never a reason to fail the run.","uniqueKey":"skippedTests","typeLabel":"SkippedTest · object[]"}},"required":["runId","status","totalTests","succeededTests","failedTests","blockedTests","runningTests","queuedTests"],"uniqueKey":"","typeLabel":"object"},"example":{"runId":"b1111111df174791a93e560390ea7e65","status":"completed","totalTests":2,"runtimeSeconds":212,"succeededTests":[{"id":"e4a1c7f09b2d4e56a8f3c1d2b7e90a11","title":"test_login_flow.py","status":"succeeded","runtimeSeconds":94,"recording":"https://platform.mobileboost.io/reports/b1111111df174791a93e560390ea7e65/e4a1c7f09b2d4e56a8f3c1d2b7e90a11"}],"failedTests":[{"id":"7c2e9d10a4b84f3e9e5d6a7b8c9d0e12","title":"test_checkout_flow.py","status":"failed","runtimeSeconds":118,"recording":"https://platform.mobileboost.io/reports/b1111111df174791a93e560390ea7e65/7c2e9d10a4b84f3e9e5d6a7b8c9d0e12"}],"blockedTests":[],"runningTests":[],"queuedTests":[],"skippedTests":[]},"examples":{"Example":{"title":"Example","value":{"runId":"b1111111df174791a93e560390ea7e65","status":"completed","totalTests":2,"runtimeSeconds":212,"succeededTests":[{"id":"e4a1c7f09b2d4e56a8f3c1d2b7e90a11","title":"test_login_flow.py","status":"succeeded","runtimeSeconds":94,"recording":"https://platform.mobileboost.io/reports/b1111111df174791a93e560390ea7e65/e4a1c7f09b2d4e56a8f3c1d2b7e90a11"}],"failedTests":[{"id":"7c2e9d10a4b84f3e9e5d6a7b8c9d0e12","title":"test_checkout_flow.py","status":"failed","runtimeSeconds":118,"recording":"https://platform.mobileboost.io/reports/b1111111df174791a93e560390ea7e65/7c2e9d10a4b84f3e9e5d6a7b8c9d0e12"}],"blockedTests":[],"runningTests":[],"queuedTests":[],"skippedTests":[]}}},"exampleType":"examples"}},"exampleType":"examples"},"55224057-df0a-4494-85be-b2655c00251c":{"description":"The API key is missing or invalid.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"27f66cd3-e4b9-43bd-8e65-37e46e35d514":{"description":"No run with this ID in your organisation. Right after `POST /tests/execute`, the run may not be saved yet: retry every 2 seconds. A 404 after 30 seconds means the run was not created.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{"a850a53c-b5e8-41a3-aa4e-562819e828db":{"BearerAuth":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"BearerAuth"}}},"servers":{"31979921-3f5d-458f-a621-e5d47d63d435":{"url":"https://api.mobileboost.io"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"BearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"BearerAuth"}]},"originalFileLocation":"openapi.json"},"subdomain":"mobileboost-321ad6a9","siteName":"MobileBoost","title":"Get run status - MobileBoost","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-07T21:00:15.289Z","originalFileLocation":"api-reference/get-run-status.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=\"Get the status and per-test results of a run. Pass the runId that POST /tests/execute returned. Poll until status is completed or cancelled. Each test is then in succeededTests, failedTests or blockedTests, unless it was cancelled. While the run is in progress, runningTests lists the tests that are on a device and queuedTests the ones waiting for one. A test that is being set up, or re-checked after a failure, is in none of the lists for that time, so the lists can add up to less than totalTests. skippedTests lists the tests that matched tags when the run was started but were not runnable on its platform yet, so they were left out. They are not counted in totalTests and never change the run\u0026#x27;s status. When to start polling. POST /tests/execute returns just before the run is saved. The run is usually saved within half a second, so wait 2 seconds before your first call. If it answers 404, retry every 2 seconds. A 404 that lasts longer than 30 seconds means the run was not created: check the runId, then start the run again. While status is initial, tests are still being added to the run, so totalTests can still grow. This takes under a second for a run of a few tests, and up to about 10 seconds for a run of 100 tests. Once the run is running, polling every 15 to 30 seconds is enough. The organisation is taken from your API key. A run that belongs to another organisation answers 404, the same as a run that does not exist.\">\u003cmeta data-mint-head name=\"application-name\" content=\"MobileBoost\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/mobileboost-321ad6a9/OkIIS1ivp_fMe1gq/_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/mobileboost-321ad6a9/OkIIS1ivp_fMe1gq/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/mobileboost-321ad6a9/OkIIS1ivp_fMe1gq/_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/mobileboost-321ad6a9/OkIIS1ivp_fMe1gq/_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/mobileboost-321ad6a9/OkIIS1ivp_fMe1gq/_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/mobileboost-321ad6a9/OkIIS1ivp_fMe1gq/_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/mobileboost-321ad6a9/OkIIS1ivp_fMe1gq/_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/mobileboost-321ad6a9/OkIIS1ivp_fMe1gq/_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/mobileboost-321ad6a9/OkIIS1ivp_fMe1gq/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Get run status - MobileBoost\">\u003cmeta data-mint-head property=\"og:description\" content=\"Get the status and per-test results of a run. Pass the runId that POST /tests/execute returned. Poll until status is completed or cancelled. Each test is then in succeededTests, failedTests or blockedTests, unless it was cancelled. While the run is in progress, runningTests lists the tests that are on a device and queuedTests the ones waiting for one. A test that is being set up, or re-checked after a failure, is in none of the lists for that time, so the lists can add up to less than totalTests. skippedTests lists the tests that matched tags when the run was started but were not runnable on its platform yet, so they were left out. They are not counted in totalTests and never change the run\u0026#x27;s status. When to start polling. POST /tests/execute returns just before the run is saved. The run is usually saved within half a second, so wait 2 seconds before your first call. If it answers 404, retry every 2 seconds. A 404 that lasts longer than 30 seconds means the run was not created: check the runId, then start the run again. While status is initial, tests are still being added to the run, so totalTests can still grow. This takes under a second for a run of a few tests, and up to about 10 seconds for a run of 100 tests. Once the run is running, polling every 15 to 30 seconds is enough. The organisation is taken from your API key. A run that belongs to another organisation answers 404, the same as a run that does not exist.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"MobileBoost\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.mobileboost.io/api-reference/get-run-status\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://mobileboost-321ad6a9.mintlify.site/_mintlify/api/og/v2?division=Runs\u0026amp;title=Get+run+status\u0026amp;description=Get+the+status+and+per-test+results+of+a+run.+Pass+the+%60runId%60+that+%60POST+%2Ftests%2Fexecute%60+returned.%0A%0APoll+until+%60status%60+is+%60completed%60+or+%60cancelled%60.+Each+tes\u0026amp;theme=9bbbaeabc0a28eadb8dda608\u0026amp;signature=bbcdc5aa3a5fed7f680aba109085285ea28964e439702059f9e80bb63e46cc31\">\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=\"Get run status - MobileBoost\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Get the status and per-test results of a run. Pass the runId that POST /tests/execute returned. Poll until status is completed or cancelled. Each test is then in succeededTests, failedTests or blockedTests, unless it was cancelled. While the run is in progress, runningTests lists the tests that are on a device and queuedTests the ones waiting for one. A test that is being set up, or re-checked after a failure, is in none of the lists for that time, so the lists can add up to less than totalTests. skippedTests lists the tests that matched tags when the run was started but were not runnable on its platform yet, so they were left out. They are not counted in totalTests and never change the run\u0026#x27;s status. When to start polling. POST /tests/execute returns just before the run is saved. The run is usually saved within half a second, so wait 2 seconds before your first call. If it answers 404, retry every 2 seconds. A 404 that lasts longer than 30 seconds means the run was not created: check the runId, then start the run again. While status is initial, tests are still being added to the run, so totalTests can still grow. This takes under a second for a run of a few tests, and up to about 10 seconds for a run of 100 tests. Once the run is running, polling every 15 to 30 seconds is enough. The organisation is taken from your API key. A run that belongs to another organisation answers 404, the same as a run that does not exist.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://mobileboost-321ad6a9.mintlify.site/_mintlify/api/og/v2?division=Runs\u0026amp;title=Get+run+status\u0026amp;description=Get+the+status+and+per-test+results+of+a+run.+Pass+the+%60runId%60+that+%60POST+%2Ftests%2Fexecute%60+returned.%0A%0APoll+until+%60status%60+is+%60completed%60+or+%60cancelled%60.+Each+tes\u0026amp;theme=9bbbaeabc0a28eadb8dda608\u0026amp;signature=bbcdc5aa3a5fed7f680aba109085285ea28964e439702059f9e80bb63e46cc31\">\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/mobileboost-321ad6a9/OkIIS1ivp_fMe1gq/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"MobileBoost\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#16A34A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.mobileboost.io/api-reference/get-run-status\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/get-run-status.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.mobileboost.io/#organization\",\"name\":\"MobileBoost\",\"url\":\"https://docs.mobileboost.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/mobileboost-321ad6a9/OGuA69W71_lGnu9x/logo/light.png?fit=max\u0026auto=format\u0026n=OGuA69W71_lGnu9x\u0026q=85\u0026s=b6a6cc5ef5708fb7e589eb22c4e758e5\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.mobileboost.io#website\",\"name\":\"MobileBoost\",\"url\":\"https://docs.mobileboost.io\",\"publisher\":{\"@id\":\"https://docs.mobileboost.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.mobileboost.io/api-reference/get-run-status#webpage\",\"url\":\"https://docs.mobileboost.io/api-reference/get-run-status\",\"name\":\"Get run status\",\"description\":\"Get the status and per-test results of a run. Pass the runId that POST /tests/execute returned. Poll until status is completed or cancelled. Each test is then in succeededTests, failedTests or blockedTests, unless it was cancelled. While the run is in progress, runningTests lists the tests that are on a device and queuedTests the ones waiting for one. A test that is being set up, or re-checked after a failure, is in none of the lists for that time, so the lists can add up to less than totalTests. skippedTests lists the tests that matched tags when the run was started but were not runnable on its platform yet, so they were left out. They are not counted in totalTests and never change the run's status. When to start polling. POST /tests/execute returns just before the run is saved. The run is usually saved within half a second, so wait 2 seconds before your first call. If it answers 404, retry every 2 seconds. A 404 that lasts longer than 30 seconds means the run was not created: check the runId, then start the run again. While status is initial, tests are still being added to the run, so totalTests can still grow. This takes under a second for a run of a few tests, and up to about 10 seconds for a run of 100 tests. Once the run is running, polling every 15 to 30 seconds is enough. The organisation is taken from your API key. A run that belongs to another organisation answers 404, the same as a run that does not exist.\",\"dateModified\":\"2026-10-07T21:00:15.289Z\",\"isPartOf\":{\"@id\":\"https://docs.mobileboost.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.mobileboost.io/api-reference/get-run-status#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.mobileboost.io/api-reference/get-run-status#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"MobileBoost\",\"item\":\"https://docs.mobileboost.io\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Get run status\",\"item\":\"https://docs.mobileboost.io/api-reference/get-run-status\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.mobileboost.io/api-reference/get-run-status#apireference\",\"headline\":\"Get run status\",\"name\":\"Get run status\",\"description\":\"Get the status and per-test results of a run. Pass the runId that POST /tests/execute returned. Poll until status is completed or cancelled. Each test is then in succeededTests, failedTests or blockedTests, unless it was cancelled. While the run is in progress, runningTests lists the tests that are on a device and queuedTests the ones waiting for one. A test that is being set up, or re-checked after a failure, is in none of the lists for that time, so the lists can add up to less than totalTests. skippedTests lists the tests that matched tags when the run was started but were not runnable on its platform yet, so they were left out. They are not counted in totalTests and never change the run's status. When to start polling. POST /tests/execute returns just before the run is saved. The run is usually saved within half a second, so wait 2 seconds before your first call. If it answers 404, retry every 2 seconds. A 404 that lasts longer than 30 seconds means the run was not created: check the runId, then start the run again. While status is initial, tests are still being added to the run, so totalTests can still grow. This takes under a second for a run of a few tests, and up to about 10 seconds for a run of 100 tests. Once the run is running, polling every 15 to 30 seconds is enough. The organisation is taken from your API key. A run that belongs to another organisation answers 404, the same as a run that does not exist.\",\"url\":\"https://docs.mobileboost.io/api-reference/get-run-status\",\"mainEntityOfPage\":{\"@id\":\"https://docs.mobileboost.io/api-reference/get-run-status#webpage\"},\"dateModified\":\"2026-10-07T21:00:15.289Z\",\"publisher\":{\"@id\":\"https://docs.mobileboost.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.mobileboost.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"MobileBoost\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"MobileBoost\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/get-run-status.md","siteName":"MobileBoost","nav":{"global":null,"tabs":[{"tab":"Test Agent","icon":"robot","pages":[{"title":"Test Agent","href":"/test-agent/overview"}]},{"tab":"Local Tooling","icon":"code","pages":[{"title":"Local Tooling","href":"/engineer-tooling/overview"}]},{"tab":"QA Studio","icon":"flask-vial","pages":[{"title":"QA Studio","href":"/qa-studio/build-requirements"}]},{"tab":"API","icon":"square-terminal","groups":[{"group":"Getting started","pages":[{"title":"Getting started","href":"/api/getting-started"},{"title":"Folders","href":"/api/folders"}]},{"group":"Tests","pages":[{"title":"Create test","deprecated":null,"version":null,"openapi":"/openapi.json post /tests","href":"/api-reference/create-test"},{"title":"Get tests","deprecated":null,"version":null,"openapi":"/openapi.json get /tests","href":"/api-reference/get-tests"},{"title":"Update test","deprecated":null,"version":null,"openapi":"/openapi.json patch /tests","href":"/api-reference/update-test"},{"title":"Delete test","deprecated":null,"version":null,"openapi":"/openapi.json delete /tests","href":"/api-reference/delete-test"},{"title":"Execute tests","deprecated":null,"version":null,"openapi":"/openapi.json post /tests/execute","href":"/api-reference/execute-tests"},{"title":"Generate test automation","deprecated":null,"version":null,"openapi":"/openapi.json post /tests/generate","href":"/api-reference/generate-test-automation"}]},{"group":"Folders","pages":[{"title":"List folders","deprecated":null,"version":null,"openapi":"/openapi.json get /tests/folders","href":"/api-reference/list-folders"},{"title":"Create folder","deprecated":null,"version":null,"openapi":"/openapi.json post /tests/folders","href":"/api-reference/create-folder"},{"title":"Rename or move folder","deprecated":null,"version":null,"openapi":"/openapi.json patch /tests/folders","href":"/api-reference/rename-or-move-folder"},{"title":"Delete folder","deprecated":null,"version":null,"openapi":"/openapi.json delete /tests/folders","href":"/api-reference/delete-folder"},{"title":"Move tests into a folder","description":"File several tests into a folder at once, or unfile them with `folderId: null`. Ids that no longer exist are skipped rather than failing the call, and a test already in that folder is left alone. To move a single test, `PATCH /tests` takes `folderId` too.","deprecated":null,"version":null,"openapi":"/openapi.json post /tests/folders/move","href":"/api-reference/move-tests-into-a-folder"}]},{"group":"Runs","pages":[{"title":"Get run status","deprecated":null,"version":null,"openapi":"/openapi.json get /runs/{runId}","href":"/api-reference/get-run-status"}]},{"group":"Builds","pages":[{"title":"Upload build","description":"Upload an application build artifact to use in test executions.\n\nAccepted files:\n\n- **Android** - `.apk`, for both emulators and physical devices.\n- **iOS, physical devices** - `.ipa`.\n- **iOS, simulators** - a `.zip` or `.tar.gz` of the simulator `.app` bundle. An `.ipa` cannot be installed on a simulator.\n\nA `.zip` or `.tar.gz` holding a single `.ipa` is also accepted: it is unwrapped and treated as that `.ipa`, so a CI artifact can be uploaded as it comes. Any other extension is rejected with a 400.","deprecated":null,"version":null,"openapi":"/openapi.json post /uploadBuild","href":"/api-reference/upload-build"}]},{"group":"Native Runners","pages":[{"title":"XCUITest","href":"/api/xcui-packaging"},{"title":"Espresso","href":"/api/espresso-packaging"}]},{"group":"Audit","pages":[{"title":"List audit logs","deprecated":null,"version":null,"openapi":"/openapi.json get /audit/logs","href":"/api-reference/list-audit-logs"}]},{"group":"Usage","pages":[{"title":"Get SDK session usage","deprecated":null,"version":null,"openapi":"/openapi.json get /usage/sdk-sessions","href":"/api-reference/get-sdk-session-usage"}]}]},{"tab":"Changelog","icon":"clock-rotate-left","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"Get run status - MobileBoost","buildId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","deploymentId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CybtLBIt.js","utils-BMLj2fvV.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-B6In562Y.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Dr8Mfhp9.js","snippetPresets-2rmQvMVl.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-WMqJYdZj.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CJ-MlPHu.js","shallow-dY3TMRCk.js","getApiPlaygroundDisplay-v-1B2bKm.js","CodeSnippet-BDhiTB7U.js","CodeSnippets-D9hnzQcS.js","Page-C4GwDT3_.js","getPastedJson-Th2V45jI.js","icon-BQXch1W9.js","MethodPill-BCqUneP3.js","DuplicateIcon-Q_-bhurZ.js","createIcon-DUjLHRqp.js","DynamicMarkdown-B-f2cqXQ.js","SectionHeading-Da5NsV4v.js","axios-vUo_bRtp.js","Markdown-D13FWkIM.js","clsx-D3Isdib3.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-C-XZBk9h.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink--qIqmmVG.js"]}