The polling target named by pollUrl in the trigger response.
Returns the complete run row (steps, network and console events,
accessibility violations, performance metrics, visual-diff results,
downloads) plus artifact URLs. Every artifact URL is presigned and
expires after one hour; fetch the run again for fresh ones.
Two encrypted-at-rest columns, cookiesJson and localStorageJson,
are stripped from the response and never appear here, and so is
screenshotRefsJson, whose artifact notes are returned as
artifacts.
A run is finished when status is completed, failed or
cancelled. Use overallStatus (passed / failed /
needs_review) for the verdict; a cancelled run has none. The
report and verdict land first: artifacts.status stays pending
while the recording, trace and final screenshot are still being
saved. The reference CLI exits 0 on passed, 1 on failed or no
verdict, 3 on needs_review.
Format (services/api-keys.ts): the literal prefix tst_live_
followed by 24 random bytes rendered as 32 base64url characters.
Only the SHA-256 hash is stored server-side. The shape check that
routes a token down the API-key path rather than the Clerk JWT path
requires the tst_live_ prefix and a total length of at least 25
characters.
Keys are minted in the dashboard at /settings/api-keys, in any
workspace, personal included. The same header also accepts a Clerk
session JWT, which is how the web app authenticates, but the JWT path
is out of scope for this document.
The full run row from GET /api/runs/{id}, minus the two encrypted
columns cookiesJson and localStorageJson and the internal
screenshotRefsJson, plus presigned artifact URLs and artifacts.
The JSON payload columns are deliberately typed loosely below: they
are written by the run orchestrator without a wire schema, so their
inner shape can change without an API change. Read them defensively.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Testorim","description":"Documentation for Testorim: plain-English browser QA tests that run in a real browser.","colors":{"primary":"#059669","light":"#10b981","dark":"#047857"},"logo":{"light":"https://mintcdn.com/fulgic/ZOzvtyg298rAaunK/logo/wordmark.png?fit=max\u0026auto=format\u0026n=ZOzvtyg298rAaunK\u0026q=85\u0026s=c49b84c50b62f2ccafcc2660391619e7","dark":"https://mintcdn.com/fulgic/ZOzvtyg298rAaunK/logo/wordmark-dark.png?fit=max\u0026auto=format\u0026n=ZOzvtyg298rAaunK\u0026q=85\u0026s=d74e70ecf0f91872956e46385b5665e1","href":"https://testorim.com"},"favicon":"https://mintcdn.com/fulgic/MOzJBi6Mn9MbYgbw/favicon.png?fit=max\u0026auto=format\u0026n=MOzJBi6Mn9MbYgbw\u0026q=85\u0026s=783a1618974414f0ee72cf911352ab64","appearance":{"default":"system"},"navbar":{"links":[{"href":"https://status.testorim.com","label":"Status"},{"href":"mailto:info@fulgic.com","label":"Support"}],"primary":{"type":"button","label":"Open Testorim","href":"https://app.testorim.com"}},"footer":{"links":[{"header":"Product","items":[{"label":"Testorim","href":"https://testorim.com"},{"label":"Pricing","href":"https://testorim.com/pricing"},{"label":"Open the app","href":"https://app.testorim.com"},{"label":"Status","href":"https://status.testorim.com"}]},{"header":"Documentation","items":[{"label":"Quickstart","href":"https://docs.testorim.com/getting-started/quickstart"},{"label":"Plans and limits","href":"https://docs.testorim.com/resources/plans-and-limits"},{"label":"API reference","href":"https://docs.testorim.com/api-reference/introduction"},{"label":"CLI","href":"https://docs.testorim.com/developers/cli"}]},{"header":"Legal","items":[{"label":"Terms","href":"https://testorim.com/terms"},{"label":"Privacy","href":"https://testorim.com/privacy"}]}]},"search":{"prompt":"Search the Testorim docs"},"icons":{"library":"lucide"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Testorim app","icon":"monitor","href":"https://app.testorim.com"},{"anchor":"Website","icon":"globe","href":"https://testorim.com"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"fulgic","hasAudioNarration":false,"actualSubdomain":"fulgic","customDomains":["docs.testorim.com"],"gitSource":{"type":"github","owner":"sallar-ba","repo":"testorim-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6abb3a2d9ae82eb23a513b7a","clientVersion":"0.0.4094","searchFilterCounts":[{"language":"default","tag":"Documentation","count":29},{"language":"default","tag":"API reference","count":19},{"language":"default","tag":"Endpoints","count":17},{"language":"default","tag":"Runs","count":7},{"language":"default","tag":"Developers","count":6},{"language":"default","tag":"Developer documentation","count":6},{"language":"default","tag":"Getting started","count":4},{"language":"default","tag":"Integrations","count":4},{"language":"default","tag":"Resources","count":4},{"language":"default","tag":"Test creation","count":4}],"searchSettings":{"showContentSnippets":true}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"support@fulgic.com"}},"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":"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},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":true}},"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/runs/get-one-run-with-all-artifacts","slug":"/api-reference/runs/get-one-run-with-all-artifacts","pageMetadata":{"title":"Get one run with all artifacts","description":"The polling target named by `pollUrl` in the trigger response.\nReturns the complete run row (steps, network and console events,\naccessibility violations, performance metrics, visual-diff results,\ndownloads) plus artifact URLs. Every artifact URL is presigned and\nexpires after one hour; fetch the run again for fresh ones.\n\nTwo encrypted-at-rest columns, `cookiesJson` and `localStorageJson`,\nare stripped from the response and never appear here, and so is\n`screenshotRefsJson`, whose artifact notes are returned as\n`artifacts`.\n\nA run is finished when `status` is `completed`, `failed` or\n`cancelled`. Use `overallStatus` (`passed` / `failed` /\n`needs_review`) for the verdict; a cancelled run has none. The\nreport and verdict land first: `artifacts.status` stays `pending`\nwhile the recording, trace and final screenshot are still being\nsaved. The reference CLI exits 0 on `passed`, 1 on `failed` or no\nverdict, 3 on `needs_review`.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /api/runs/{id}","href":"/api-reference/runs/get-one-run-with-all-artifacts","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 ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"The polling target named by \", _jsx(_components.code, {\n children: \"pollUrl\"\n }), \" in the trigger response.\\nReturns the complete run row (steps, network and console events,\\naccessibility violations, performance metrics, visual-diff results,\\ndownloads) plus artifact URLs. Every artifact URL is presigned and\\nexpires after one hour; fetch the run again for fresh ones.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Two encrypted-at-rest columns, \", _jsx(_components.code, {\n children: \"cookiesJson\"\n }), \" and \", _jsx(_components.code, {\n children: \"localStorageJson\"\n }), \",\\nare stripped from the response and never appear here, and so is\\n\", _jsx(_components.code, {\n children: \"screenshotRefsJson\"\n }), \", whose artifact notes are returned as\\n\", _jsx(_components.code, {\n children: \"artifacts\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A run is finished when \", _jsx(_components.code, {\n children: \"status\"\n }), \" is \", _jsx(_components.code, {\n children: \"completed\"\n }), \", \", _jsx(_components.code, {\n children: \"failed\"\n }), \" or\\n\", _jsx(_components.code, {\n children: \"cancelled\"\n }), \". Use \", _jsx(_components.code, {\n children: \"overallStatus\"\n }), \" (\", _jsx(_components.code, {\n children: \"passed\"\n }), \" / \", _jsx(_components.code, {\n children: \"failed\"\n }), \" /\\n\", _jsx(_components.code, {\n children: \"needs_review\"\n }), \") for the verdict; a cancelled run has none. The\\nreport and verdict land first: \", _jsx(_components.code, {\n children: \"artifacts.status\"\n }), \" stays \", _jsx(_components.code, {\n children: \"pending\"\n }), \"\\nwhile the recording, trace and final screenshot are still being\\nsaved. The reference CLI exits 0 on \", _jsx(_components.code, {\n children: \"passed\"\n }), \", 1 on \", _jsx(_components.code, {\n children: \"failed\"\n }), \" or no\\nverdict, 3 on \", _jsx(_components.code, {\n children: \"needs_review\"\n }), \".\"]\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 one run with all artifacts","description":"The polling target named by `pollUrl` in the trigger response.\nReturns the complete run row (steps, network and console events,\naccessibility violations, performance metrics, visual-diff results,\ndownloads) plus artifact URLs. Every artifact URL is presigned and\nexpires after one hour; fetch the run again for fresh ones.\n\nTwo encrypted-at-rest columns, `cookiesJson` and `localStorageJson`,\nare stripped from the response and never appear here, and so is\n`screenshotRefsJson`, whose artifact notes are returned as\n`artifacts`.\n\nA run is finished when `status` is `completed`, `failed` or\n`cancelled`. Use `overallStatus` (`passed` / `failed` /\n`needs_review`) for the verdict; a cancelled run has none. The\nreport and verdict land first: `artifacts.status` stays `pending`\nwhile the recording, trace and final screenshot are still being\nsaved. The reference CLI exits 0 on `passed`, 1 on `failed` or no\nverdict, 3 on `needs_review`.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /api/runs/{id}","href":"/api-reference/runs/get-one-run-with-all-artifacts","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Runs"],"operationId":"getRun","summary":"Get one run with all artifacts","description":"The polling target named by `pollUrl` in the trigger response.\nReturns the complete run row (steps, network and console events,\naccessibility violations, performance metrics, visual-diff results,\ndownloads) plus artifact URLs. Every artifact URL is presigned and\nexpires after one hour; fetch the run again for fresh ones.\n\nTwo encrypted-at-rest columns, `cookiesJson` and `localStorageJson`,\nare stripped from the response and never appear here, and so is\n`screenshotRefsJson`, whose artifact notes are returned as\n`artifacts`.\n\nA run is finished when `status` is `completed`, `failed` or\n`cancelled`. Use `overallStatus` (`passed` / `failed` /\n`needs_review`) for the verdict; a cancelled run has none. The\nreport and verdict land first: `artifacts.status` stays `pending`\nwhile the recording, trace and final screenshot are still being\nsaved. The reference CLI exits 0 on `passed`, 1 on `failed` or no\nverdict, 3 on `needs_review`.\n","security":["630ec37a-3109-4344-a527-6177ace3711e"],"parameters":["88e3f4bf-ccbb-4015-b6db-d0b3aa08d17b"],"responses":{"200":"27ea653a-076f-4424-8901-baf49e94c6eb","401":"70768c67-74f9-413e-9e45-8aa8a54edee7","404":"74fc7c6a-37c0-43ee-a572-5b0e918b04ca","429":"d46f3461-a32d-46a9-9987-9f64b52edb73"},"method":"get","type":"path","servers":["d4db3c55-f4bc-46f2-9432-5f123e333c25","7ea51c90-14cf-4c02-9601-e57633a5e03f"],"path":"/api/runs/{id}","baseUrlOptions":["https://app.testorim.com","http://localhost:3001"],"title":"Get one run with all artifacts","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"88e3f4bf-ccbb-4015-b6db-d0b3aa08d17b":{"name":"id","in":"path","required":true,"description":"Run id (UUID). Returned as `runId` by `POST /api/runs/trigger`. Not UUID-validated by the handler; a malformed value simply finds nothing and 404s.","schema":{"type":"string","format":"uuid","isRequired":true,"description":"Run id (UUID). Returned as `runId` by `POST /api/runs/trigger`. Not UUID-validated by the handler; a malformed value simply finds nothing and 404s.","uniqueKey":"","typeLabel":"string\u003cuuid>"}}},"responses":{"27ea653a-076f-4424-8901-baf49e94c6eb":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["run"],"properties":{"run":{"type":"object","title":"RunDetail","description":"The full run row from `GET /api/runs/{id}`, minus the two encrypted\ncolumns `cookiesJson` and `localStorageJson` and the internal\n`screenshotRefsJson`, plus presigned artifact URLs and `artifacts`.\n\nThe JSON payload columns are deliberately typed loosely below: they\nare written by the run orchestrator without a wire schema, so their\ninner shape can change without an API change. Read them defensively.\n","required":["id","projectId","instruction","status","passedCount","failedCount","skippedCount","totalDurationMs","llmTokensUsed","llmCostCents","browserMinutesUsed","createdAt"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"run.id","typeLabel":"string\u003cuuid>"},"projectId":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"run.projectId","typeLabel":"string\u003cuuid>"},"instruction":{"type":"string","isRequired":true,"uniqueKey":"run.instruction","typeLabel":"string"},"status":{"type":"string","title":"RunStatus","enum":["pending","running","completed","failed","cancelled"],"description":"Lifecycle state. `completed`, `failed` and `cancelled` are terminal; `pending` and `running` mean keep polling. A run waiting in line for a browser is `pending`. Note `completed` means the run finished, not that it passed. Read `overallStatus` for that.","isRequired":true,"uniqueKey":"run.status","typeLabel":"enum\u003cstring>"},"passedCount":{"type":"integer","isRequired":true,"uniqueKey":"run.passedCount","typeLabel":"integer"},"failedCount":{"type":"integer","isRequired":true,"uniqueKey":"run.failedCount","typeLabel":"integer"},"skippedCount":{"type":"integer","isRequired":true,"uniqueKey":"run.skippedCount","typeLabel":"integer"},"totalDurationMs":{"type":"integer","isRequired":true,"uniqueKey":"run.totalDurationMs","typeLabel":"integer"},"llmTokensUsed":{"type":"integer","isRequired":true,"uniqueKey":"run.llmTokensUsed","typeLabel":"integer"},"llmCostCents":{"type":"integer","description":"Integer cents. Money is never stored as a float.","isRequired":true,"uniqueKey":"run.llmCostCents","typeLabel":"integer"},"browserMinutesUsed":{"type":"integer","description":"**Tenths of a minute**, not minutes. The underlying column is `browser_minutes_used_tenths`; the JSON key drops the suffix but the unit does not change. Divide by 10 for minutes.","isRequired":true,"uniqueKey":"run.browserMinutesUsed","typeLabel":"integer"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"run.createdAt","typeLabel":"string\u003cdate-time>"},"procedureId":{"oneOf":[{"type":"string","format":"uuid","uniqueKey":"run.procedureId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","uniqueKey":"run.procedureId.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.procedureId","typeLabel":"string\u003cuuid> | null"},"triggeredByUserId":{"oneOf":[{"type":"string","format":"uuid","description":"The user who triggered the run. For an API-key call, the key's owner. Nulled if that user is deleted.","uniqueKey":"run.triggeredByUserId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","description":"The user who triggered the run. For an API-key call, the key's owner. Nulled if that user is deleted.","uniqueKey":"run.triggeredByUserId.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.triggeredByUserId","typeLabel":"string\u003cuuid> | null"},"userExpectation":{"oneOf":[{"type":"string","title":"UserExpectation","description":"How to frame the verdict.\n\n* `pass` (default): a positive test; every step should succeed.\n* `fail`: a negative test; the run \"passes\" when the application\n correctly refuses the action. A safety net in the orchestrator\n appends a synthetic failed step if nothing actually failed.\n* `unknown`: exploratory; no strong framing.\n\nThe server coerces anything other than `fail`/`unknown` to `pass`.\nIt applies to ad-hoc runs only: a procedure replay uses the\nprocedure's own derived `expectation`.\n","default":"pass","enum":["pass","fail","unknown"],"uniqueKey":"run.userExpectation.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"run.userExpectation.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.userExpectation","typeLabel":"enum\u003cstring> | null"},"overallStatus":{"oneOf":[{"type":"string","title":"OverallStatus","description":"The QA verdict, null until the run finalizes and always null for a cancelled run. `failed` needs an executed step that failed. `needs_review` means no step failed but the run could not confirm the request: an open coverage gap, a check that already held before its action, a planned step the engine refused as written, or a report that judged the result failed or partial. Otherwise `passed`.","enum":["passed","failed","needs_review"],"uniqueKey":"run.overallStatus.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"run.overallStatus.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.overallStatus","typeLabel":"enum\u003cstring> | null"},"initialUrl":{"oneOf":[{"type":"string","uniqueKey":"run.initialUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"run.initialUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.initialUrl","typeLabel":"string | null"},"finalUrl":{"oneOf":[{"type":"string","uniqueKey":"run.finalUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"run.finalUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.finalUrl","typeLabel":"string | null"},"reportMarkdown":{"oneOf":[{"type":"string","description":"The human-readable report. The machine-readable `VERDICT: {...}` trailer the model emits is stripped before persistence, so it is not present here.","uniqueKey":"run.reportMarkdown.oneOf.0","typeLabel":"string"},{"type":"null","description":"The human-readable report. The machine-readable `VERDICT: {...}` trailer the model emits is stripped before persistence, so it is not present here.","uniqueKey":"run.reportMarkdown.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.reportMarkdown","typeLabel":"string | null"},"confidenceScore":{"oneOf":[{"type":"integer","uniqueKey":"run.confidenceScore.oneOf.0","typeLabel":"integer"},{"type":"null","uniqueKey":"run.confidenceScore.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.confidenceScore","typeLabel":"integer | null"},"stepsJson":{"oneOf":[{"type":"array","description":"Per-step execution records. Each entry carries at least the step's `action` / `target` / `value` plus its result; entries with a stored screenshot are augmented on read with `failureScreenshotUrl` and/or `actualScreenshotUrl`. Values for password-like fields are redacted before persistence, and a step's sealed secret is never returned.","items":{"type":"object","additionalProperties":true,"uniqueKey":"run.stepsJson.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"run.stepsJson.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Per-step execution records. Each entry carries at least the step's `action` / `target` / `value` plus its result; entries with a stored screenshot are augmented on read with `failureScreenshotUrl` and/or `actualScreenshotUrl`. Values for password-like fields are redacted before persistence, and a step's sealed secret is never returned.","items":{"type":"object","additionalProperties":true},"uniqueKey":"run.stepsJson.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.stepsJson","typeLabel":"object[] | null"},"artifacts":{"oneOf":[{"type":"object","description":"Where the background artifacts stand: `status` is `pending` while the final screenshot, scan, recording and trace are still being saved, then `done`; `notes` give the reason for each one that is missing. Null on runs stored before this existed.","properties":{"status":{"type":"string","enum":["pending","done"],"uniqueKey":"run.artifacts.oneOf.0.status","typeLabel":"enum\u003cstring>"},"notes":{"type":"array","items":{"oneOf":[{}],"uniqueKey":"run.artifacts.oneOf.0.notes.items.[INDEX]","typeLabel":"any"},"uniqueKey":"run.artifacts.oneOf.0.notes","typeLabel":"any[]"}},"additionalProperties":true,"uniqueKey":"run.artifacts.oneOf.0","typeLabel":"object"},{"type":"null","description":"Where the background artifacts stand: `status` is `pending` while the final screenshot, scan, recording and trace are still being saved, then `done`; `notes` give the reason for each one that is missing. Null on runs stored before this existed.","properties":{"status":{"type":"string","enum":["pending","done"]},"notes":{"type":"array","items":{"oneOf":[{}]}}},"additionalProperties":true,"uniqueKey":"run.artifacts.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.artifacts","typeLabel":"object | null"},"finalScreenshotR2Key":{"oneOf":[{"type":"string","uniqueKey":"run.finalScreenshotR2Key.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"run.finalScreenshotR2Key.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.finalScreenshotR2Key","typeLabel":"string | null"},"finalScreenshotUrl":{"oneOf":[{"type":"string","description":"Presigned URL for the final screenshot, valid for one hour.","uniqueKey":"run.finalScreenshotUrl.oneOf.0","typeLabel":"string"},{"type":"null","description":"Presigned URL for the final screenshot, valid for one hour.","uniqueKey":"run.finalScreenshotUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.finalScreenshotUrl","typeLabel":"string | null"},"networkEventsJson":{"oneOf":[{"type":"array","description":"Capped at roughly 200 entries. Null for runs where nothing interesting happened.","items":{"type":"object","additionalProperties":true,"uniqueKey":"run.networkEventsJson.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"run.networkEventsJson.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Capped at roughly 200 entries. Null for runs where nothing interesting happened.","items":{"type":"object","additionalProperties":true},"uniqueKey":"run.networkEventsJson.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.networkEventsJson","typeLabel":"object[] | null"},"consoleEventsJson":{"oneOf":[{"type":"array","description":"Console and page-error events, capped at roughly 200 entries. Entries carry at least `level` and `text`.","items":{"type":"object","additionalProperties":true,"uniqueKey":"run.consoleEventsJson.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"run.consoleEventsJson.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Console and page-error events, capped at roughly 200 entries. Entries carry at least `level` and `text`.","items":{"type":"object","additionalProperties":true},"uniqueKey":"run.consoleEventsJson.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.consoleEventsJson","typeLabel":"object[] | null"},"videoR2Key":{"oneOf":[{"type":"string","uniqueKey":"run.videoR2Key.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"run.videoR2Key.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.videoR2Key","typeLabel":"string | null"},"videoUrl":{"oneOf":[{"type":"string","description":"Presigned URL for the WebM recording, valid for one hour. It ends in a `#t=\u003cstart>,\u003cend>` media fragment so a player opens on the first painted page and stops where the steps ended. Unlike the list shape, this is a real URL here.","uniqueKey":"run.videoUrl.oneOf.0","typeLabel":"string"},{"type":"null","description":"Presigned URL for the WebM recording, valid for one hour. It ends in a `#t=\u003cstart>,\u003cend>` media fragment so a player opens on the first painted page and stops where the steps ended. Unlike the list shape, this is a real URL here.","uniqueKey":"run.videoUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.videoUrl","typeLabel":"string | null"},"videoPosterUrl":{"oneOf":[{"type":"string","description":"Presigned URL of the first painted page, for the player's poster.","uniqueKey":"run.videoPosterUrl.oneOf.0","typeLabel":"string"},{"type":"null","description":"Presigned URL of the first painted page, for the player's poster.","uniqueKey":"run.videoPosterUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.videoPosterUrl","typeLabel":"string | null"},"traceR2Key":{"oneOf":[{"type":"string","uniqueKey":"run.traceR2Key.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"run.traceR2Key.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.traceR2Key","typeLabel":"string | null"},"traceUrl":{"oneOf":[{"type":"string","description":"Presigned URL for the Playwright trace zip, valid for one hour. Environment header and cookie values and the run's known secrets are removed from it before it is stored.","uniqueKey":"run.traceUrl.oneOf.0","typeLabel":"string"},{"type":"null","description":"Presigned URL for the Playwright trace zip, valid for one hour. Environment header and cookie values and the run's known secrets are removed from it before it is stored.","uniqueKey":"run.traceUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.traceUrl","typeLabel":"string | null"},"accessibilityViolationsJson":{"oneOf":[{"type":"array","description":"axe-core violations on the final page; entries carry `id` and `impact`. Null when the scan did not run.","items":{"type":"object","additionalProperties":true,"uniqueKey":"run.accessibilityViolationsJson.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"run.accessibilityViolationsJson.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"axe-core violations on the final page; entries carry `id` and `impact`. Null when the scan did not run.","items":{"type":"object","additionalProperties":true},"uniqueKey":"run.accessibilityViolationsJson.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.accessibilityViolationsJson","typeLabel":"object[] | null"},"viewportPreset":{"oneOf":[{"type":"string","uniqueKey":"run.viewportPreset.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"run.viewportPreset.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.viewportPreset","typeLabel":"string | null"},"batchId":{"oneOf":[{"type":"string","format":"uuid","uniqueKey":"run.batchId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","uniqueKey":"run.batchId.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.batchId","typeLabel":"string\u003cuuid> | null"},"browser":{"oneOf":[{"type":"string","uniqueKey":"run.browser.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"run.browser.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.browser","typeLabel":"string | null"},"attemptIndex":{"oneOf":[{"type":"integer","uniqueKey":"run.attemptIndex.oneOf.0","typeLabel":"integer"},{"type":"null","uniqueKey":"run.attemptIndex.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.attemptIndex","typeLabel":"integer | null"},"ticketTitle":{"oneOf":[{"type":"string","description":"Cached issue-tracker ticket title, if one was ever generated.","uniqueKey":"run.ticketTitle.oneOf.0","typeLabel":"string"},{"type":"null","description":"Cached issue-tracker ticket title, if one was ever generated.","uniqueKey":"run.ticketTitle.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.ticketTitle","typeLabel":"string | null"},"ticketMarkdown":{"oneOf":[{"type":"string","uniqueKey":"run.ticketMarkdown.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"run.ticketMarkdown.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.ticketMarkdown","typeLabel":"string | null"},"ticketGeneratedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"run.ticketGeneratedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"run.ticketGeneratedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.ticketGeneratedAt","typeLabel":"string\u003cdate-time> | null"},"performanceMetricsJson":{"oneOf":[{"type":"object","description":"Final-page timings. Documented shape: `{ lcpMs, fcpMs, ttfbMs, domContentLoadedMs, loadEventMs }`.","additionalProperties":true,"uniqueKey":"run.performanceMetricsJson.oneOf.0","typeLabel":"object"},{"type":"null","description":"Final-page timings. Documented shape: `{ lcpMs, fcpMs, ttfbMs, domContentLoadedMs, loadEventMs }`.","additionalProperties":true,"uniqueKey":"run.performanceMetricsJson.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.performanceMetricsJson","typeLabel":"object | null"},"perPagePerformanceJson":{"oneOf":[{"type":"array","description":"Per-navigation timeline; each entry adds `url` and `capturedAt` to the metrics above.","items":{"type":"object","additionalProperties":true,"uniqueKey":"run.perPagePerformanceJson.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"run.perPagePerformanceJson.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Per-navigation timeline; each entry adds `url` and `capturedAt` to the metrics above.","items":{"type":"object","additionalProperties":true},"uniqueKey":"run.perPagePerformanceJson.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.perPagePerformanceJson","typeLabel":"object[] | null"},"visualResultsJson":{"oneOf":[{"type":"array","description":"Visual-regression results, one per step that had a baseline. Documented shape: `{ stepIndex, baselineR2Key, actualR2Key, diffR2Key, diffPixelCount, diffPercent, threshold, passed }`, augmented on read with `baselineUrl`, `actualUrl` and `diffUrl`.","items":{"type":"object","additionalProperties":true,"uniqueKey":"run.visualResultsJson.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"run.visualResultsJson.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Visual-regression results, one per step that had a baseline. Documented shape: `{ stepIndex, baselineR2Key, actualR2Key, diffR2Key, diffPixelCount, diffPercent, threshold, passed }`, augmented on read with `baselineUrl`, `actualUrl` and `diffUrl`.","items":{"type":"object","additionalProperties":true},"uniqueKey":"run.visualResultsJson.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.visualResultsJson","typeLabel":"object[] | null"},"downloadsJson":{"oneOf":[{"type":"array","description":"Files downloaded during the run. Documented shape: `{ filename, sizeBytes, contentType, r2Key, truncated }`.","items":{"type":"object","additionalProperties":true,"uniqueKey":"run.downloadsJson.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"run.downloadsJson.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Files downloaded during the run. Documented shape: `{ filename, sizeBytes, contentType, r2Key, truncated }`.","items":{"type":"object","additionalProperties":true},"uniqueKey":"run.downloadsJson.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.downloadsJson","typeLabel":"object[] | null"},"parentRunId":{"oneOf":[{"type":"string","format":"uuid","uniqueKey":"run.parentRunId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","uniqueKey":"run.parentRunId.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.parentRunId","typeLabel":"string\u003cuuid> | null"},"runKind":{"oneOf":[{"type":"string","uniqueKey":"run.runKind.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"run.runKind.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.runKind","typeLabel":"string | null"},"perfStatus":{"oneOf":[{"type":"string","description":"`ok` or `degraded` against the procedure's performance budget. Null when no budget is configured, or when the run shared the test machine with other runs and was not judged. Free text in the DB.","uniqueKey":"run.perfStatus.oneOf.0","typeLabel":"string"},{"type":"null","description":"`ok` or `degraded` against the procedure's performance budget. Null when no budget is configured, or when the run shared the test machine with other runs and was not judged. Free text in the DB.","uniqueKey":"run.perfStatus.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.perfStatus","typeLabel":"string | null"},"startedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"run.startedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"run.startedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.startedAt","typeLabel":"string\u003cdate-time> | null"},"completedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"run.completedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"run.completedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.completedAt","typeLabel":"string\u003cdate-time> | null"},"lastHeartbeatAt":{"oneOf":[{"type":"string","format":"date-time","description":"Liveness ping, refreshed every 60 s while the run is alive. The stale-runs sweeper cancels a run whose heartbeat is older than 3 minutes.","uniqueKey":"run.lastHeartbeatAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Liveness ping, refreshed every 60 s while the run is alive. The stale-runs sweeper cancels a run whose heartbeat is older than 3 minutes.","uniqueKey":"run.lastHeartbeatAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.lastHeartbeatAt","typeLabel":"string\u003cdate-time> | null"},"maxDurationMinutes":{"oneOf":[{"type":"integer","description":"The per-run cap as requested at trigger time. Null means the procedure's value (or the 10-minute default) applied.","uniqueKey":"run.maxDurationMinutes.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The per-run cap as requested at trigger time. Null means the procedure's value (or the 10-minute default) applied.","uniqueKey":"run.maxDurationMinutes.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.maxDurationMinutes","typeLabel":"integer | null"}},"isRequired":true,"uniqueKey":"run","typeLabel":"RunDetail · object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"run":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","projectId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","instruction":"\u003cstring>","status":"pending","passedCount":123,"failedCount":123,"skippedCount":123,"totalDurationMs":123,"llmTokensUsed":123,"llmCostCents":123,"browserMinutesUsed":123,"createdAt":"2023-11-07T05:31:56Z","procedureId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","triggeredByUserId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","userExpectation":"pass","overallStatus":"passed","initialUrl":"\u003cstring>","finalUrl":"\u003cstring>","reportMarkdown":"\u003cstring>","confidenceScore":123,"stepsJson":[{}],"artifacts":{"status":"pending","notes":["\u003cunknown>"]},"finalScreenshotR2Key":"\u003cstring>","finalScreenshotUrl":"\u003cstring>","networkEventsJson":[{}],"consoleEventsJson":[{}],"videoR2Key":"\u003cstring>","videoUrl":"\u003cstring>","videoPosterUrl":"\u003cstring>","traceR2Key":"\u003cstring>","traceUrl":"\u003cstring>","accessibilityViolationsJson":[{}],"viewportPreset":"\u003cstring>","batchId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","browser":"\u003cstring>","attemptIndex":123,"ticketTitle":"\u003cstring>","ticketMarkdown":"\u003cstring>","ticketGeneratedAt":"2023-11-07T05:31:56Z","performanceMetricsJson":{},"perPagePerformanceJson":[{}],"visualResultsJson":[{}],"downloadsJson":[{}],"parentRunId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","runKind":"\u003cstring>","perfStatus":"\u003cstring>","startedAt":"2023-11-07T05:31:56Z","completedAt":"2023-11-07T05:31:56Z","lastHeartbeatAt":"2023-11-07T05:31:56Z","maxDurationMinutes":123}}}},"exampleType":"generated"}},"exampleType":"generated"},"70768c67-74f9-413e-9e45-8aa8a54edee7":{"description":"No `Authorization: Bearer …` header, or the credential did not\nverify. Distinct messages the code can return:\n\n* `Missing or invalid Authorization header`\n* `Invalid or revoked API key`\n* `API key owner not found`\n* `API key's organization is no longer accessible`. The key's user\n has been removed from the org it is bound to\n* `Invalid token` / `Token missing sub claim`. Clerk JWT path\n\nRepeated failures burn the `auth:strict` bucket (5 per 15 minutes\nper IP) and then return `429` instead.\n","content":{"application/json":{"schema":{"type":"object","title":"Error","description":"The universal error envelope. Every failing handler in this surface responds with a JSON object carrying a human-readable `error` string; some add extra fields (see the other error schemas).","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable message. Not a stable machine-readable code.","isRequired":true,"uniqueKey":"error","typeLabel":"string"}},"additionalProperties":true,"uniqueKey":"","typeLabel":"Error · object"},"example":{"error":"Invalid or revoked API key"},"examples":{"Example":{"title":"Example","value":{"error":"Invalid or revoked API key"}}},"exampleType":"examples"}},"exampleType":"examples"},"74fc7c6a-37c0-43ee-a572-5b0e918b04ca":{"description":"No such run in the key's organization. Note the reference CLI treats a 404 in the first seconds after a trigger as benign and keeps polling.","content":{"application/json":{"schema":{"type":"object","title":"Error","description":"The universal error envelope. Every failing handler in this surface responds with a JSON object carrying a human-readable `error` string; some add extra fields (see the other error schemas).","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable message. Not a stable machine-readable code.","isRequired":true,"uniqueKey":"error","typeLabel":"string"}},"additionalProperties":true,"uniqueKey":"","typeLabel":"Error · object"},"example":{"error":"Run not found"},"examples":{"Example":{"title":"Example","value":{"error":"Run not found"}}},"exampleType":"examples"}},"exampleType":"examples"},"d46f3461-a32d-46a9-9987-9f64b52edb73":{"description":"Throttled. Every `/api/*` route sits behind `api:global` (600 / minute per IP); some routes add a tighter per-user limiter.","headers":{"Retry-After":{"description":"Seconds until the window frees up.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","title":"RateLimitError","description":"Emitted by the rate-limit middleware alongside a `Retry-After` header.","required":["error"],"properties":{"error":{"type":"string","description":"The limiter's reason, e.g. `Rate limit exceeded. Try again in 42s.`","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retryAfter":{"oneOf":[{"type":"integer","description":"Seconds until the window frees. Mirrors `Retry-After`. May be absent/null when the limiter did not report a reset time, in which case the header defaults to 60.","uniqueKey":"retryAfter.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Seconds until the window frees. Mirrors `Retry-After`. May be absent/null when the limiter did not report a reset time, in which case the header defaults to 60.","uniqueKey":"retryAfter.oneOf.1","typeLabel":"null"}],"uniqueKey":"retryAfter","typeLabel":"integer | null"}},"additionalProperties":true,"uniqueKey":"","typeLabel":"RateLimitError · object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","retryAfter":123}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"630ec37a-3109-4344-a527-6177ace3711e":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"tst_live_\u003c32 url-safe base64 chars>","description":"Send `Authorization: Bearer tst_live_…`.\n\nFormat (`services/api-keys.ts`): the literal prefix `tst_live_`\nfollowed by 24 random bytes rendered as 32 base64url characters.\nOnly the SHA-256 hash is stored server-side. The shape check that\nroutes a token down the API-key path rather than the Clerk JWT path\nrequires the `tst_live_` prefix and a total length of at least 25\ncharacters.\n\nKeys are minted in the dashboard at `/settings/api-keys`, in any\nworkspace, personal included. The same header also accepts a Clerk\nsession JWT, which is how the web app authenticates, but the JWT path\nis out of scope for this document.\n","scopes":[]}}},"servers":{"d4db3c55-f4bc-46f2-9432-5f123e333c25":{"url":"https://app.testorim.com","description":"Production. Single-origin deployment: Caddy on one GCP VM serves the SPA at `/` and reverse-proxies `/api/*` and `/ws` to the backend. This is also the default API base URL used by the Testorim CLI."},"7ea51c90-14cf-4c02-9601-e57633a5e03f":{"url":"http://localhost:3001","description":"A locally running Testorim backend, for self-hosted or development use. The default port is 3001."}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"tst_live_\u003c32 url-safe base64 chars>","description":"Send `Authorization: Bearer tst_live_…`.\n\nFormat (`services/api-keys.ts`): the literal prefix `tst_live_`\nfollowed by 24 random bytes rendered as 32 base64url characters.\nOnly the SHA-256 hash is stored server-side. The shape check that\nroutes a token down the API-key path rather than the Clerk JWT path\nrequires the `tst_live_` prefix and a total length of at least 25\ncharacters.\n\nKeys are minted in the dashboard at `/settings/api-keys`, in any\nworkspace, personal included. The same header also accepts a Clerk\nsession JWT, which is how the web app authenticates, but the JWT path\nis out of scope for this document.\n","scopes":[]},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Send `Authorization: Bearer tst_live_…`.\n\nFormat (`services/api-keys.ts`): the literal prefix `tst_live_`\nfollowed by 24 random bytes rendered as 32 base64url characters.\nOnly the SHA-256 hash is stored server-side. The shape check that\nroutes a token down the API-key path rather than the Clerk JWT path\nrequires the `tst_live_` prefix and a total length of at least 25\ncharacters.\n\nKeys are minted in the dashboard at `/settings/api-keys`, in any\nworkspace, personal included. The same header also accepts a Clerk\nsession JWT, which is how the web app authenticates, but the JWT path\nis out of scope for this document.\n","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"ApiKeyAuth","name":"Authorization"}],"title":"ApiKeyAuth"}]},"originalFileLocation":"api-reference/openapi.yaml"},"subdomain":"fulgic","siteName":"Testorim","title":"Get one run with all artifacts - Testorim","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-25T12:52:51.710Z","originalFileLocation":"api-reference/runs/get-one-run-with-all-artifacts.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=\"The polling target named by pollUrl in the trigger response. Returns the complete run row (steps, network and console events, accessibility violations, performance metrics, visual-diff results, downloads) plus artifact URLs. Every artifact URL is presigned and expires after one hour; fetch the run again for fresh ones. Two encrypted-at-rest columns, cookiesJson and localStorageJson, are stripped from the response and never appear here, and so is screenshotRefsJson, whose artifact notes are returned as artifacts. A run is finished when status is completed, failed or cancelled. Use overallStatus (passed / failed / needs_review) for the verdict; a cancelled run has none. The report and verdict land first: artifacts.status stays pending while the recording, trace and final screenshot are still being saved. The reference CLI exits 0 on passed, 1 on failed or no verdict, 3 on needs_review.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Testorim\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/fulgic/HlhB1s7g4HMZVSXy/_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/fulgic/HlhB1s7g4HMZVSXy/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/fulgic/HlhB1s7g4HMZVSXy/_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/fulgic/HlhB1s7g4HMZVSXy/_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/fulgic/HlhB1s7g4HMZVSXy/_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/fulgic/HlhB1s7g4HMZVSXy/_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/fulgic/HlhB1s7g4HMZVSXy/_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/fulgic/HlhB1s7g4HMZVSXy/_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/fulgic/HlhB1s7g4HMZVSXy/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Get one run with all artifacts - Testorim\">\u003cmeta data-mint-head property=\"og:description\" content=\"The polling target named by pollUrl in the trigger response. Returns the complete run row (steps, network and console events, accessibility violations, performance metrics, visual-diff results, downloads) plus artifact URLs. Every artifact URL is presigned and expires after one hour; fetch the run again for fresh ones. Two encrypted-at-rest columns, cookiesJson and localStorageJson, are stripped from the response and never appear here, and so is screenshotRefsJson, whose artifact notes are returned as artifacts. A run is finished when status is completed, failed or cancelled. Use overallStatus (passed / failed / needs_review) for the verdict; a cancelled run has none. The report and verdict land first: artifacts.status stays pending while the recording, trace and final screenshot are still being saved. The reference CLI exits 0 on passed, 1 on failed or no verdict, 3 on needs_review.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Testorim\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.testorim.com/api-reference/runs/get-one-run-with-all-artifacts\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://fulgic.mintlify.site/_mintlify/api/og/v2?division=Runs\u0026amp;title=Get+one+run+with+all+artifacts\u0026amp;description=The+polling+target+named+by+%60pollUrl%60+in+the+trigger+response.%0AReturns+the+complete+run+row+%28steps%2C+network+and+console+events%2C%0Aaccessibility+violations%2C+perfor\u0026amp;theme=21e417d08933df01149b8e86\u0026amp;signature=4ebf0449c2219204b46103bfb848a3999e629d98429e4854b37d6e317a2274b6\">\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 one run with all artifacts - Testorim\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"The polling target named by pollUrl in the trigger response. Returns the complete run row (steps, network and console events, accessibility violations, performance metrics, visual-diff results, downloads) plus artifact URLs. Every artifact URL is presigned and expires after one hour; fetch the run again for fresh ones. Two encrypted-at-rest columns, cookiesJson and localStorageJson, are stripped from the response and never appear here, and so is screenshotRefsJson, whose artifact notes are returned as artifacts. A run is finished when status is completed, failed or cancelled. Use overallStatus (passed / failed / needs_review) for the verdict; a cancelled run has none. The report and verdict land first: artifacts.status stays pending while the recording, trace and final screenshot are still being saved. The reference CLI exits 0 on passed, 1 on failed or no verdict, 3 on needs_review.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://fulgic.mintlify.site/_mintlify/api/og/v2?division=Runs\u0026amp;title=Get+one+run+with+all+artifacts\u0026amp;description=The+polling+target+named+by+%60pollUrl%60+in+the+trigger+response.%0AReturns+the+complete+run+row+%28steps%2C+network+and+console+events%2C%0Aaccessibility+violations%2C+perfor\u0026amp;theme=21e417d08933df01149b8e86\u0026amp;signature=4ebf0449c2219204b46103bfb848a3999e629d98429e4854b37d6e317a2274b6\">\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/fulgic/HlhB1s7g4HMZVSXy/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Testorim\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#059669\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.testorim.com/api-reference/runs/get-one-run-with-all-artifacts\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/runs/get-one-run-with-all-artifacts.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.testorim.com/#organization\",\"name\":\"Testorim\",\"url\":\"https://docs.testorim.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/fulgic/ZOzvtyg298rAaunK/logo/wordmark.png?fit=max\u0026auto=format\u0026n=ZOzvtyg298rAaunK\u0026q=85\u0026s=c49b84c50b62f2ccafcc2660391619e7\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.testorim.com#website\",\"name\":\"Testorim\",\"url\":\"https://docs.testorim.com\",\"publisher\":{\"@id\":\"https://docs.testorim.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.testorim.com/api-reference/runs/get-one-run-with-all-artifacts#webpage\",\"url\":\"https://docs.testorim.com/api-reference/runs/get-one-run-with-all-artifacts\",\"name\":\"Get one run with all artifacts\",\"description\":\"The polling target named by pollUrl in the trigger response. Returns the complete run row (steps, network and console events, accessibility violations, performance metrics, visual-diff results, downloads) plus artifact URLs. Every artifact URL is presigned and expires after one hour; fetch the run again for fresh ones. Two encrypted-at-rest columns, cookiesJson and localStorageJson, are stripped from the response and never appear here, and so is screenshotRefsJson, whose artifact notes are returned as artifacts. A run is finished when status is completed, failed or cancelled. Use overallStatus (passed / failed / needs_review) for the verdict; a cancelled run has none. The report and verdict land first: artifacts.status stays pending while the recording, trace and final screenshot are still being saved. The reference CLI exits 0 on passed, 1 on failed or no verdict, 3 on needs_review.\",\"dateModified\":\"2026-09-25T12:52:51.710Z\",\"isPartOf\":{\"@id\":\"https://docs.testorim.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.testorim.com/api-reference/runs/get-one-run-with-all-artifacts#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.testorim.com/api-reference/runs/get-one-run-with-all-artifacts#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.testorim.com/api-reference/runs/start-a-test-run-headlessly\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Runs\",\"item\":\"https://docs.testorim.com/api-reference/runs/start-a-test-run-headlessly\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Get one run with all artifacts\",\"item\":\"https://docs.testorim.com/api-reference/runs/get-one-run-with-all-artifacts\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.testorim.com/api-reference/runs/get-one-run-with-all-artifacts#apireference\",\"headline\":\"Get one run with all artifacts\",\"name\":\"Get one run with all artifacts\",\"description\":\"The polling target named by pollUrl in the trigger response. Returns the complete run row (steps, network and console events, accessibility violations, performance metrics, visual-diff results, downloads) plus artifact URLs. Every artifact URL is presigned and expires after one hour; fetch the run again for fresh ones. Two encrypted-at-rest columns, cookiesJson and localStorageJson, are stripped from the response and never appear here, and so is screenshotRefsJson, whose artifact notes are returned as artifacts. A run is finished when status is completed, failed or cancelled. Use overallStatus (passed / failed / needs_review) for the verdict; a cancelled run has none. The report and verdict land first: artifacts.status stays pending while the recording, trace and final screenshot are still being saved. The reference CLI exits 0 on passed, 1 on failed or no verdict, 3 on needs_review.\",\"url\":\"https://docs.testorim.com/api-reference/runs/get-one-run-with-all-artifacts\",\"mainEntityOfPage\":{\"@id\":\"https://docs.testorim.com/api-reference/runs/get-one-run-with-all-artifacts#webpage\"},\"dateModified\":\"2026-09-25T12:52:51.710Z\",\"publisher\":{\"@id\":\"https://docs.testorim.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.testorim.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Testorim\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Testorim","nav":{"global":{"anchors":[{"anchor":"Testorim app","icon":"monitor","href":"https://app.testorim.com"},{"anchor":"Website","icon":"globe","href":"https://testorim.com"}]},"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":""}]},{"tab":"Developers","pages":[{"title":"Developers","href":"/developers/platform-overview"}]},{"tab":"API reference","groups":[{"group":"Overview","pages":[{"title":"API reference","href":"/api-reference/introduction"},{"title":"Errors","href":"/api-reference/errors"}]},{"group":"Endpoints","pages":[{"group":"Runs","pages":[{"title":"Start a test run headlessly","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /api/runs/trigger","href":"/api-reference/runs/start-a-test-run-headlessly"},{"title":"List runs across the organization","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /api/runs","href":"/api-reference/runs/list-runs-across-the-organization"},{"title":"List in-flight runs, grouped by batch","description":"Runs currently `pending` or `running` in the key's organization,\ngrouped by `batchId` so a fan-out (fuzz batch, flaky 3× detection,\nrole probe, desktop+mobile pair) reads as one entry with progress\ncounters. Standalone runs come back as single-item groups.\n\nRuns created more than 30 minutes ago are filtered out, because at\nthat age they are assumed to be orphans the stale-runs sweeper has not\nreaped yet.\nAt most 100 active rows and 500 batch siblings are considered.\n\nIntended for polling. Subject to the `api:read` limiter\n(120 / minute per user).\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /api/runs/active","href":"/api-reference/runs/list-in-flight-runs-grouped-by-batch"},{"title":"Get one run with all artifacts","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /api/runs/{id}","href":"/api-reference/runs/get-one-run-with-all-artifacts"},{"title":"Cancel a single run","description":"Marks the run `cancelled` if it is still `running` or `pending`, with\nno verdict (`overallStatus: null`), then fires the in-memory cancel\nhandler so the run's browser is closed at once. The run keeps the\nsteps that ran and a short report saying why it stopped; it keeps no\nrecording, trace or final screenshot.\n\nIdempotent in effect: cancelling an already-terminal run succeeds\nwith `cancelled: 0`. The endpoint takes no request body.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /api/runs/{id}/cancel","href":"/api-reference/runs/cancel-a-single-run"},{"title":"Cancel every run in a batch","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /api/runs/batch/{batchId}/cancel","href":"/api-reference/runs/cancel-every-run-in-a-batch"},{"title":"List runs for one project","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /api/projects/{projectId}/runs","href":"/api-reference/runs/list-runs-for-one-project"}]},{"group":"Procedures","pages":[{"title":"List a project's saved procedures","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /api/projects/{projectId}/procedures","href":"/api-reference/procedures/list-a-projects-saved-procedures"},{"title":"Get one procedure by id","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /api/procedures/{id}","href":"/api-reference/procedures/get-one-procedure-by-id"},{"title":"Export a procedure as a standalone Playwright spec","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /api/procedures/{id}/export","href":"/api-reference/procedures/export-a-procedure-as-a-standalone-playwright-spec"}]},{"group":"Projects","pages":[{"title":"List projects","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /api/projects","href":"/api-reference/projects/list-projects"},{"title":"Create (or re-use) a project","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /api/projects","href":"/api-reference/projects/create-or-re-use-a-project"},{"title":"Get one project","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /api/projects/{id}","href":"/api-reference/projects/get-one-project"}]},{"group":"API keys","pages":[{"title":"List active API keys","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /api/keys","href":"/api-reference/api-keys/list-active-api-keys"},{"title":"Mint a new API key (browser session only)","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /api/keys","href":"/api-reference/api-keys/mint-a-new-api-key-browser-session-only"},{"title":"Revoke an API key","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /api/keys/{id}","href":"/api-reference/api-keys/revoke-an-api-key"}]},{"group":"Identity","pages":[{"title":"Identify the presented credential","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /api/me","href":"/api-reference/identity/identify-the-presented-credential"}]}]}]}]},"basePath":"","title":"Get one run with all artifacts - Testorim","buildId":"dpl_42LwxxU1kGN114H4XzwGYXa9ZDah","deploymentId":"dpl_42LwxxU1kGN114H4XzwGYXa9ZDah","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-C-hEh3I2.js","utils-CnF4QiUD.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-C7PVNbel.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-8ytevL2A.js","snippetPresets-BT1alx3v.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BLXC0i_W.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CyLIGI9_.js","shallow-DC0lGVIW.js","getApiPlaygroundDisplay-CgDQ85tN.js","CodeSnippet-6-I-Gpv9.js","CodeSnippets-BAk1kDdu.js","Page-C945cI-W.js","getPastedJson-B276RuWN.js","icon-BqP8etTm.js","MethodPill-DM6sbxG1.js","DuplicateIcon-PyJglOaE.js","createIcon-CMeOMAc_.js","DynamicMarkdown-BoyYAA8K.js","SectionHeading-DAYv3gvZ.js","axios-vUo_bRtp.js","Markdown-BhTTmazV.js","clsx-CR-RHrVC.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CBUH0-zX.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BmARFYNC.js"]}