Start an autonomous change review from either a PR URL or raw change input. Returns 202 with the review conversation.
PR mode reuses the pull request’s existing review conversation unless forceNewConversation is true or that conversation is archived.
For a GitHub pull request’s head commit:
If a POST /chat/change-review/prepare request left a review waiting, this request runs its tests against applicationOverrides in the same conversation, with this request’s context.
Otherwise it runs a full review.
If PR triage skipped the commit, it does nothing unless it sends triage.enabled: false or a review was requested with @qa.tech.
Send commitHash from CI (pull_request.head.sha) when calling from GitHub Actions so triage, prepare, and this request key off the commit the workflow is building. QA.tech uses it for review state and updates the stored pull request head when webhooks lag.
In every case the response is the review conversation. Poll get_chat_conversation until its status is completed, failed, or cancelled.
Force a brand-new chat instead of reusing the pull request's existing review conversation. Defaults to false, so repeated reviews of the same PR share one chat unless that chat is archived.
Optional post-merge options for this PR. Stored on the review conversation and applied when the PR merges. Overrides GitHub App integration settings for this PR only.
Optional PR triage options for this review. GitHub pull requests only. Overrides the GitHub App integration PR triage toggle and prompt for this review.
When true, the agent does not post its review comments to the pull request. The review still runs and is stored in QA.tech, and the GitHub check run is still reported. Use it when you do not want comments on the PR, for example during evaluation. Stored on the review conversation, so later reviews of this PR also stay silent until a request sends false. Omit to keep the conversation's current setting (comments are posted by default).
Target a specific project by its prefixed short ID (proj-slug_shortId or proj_shortId), as returned by the projects API. Required for organization-scoped API keys; project-scoped keys may only pass their own project's short ID.
Pattern: ^proj(-.+_.+|_.+)$
Response
202 - application/json
The request has been accepted for processing, but processing has not yet completed.
Conversation data with recent messages (newest first).
Overall conversation lifecycle. in_progress while the assistant is working or a background test run / research task is still going. Assistant message COMPLETED is not enough — starting a run ends the current turn. Poll until this is completed, failed, or cancelled.
Test runs started from this conversation, newest first. Empty until a run is created. Use shortId with get_run (testCases = all) or nested test-case short IDs from that call with get_run_test_case.
Where the conversation originated. api for conversations created via this API, ui for the dashboard, github/gitlab for VCS-triggered chats, and system for everything else.
Recent messages, newest first. Empty on creation; poll get_chat_conversation to retrieve. Internal wake messages are omitted.
Show child attributes
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"QA.tech Docs","colors":{"primary":"#4F46E5","light":"#F672AB","dark":"#4F46E5"},"logo":{"light":"https://mintcdn.com/qatech/tn7srSYA67gRWgfI/logo/logo.svg?fit=max\u0026auto=format\u0026n=tn7srSYA67gRWgfI\u0026q=85\u0026s=2f0e3745a8079e74e66e0a904232888f","dark":"https://mintcdn.com/qatech/tn7srSYA67gRWgfI/logo/dark.svg?fit=max\u0026auto=format\u0026n=tn7srSYA67gRWgfI\u0026q=85\u0026s=8c39f071bcebaa8ec3c9b73c4e34faac","href":"https://docs.qa.tech"},"favicon":"https://mintcdn.com/qatech/tn7srSYA67gRWgfI/favicon.svg?fit=max\u0026auto=format\u0026n=tn7srSYA67gRWgfI\u0026q=85\u0026s=b34d80ecef9cd5e082545308e406134f","navbar":{"links":[{"href":"https://qa.tech/contact","label":"Support"}],"primary":{"type":"button","label":"Get Started","href":"https://qa.tech/demo"}},"footer":{"socials":{"x":"https://x.com/getqatech","github":"https://github.com/qAdottech","linkedin":"https://www.linkedin.com/company/qa-tech-ai"}},"seo":{"metatags":{"canonical":"https://docs.qa.tech"}},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Blog","icon":"newspaper","href":"https://qa.tech/blog/"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"qatech","hasAudioNarration":false,"actualSubdomain":"qatech","customDomains":["docs.qa.tech"],"gitSource":{"type":"github","owner":"qadottech","repo":"qatech","deployBranch":"live","contentDirectory":"apps/docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aeb4e0bfcff05cc64740e22","collectionId":"ed14c707-d882-4dcb-9a1c-4bd9d4d03b5a","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aeb4e0bfcff05cc64740e22"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aeb63897f3f30dddeba2e90","clientVersion":"0.0.4064","searchFilterCounts":[{"language":"default","tag":"API and CLI","count":76},{"language":"default","tag":"Endpoints","count":60},{"language":"default","tag":"Build Tests","count":31},{"language":"default","tag":"Regression Testing","count":27},{"language":"default","tag":"Get Started","count":26},{"language":"default","tag":"Agents","count":16},{"language":"default","tag":"Integrations","count":16},{"language":"default","tag":"PR Testing","count":14},{"language":"default","tag":"Choose your CI","count":13},{"language":"default","tag":"Runs","count":12}]},"assistantConfig":{"enableAskAiButton":false,"enableAskAiSearchBar":false},"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":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"a[href=\"/integrations/mcp\"]>svg{-webkit-mask-image:url('/images/mcp-logo.svg')!important;mask-image:url('/images/mcp-logo.svg')!important}"}],"page":{"pagePath":"api-reference/chat/start-change-review-chat","slug":"/api-reference/chat/start-change-review-chat","pageMetadata":{"title":"Start change review chat","description":"Start an autonomous change review from either a PR URL or raw change input. Returns 202 with the review conversation.\n\nPR mode reuses the pull request's existing review conversation unless `forceNewConversation` is true or that conversation is archived.\n\nFor a GitHub pull request's head commit:\n- If a `POST /chat/change-review/prepare` request left a review waiting, this request runs its tests against `applicationOverrides` in the same conversation, with this request's `context`.\n- Otherwise it runs a full review.\n- If PR triage skipped the commit, it does nothing unless it sends `triage.enabled: false` or a review was requested with `@qa.tech`.\n\nSend `commitHash` from CI (`pull_request.head.sha`) when calling from GitHub Actions so triage, prepare, and this request key off the commit the workflow is building. QA.tech uses it for review state and updates the stored pull request head when webhooks lag.\n\nIn every case the response is the review conversation. Poll `get_chat_conversation` until its `status` is `completed`, `failed`, or `cancelled`.","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/chat/change-review","href":"/api-reference/chat/start-change-review-chat","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 li: \"li\",\n p: \"p\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Start an autonomous change review from either a PR URL or raw change input. Returns 202 with the review conversation.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"PR mode reuses the pull request’s existing review conversation unless \", _jsx(_components.code, {\n children: \"forceNewConversation\"\n }), \" is true or that conversation is archived.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"For a GitHub pull request’s head commit:\"\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [\"If a \", _jsx(_components.code, {\n children: \"POST /chat/change-review/prepare\"\n }), \" request left a review waiting, this request runs its tests against \", _jsx(_components.code, {\n children: \"applicationOverrides\"\n }), \" in the same conversation, with this request’s \", _jsx(_components.code, {\n children: \"context\"\n }), \".\"]\n }), \"\\n\", _jsx(_components.li, {\n children: \"Otherwise it runs a full review.\"\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"If PR triage skipped the commit, it does nothing unless it sends \", _jsx(_components.code, {\n children: \"triage.enabled: false\"\n }), \" or a review was requested with \", _jsx(_components.code, {\n children: \"@qa.tech\"\n }), \".\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Send \", _jsx(_components.code, {\n children: \"commitHash\"\n }), \" from CI (\", _jsx(_components.code, {\n children: \"pull_request.head.sha\"\n }), \") when calling from GitHub Actions so triage, prepare, and this request key off the commit the workflow is building. QA.tech uses it for review state and updates the stored pull request head when webhooks lag.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"In every case the response is the review conversation. Poll \", _jsx(_components.code, {\n children: \"get_chat_conversation\"\n }), \" until its \", _jsx(_components.code, {\n children: \"status\"\n }), \" is \", _jsx(_components.code, {\n children: \"completed\"\n }), \", \", _jsx(_components.code, {\n children: \"failed\"\n }), \", or \", _jsx(_components.code, {\n children: \"cancelled\"\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":"Start change review chat","description":"Start an autonomous change review from either a PR URL or raw change input. Returns 202 with the review conversation.\n\nPR mode reuses the pull request's existing review conversation unless `forceNewConversation` is true or that conversation is archived.\n\nFor a GitHub pull request's head commit:\n- If a `POST /chat/change-review/prepare` request left a review waiting, this request runs its tests against `applicationOverrides` in the same conversation, with this request's `context`.\n- Otherwise it runs a full review.\n- If PR triage skipped the commit, it does nothing unless it sends `triage.enabled: false` or a review was requested with `@qa.tech`.\n\nSend `commitHash` from CI (`pull_request.head.sha`) when calling from GitHub Actions so triage, prepare, and this request key off the commit the workflow is building. QA.tech uses it for review state and updates the stored pull request head when webhooks lag.\n\nIn every case the response is the review conversation. Poll `get_chat_conversation` until its `status` is `completed`, `failed`, or `cancelled`.","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/chat/change-review","href":"/api-reference/chat/start-change-review-chat","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"StartChangeReviewChat","summary":"Start change review chat","description":"Start an autonomous change review from either a PR URL or raw change input. Returns 202 with the review conversation.\n\nPR mode reuses the pull request's existing review conversation unless `forceNewConversation` is true or that conversation is archived.\n\nFor a GitHub pull request's head commit:\n- If a `POST /chat/change-review/prepare` request left a review waiting, this request runs its tests against `applicationOverrides` in the same conversation, with this request's `context`.\n- Otherwise it runs a full review.\n- If PR triage skipped the commit, it does nothing unless it sends `triage.enabled: false` or a review was requested with `@qa.tech`.\n\nSend `commitHash` from CI (`pull_request.head.sha`) when calling from GitHub Actions so triage, prepare, and this request key off the commit the workflow is building. QA.tech uses it for review state and updates the stored pull request head when webhooks lag.\n\nIn every case the response is the review conversation. Poll `get_chat_conversation` until its `status` is `completed`, `failed`, or `cancelled`.","parameters":[],"responses":{"202":"255fa41e-452f-4113-b433-3f10517e2dcd"},"tags":["Chat"],"requestBody":"999ac17a-bb93-4df4-b622-167816b10499","method":"post","type":"path","servers":["b99898d0-c133-4743-b3d1-6c69fe9edd93"],"security":["3fc27c53-85da-4c9b-980b-3fb5d7c58b5b"],"path":"/v1/chat/change-review","baseUrlOptions":["https://api.qa.tech"],"title":"Start change review chat","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","description":"Request body for starting a change review chat","required":["mode","vcsProviderId","applicationOverrides","prUrl"],"properties":{"mode":{"type":"string","enum":["pr"],"isRequired":true,"uniqueKey":"oneOf.0.mode","typeLabel":"enum\u003cstring>"},"vcsProviderId":{"type":"string","enum":["github","gitlab","azure-devops"],"description":"Supported VCS providers for pull request URL review mode","isRequired":true,"uniqueKey":"oneOf.0.vcsProviderId","typeLabel":"enum\u003cstring>"},"applicationOverrides":{"type":"array","items":{"type":"object","required":["applicationShortId","environment"],"properties":{"applicationShortId":{"type":"string","pattern":"^app(-.+_.+|_.+)$","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].applicationShortId","typeLabel":"string"},"environment":{"oneOf":[{"type":"object","description":"Environment to use for this application. Optional customHeaders and basicAuth persist auth or protection-bypass rules on the environment.","required":["url"],"properties":{"url":{"type":"string","format":"uri","pattern":"^https?:\\x2f\\x2f","description":"Base URL of the environment. Must use http or https.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0.url","typeLabel":"string\u003curi>"},"name":{"type":"string","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0.name","typeLabel":"string"},"customHeaders":{"type":"array","items":{"type":"object","required":["domains","headers"],"properties":{"domains":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0.customHeaders.items.[INDEX].domains.items.[INDEX]","typeLabel":"string"},"description":"Host patterns that receive these headers. `*.preview.example.com` matches the apex and any subdomain.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0.customHeaders.items.[INDEX].domains","typeLabel":"string[]"},"headers":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0.customHeaders.items.[INDEX].headers.additionalProperties","typeLabel":"string"},"description":"Header name to value. Applied by the platform on matching requests; generated test code cannot read the values.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0.customHeaders.items.[INDEX].headers","typeLabel":"object"}},"description":"Host patterns (`*.preview.example.com` or an exact host) and the headers to attach to matching requests. Used for auth, deployment-protection bypass, and similar platform access. When provided on an environment override, the rules are persisted on the environment.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0.customHeaders.items.[INDEX]","typeLabel":"object"},"description":"Custom headers for this environment. Persisted on create and on reuse. Omit to leave stored headers unchanged; pass an empty list to clear them.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0.customHeaders","typeLabel":"object[]"},"basicAuth":{"type":"array","items":{"type":"object","required":["domains","username","password"],"properties":{"domains":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0.basicAuth.items.[INDEX].domains.items.[INDEX]","typeLabel":"string"},"description":"Host patterns that receive these credentials. `*.preview.example.com` matches the apex and any subdomain.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0.basicAuth.items.[INDEX].domains","typeLabel":"string[]"},"username":{"type":"string","pattern":"^[^:]+$","description":"Basic auth username. May not contain `:`.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0.basicAuth.items.[INDEX].username","typeLabel":"string"},"password":{"type":"string","description":"Basic auth password. Applied by the platform on matching requests; generated test code cannot read it.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0.basicAuth.items.[INDEX].password","typeLabel":"string"}},"description":"Host patterns (`*.preview.example.com` or an exact host) and the HTTP Basic Auth credentials to send to matching hosts. Browser, crawler, and API tests send `Authorization: Basic` to matching hosts only. When provided on an environment override, the rules are persisted on the environment.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0.basicAuth.items.[INDEX]","typeLabel":"object"},"description":"Basic auth rules for this environment. Persisted on create and on reuse. Omit to leave stored rules unchanged; pass an empty list to clear them.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0.basicAuth","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.0","typeLabel":"object"},{"type":"object","description":"Environment to use for this application. Optional customHeaders and basicAuth persist auth or protection-bypass rules on the environment.","required":["shortId"],"properties":{"shortId":{"type":"string","pattern":"^env(-.+_.+|_.+)$","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.1.shortId","typeLabel":"string"},"customHeaders":{"type":"array","items":{"type":"object","required":["domains","headers"],"properties":{"domains":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.1.customHeaders.items.[INDEX].domains.items.[INDEX]","typeLabel":"string"},"description":"Host patterns that receive these headers. `*.preview.example.com` matches the apex and any subdomain.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.1.customHeaders.items.[INDEX].domains","typeLabel":"string[]"},"headers":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.1.customHeaders.items.[INDEX].headers.additionalProperties","typeLabel":"string"},"description":"Header name to value. Applied by the platform on matching requests; generated test code cannot read the values.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.1.customHeaders.items.[INDEX].headers","typeLabel":"object"}},"description":"Host patterns (`*.preview.example.com` or an exact host) and the headers to attach to matching requests. Used for auth, deployment-protection bypass, and similar platform access. When provided on an environment override, the rules are persisted on the environment.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.1.customHeaders.items.[INDEX]","typeLabel":"object"},"description":"Replace custom headers on the existing environment. Omit to leave stored headers unchanged; pass an empty list to clear them.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.1.customHeaders","typeLabel":"object[]"},"basicAuth":{"type":"array","items":{"type":"object","required":["domains","username","password"],"properties":{"domains":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.1.basicAuth.items.[INDEX].domains.items.[INDEX]","typeLabel":"string"},"description":"Host patterns that receive these credentials. `*.preview.example.com` matches the apex and any subdomain.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.1.basicAuth.items.[INDEX].domains","typeLabel":"string[]"},"username":{"type":"string","pattern":"^[^:]+$","description":"Basic auth username. May not contain `:`.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.1.basicAuth.items.[INDEX].username","typeLabel":"string"},"password":{"type":"string","description":"Basic auth password. Applied by the platform on matching requests; generated test code cannot read it.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.1.basicAuth.items.[INDEX].password","typeLabel":"string"}},"description":"Host patterns (`*.preview.example.com` or an exact host) and the HTTP Basic Auth credentials to send to matching hosts. Browser, crawler, and API tests send `Authorization: Basic` to matching hosts only. When provided on an environment override, the rules are persisted on the environment.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.1.basicAuth.items.[INDEX]","typeLabel":"object"},"description":"Replace basic auth rules on the existing environment. Omit to leave stored rules unchanged; pass an empty list to clear them.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.1.basicAuth","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.1","typeLabel":"object"},{"type":"object","description":"Environment to use for this application. Optional customHeaders and basicAuth persist auth or protection-bypass rules on the environment.","required":["applicationBuildShortId"],"properties":{"applicationBuildShortId":{"type":"string","pattern":"^build(-.+_.+|_.+)$","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.applicationBuildShortId","typeLabel":"string"},"otherApplicationBuildShortIds":{"type":"array","items":{"type":"string","pattern":"^build(-.+_.+|_.+)$","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.otherApplicationBuildShortIds.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.otherApplicationBuildShortIds","typeLabel":"string[]"},"customHeaders":{"type":"array","items":{"type":"object","required":["domains","headers"],"properties":{"domains":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.customHeaders.items.[INDEX].domains.items.[INDEX]","typeLabel":"string"},"description":"Host patterns that receive these headers. `*.preview.example.com` matches the apex and any subdomain.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.customHeaders.items.[INDEX].domains","typeLabel":"string[]"},"headers":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.customHeaders.items.[INDEX].headers.additionalProperties","typeLabel":"string"},"description":"Header name to value. Applied by the platform on matching requests; generated test code cannot read the values.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.customHeaders.items.[INDEX].headers","typeLabel":"object"}},"description":"Host patterns (`*.preview.example.com` or an exact host) and the headers to attach to matching requests. Used for auth, deployment-protection bypass, and similar platform access. When provided on an environment override, the rules are persisted on the environment.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.customHeaders.items.[INDEX]","typeLabel":"object"},"description":"Custom headers for the preview environment created or reused for this build. Omit to leave stored headers unchanged; pass an empty list to clear them.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.customHeaders","typeLabel":"object[]"},"basicAuth":{"type":"array","items":{"type":"object","required":["domains","username","password"],"properties":{"domains":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.basicAuth.items.[INDEX].domains.items.[INDEX]","typeLabel":"string"},"description":"Host patterns that receive these credentials. `*.preview.example.com` matches the apex and any subdomain.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.basicAuth.items.[INDEX].domains","typeLabel":"string[]"},"username":{"type":"string","pattern":"^[^:]+$","description":"Basic auth username. May not contain `:`.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.basicAuth.items.[INDEX].username","typeLabel":"string"},"password":{"type":"string","description":"Basic auth password. Applied by the platform on matching requests; generated test code cannot read it.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.basicAuth.items.[INDEX].password","typeLabel":"string"}},"description":"Host patterns (`*.preview.example.com` or an exact host) and the HTTP Basic Auth credentials to send to matching hosts. Browser, crawler, and API tests send `Authorization: Basic` to matching hosts only. When provided on an environment override, the rules are persisted on the environment.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.basicAuth.items.[INDEX]","typeLabel":"object"},"description":"Basic auth rules for the preview environment created or reused for this build. Omit to leave stored rules unchanged; pass an empty list to clear them.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2.basicAuth","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment.oneOf.2","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].environment","typeLabel":"object"},"devicePresetShortId":{"type":"string","pattern":"^preset(-.+_.+|_.+)$","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].devicePresetShortId","typeLabel":"string"},"issueReporters":{"type":"object","description":"Which issue reporters run for this application on this run. A partial accessibility object is completed when the run is created.","properties":{"accessibility":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Watch for axe accessibility issues on this application for this run. Omit to use the caller default: on for API runs, off for MCP.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].issueReporters.accessibility.enabled","typeLabel":"boolean"},"tags":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].issueReporters.accessibility.tags.items.[INDEX]","typeLabel":"string"},"description":"axe-core tags to scan, such as wcag2aa. Omit for the default WCAG 2.0, 2.1, and 2.2 set.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].issueReporters.accessibility.tags","typeLabel":"string[]"},"disabledRules":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].issueReporters.accessibility.disabledRules.items.[INDEX]","typeLabel":"string"},"description":"axe-core rule ids to skip. Omit for the default disabled rules. An empty list disables none.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].issueReporters.accessibility.disabledRules","typeLabel":"string[]"},"includeIncomplete":{"type":"boolean","description":"File axe incomplete results as well as violations. Omit to include them.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].issueReporters.accessibility.includeIncomplete","typeLabel":"boolean"},"iframes":{"type":"boolean","description":"Scan inside iframes. Omit to skip iframes.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].issueReporters.accessibility.iframes","typeLabel":"boolean"}},"description":"Partial accessibility scan override. Omitted fields are filled when the run is created.","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].issueReporters.accessibility","typeLabel":"object"}},"uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX].issueReporters","typeLabel":"object"}},"description":"Application override with a required environment","uniqueKey":"oneOf.0.applicationOverrides.items.[INDEX]","typeLabel":"object"},"description":"Required per-application environment overrides. Optional customHeaders and basicAuth on environment persist auth or protection-bypass rules.","isRequired":true,"uniqueKey":"oneOf.0.applicationOverrides","typeLabel":"object[]"},"prUrl":{"type":"string","format":"uri","isRequired":true,"uniqueKey":"oneOf.0.prUrl","typeLabel":"string\u003curi>"},"context":{"type":"string","uniqueKey":"oneOf.0.context","typeLabel":"string"},"forceNewConversation":{"type":"boolean","description":"Force a brand-new chat instead of reusing the pull request's existing review conversation. Defaults to false, so repeated reviews of the same PR share one chat unless that chat is archived.","default":false,"uniqueKey":"oneOf.0.forceNewConversation","typeLabel":"boolean"},"postMerge":{"type":"object","description":"Optional post-merge options for this PR. Stored on the review conversation and applied when the PR merges. Overrides GitHub App integration settings for this PR only.","required":["enabled"],"properties":{"enabled":{"type":"boolean","description":"When true, run the post-merge agent after this PR merges. When false, skip it even if the GitHub App integration has it enabled.","isRequired":true,"uniqueKey":"oneOf.0.postMerge.enabled","typeLabel":"boolean"},"prompt":{"type":"string","maxLength":4000,"description":"Goal for the post-merge agent. This prompt is the entire task — the agent only changes tests when the prompt asks it to. Omit or leave empty to use the default maintenance prompt.","uniqueKey":"oneOf.0.postMerge.prompt","typeLabel":"string"}},"uniqueKey":"oneOf.0.postMerge","typeLabel":"object"},"triage":{"type":"object","description":"Optional PR triage options for this review. GitHub pull requests only. Overrides the GitHub App integration PR triage toggle and prompt for this review.","properties":{"enabled":{"type":"boolean","description":"When true, triage may skip this review even if the GitHub App integration has PR triage off. When false, never skip this review, including a commit triage already skipped. Omit to follow the integration toggle.","uniqueKey":"oneOf.0.triage.enabled","typeLabel":"boolean"},"prompt":{"type":"string","maxLength":4000,"description":"PR triage prompt for this review, replacing the GitHub App integration prompt. Describes which changes to skip and which to review. Does not turn triage on by itself. Omit or leave empty to use the integration prompt.","uniqueKey":"oneOf.0.triage.prompt","typeLabel":"string"}},"uniqueKey":"oneOf.0.triage","typeLabel":"object"},"disableReviewComments":{"type":"boolean","description":"When true, the agent does not post its review comments to the pull request. The review still runs and is stored in QA.tech, and the GitHub check run is still reported. Use it when you do not want comments on the PR, for example during evaluation. Stored on the review conversation, so later reviews of this PR also stay silent until a request sends `false`. Omit to keep the conversation's current setting (comments are posted by default).","uniqueKey":"oneOf.0.disableReviewComments","typeLabel":"boolean"},"actor":{"type":"string","description":"Username that triggered the CI job. Example: `octocat`.","uniqueKey":"oneOf.0.actor","typeLabel":"string"},"branch":{"type":"string","description":"Branch the run was triggered from. Example: `main` or `refs/heads/main`.","uniqueKey":"oneOf.0.branch","typeLabel":"string"},"commitHash":{"type":"string","description":"Full commit SHA the run was triggered for. Used to link the run back to the commit.","uniqueKey":"oneOf.0.commitHash","typeLabel":"string"},"commitMessage":{"type":"string","description":"Commit message subject for the triggering commit.","uniqueKey":"oneOf.0.commitMessage","typeLabel":"string"},"repository":{"type":"string","description":"Repository the run was triggered from, as `owner/name`. Example: `QAdottech/qatech`.","uniqueKey":"oneOf.0.repository","typeLabel":"string"},"projectShortId":{"type":"string","description":"Target a specific project by its prefixed short ID (proj-slug_shortId or proj_shortId), as returned by the projects API. Required for organization-scoped API keys; project-scoped keys may only pass their own project's short ID.","pattern":"^proj(-.+_.+|_.+)$","uniqueKey":"oneOf.0.projectShortId","typeLabel":"string"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","description":"Request body for starting a change review chat","required":["mode","changes","applicationOverrides"],"properties":{"mode":{"type":"string","enum":["rawChanges"],"isRequired":true,"uniqueKey":"oneOf.1.mode","typeLabel":"enum\u003cstring>"},"changes":{"type":"object","required":["changeDescription","diff"],"properties":{"changeDescription":{"type":"string","minLength":1,"description":"Description of the changes","isRequired":true,"uniqueKey":"oneOf.1.changes.changeDescription","typeLabel":"string"},"diff":{"type":"string","minLength":1,"description":"Git diff content.","isRequired":true,"uniqueKey":"oneOf.1.changes.diff","typeLabel":"string"}},"description":"Structured raw change data for change review mode","isRequired":true,"uniqueKey":"oneOf.1.changes","typeLabel":"object"},"applicationOverrides":{"type":"array","items":{"type":"object","required":["applicationShortId","environment"],"properties":{"applicationShortId":{"type":"string","pattern":"^app(-.+_.+|_.+)$","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].applicationShortId","typeLabel":"string"},"environment":{"oneOf":[{"type":"object","description":"Environment to use for this application. Optional customHeaders and basicAuth persist auth or protection-bypass rules on the environment.","required":["url"],"properties":{"url":{"type":"string","format":"uri","pattern":"^https?:\\x2f\\x2f","description":"Base URL of the environment. Must use http or https.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0.url","typeLabel":"string\u003curi>"},"name":{"type":"string","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0.name","typeLabel":"string"},"customHeaders":{"type":"array","items":{"type":"object","required":["domains","headers"],"properties":{"domains":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0.customHeaders.items.[INDEX].domains.items.[INDEX]","typeLabel":"string"},"description":"Host patterns that receive these headers. `*.preview.example.com` matches the apex and any subdomain.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0.customHeaders.items.[INDEX].domains","typeLabel":"string[]"},"headers":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0.customHeaders.items.[INDEX].headers.additionalProperties","typeLabel":"string"},"description":"Header name to value. Applied by the platform on matching requests; generated test code cannot read the values.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0.customHeaders.items.[INDEX].headers","typeLabel":"object"}},"description":"Host patterns (`*.preview.example.com` or an exact host) and the headers to attach to matching requests. Used for auth, deployment-protection bypass, and similar platform access. When provided on an environment override, the rules are persisted on the environment.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0.customHeaders.items.[INDEX]","typeLabel":"object"},"description":"Custom headers for this environment. Persisted on create and on reuse. Omit to leave stored headers unchanged; pass an empty list to clear them.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0.customHeaders","typeLabel":"object[]"},"basicAuth":{"type":"array","items":{"type":"object","required":["domains","username","password"],"properties":{"domains":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0.basicAuth.items.[INDEX].domains.items.[INDEX]","typeLabel":"string"},"description":"Host patterns that receive these credentials. `*.preview.example.com` matches the apex and any subdomain.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0.basicAuth.items.[INDEX].domains","typeLabel":"string[]"},"username":{"type":"string","pattern":"^[^:]+$","description":"Basic auth username. May not contain `:`.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0.basicAuth.items.[INDEX].username","typeLabel":"string"},"password":{"type":"string","description":"Basic auth password. Applied by the platform on matching requests; generated test code cannot read it.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0.basicAuth.items.[INDEX].password","typeLabel":"string"}},"description":"Host patterns (`*.preview.example.com` or an exact host) and the HTTP Basic Auth credentials to send to matching hosts. Browser, crawler, and API tests send `Authorization: Basic` to matching hosts only. When provided on an environment override, the rules are persisted on the environment.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0.basicAuth.items.[INDEX]","typeLabel":"object"},"description":"Basic auth rules for this environment. Persisted on create and on reuse. Omit to leave stored rules unchanged; pass an empty list to clear them.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0.basicAuth","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.0","typeLabel":"object"},{"type":"object","description":"Environment to use for this application. Optional customHeaders and basicAuth persist auth or protection-bypass rules on the environment.","required":["shortId"],"properties":{"shortId":{"type":"string","pattern":"^env(-.+_.+|_.+)$","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.1.shortId","typeLabel":"string"},"customHeaders":{"type":"array","items":{"type":"object","required":["domains","headers"],"properties":{"domains":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.1.customHeaders.items.[INDEX].domains.items.[INDEX]","typeLabel":"string"},"description":"Host patterns that receive these headers. `*.preview.example.com` matches the apex and any subdomain.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.1.customHeaders.items.[INDEX].domains","typeLabel":"string[]"},"headers":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.1.customHeaders.items.[INDEX].headers.additionalProperties","typeLabel":"string"},"description":"Header name to value. Applied by the platform on matching requests; generated test code cannot read the values.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.1.customHeaders.items.[INDEX].headers","typeLabel":"object"}},"description":"Host patterns (`*.preview.example.com` or an exact host) and the headers to attach to matching requests. Used for auth, deployment-protection bypass, and similar platform access. When provided on an environment override, the rules are persisted on the environment.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.1.customHeaders.items.[INDEX]","typeLabel":"object"},"description":"Replace custom headers on the existing environment. Omit to leave stored headers unchanged; pass an empty list to clear them.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.1.customHeaders","typeLabel":"object[]"},"basicAuth":{"type":"array","items":{"type":"object","required":["domains","username","password"],"properties":{"domains":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.1.basicAuth.items.[INDEX].domains.items.[INDEX]","typeLabel":"string"},"description":"Host patterns that receive these credentials. `*.preview.example.com` matches the apex and any subdomain.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.1.basicAuth.items.[INDEX].domains","typeLabel":"string[]"},"username":{"type":"string","pattern":"^[^:]+$","description":"Basic auth username. May not contain `:`.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.1.basicAuth.items.[INDEX].username","typeLabel":"string"},"password":{"type":"string","description":"Basic auth password. Applied by the platform on matching requests; generated test code cannot read it.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.1.basicAuth.items.[INDEX].password","typeLabel":"string"}},"description":"Host patterns (`*.preview.example.com` or an exact host) and the HTTP Basic Auth credentials to send to matching hosts. Browser, crawler, and API tests send `Authorization: Basic` to matching hosts only. When provided on an environment override, the rules are persisted on the environment.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.1.basicAuth.items.[INDEX]","typeLabel":"object"},"description":"Replace basic auth rules on the existing environment. Omit to leave stored rules unchanged; pass an empty list to clear them.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.1.basicAuth","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.1","typeLabel":"object"},{"type":"object","description":"Environment to use for this application. Optional customHeaders and basicAuth persist auth or protection-bypass rules on the environment.","required":["applicationBuildShortId"],"properties":{"applicationBuildShortId":{"type":"string","pattern":"^build(-.+_.+|_.+)$","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.applicationBuildShortId","typeLabel":"string"},"otherApplicationBuildShortIds":{"type":"array","items":{"type":"string","pattern":"^build(-.+_.+|_.+)$","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.otherApplicationBuildShortIds.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.otherApplicationBuildShortIds","typeLabel":"string[]"},"customHeaders":{"type":"array","items":{"type":"object","required":["domains","headers"],"properties":{"domains":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.customHeaders.items.[INDEX].domains.items.[INDEX]","typeLabel":"string"},"description":"Host patterns that receive these headers. `*.preview.example.com` matches the apex and any subdomain.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.customHeaders.items.[INDEX].domains","typeLabel":"string[]"},"headers":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.customHeaders.items.[INDEX].headers.additionalProperties","typeLabel":"string"},"description":"Header name to value. Applied by the platform on matching requests; generated test code cannot read the values.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.customHeaders.items.[INDEX].headers","typeLabel":"object"}},"description":"Host patterns (`*.preview.example.com` or an exact host) and the headers to attach to matching requests. Used for auth, deployment-protection bypass, and similar platform access. When provided on an environment override, the rules are persisted on the environment.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.customHeaders.items.[INDEX]","typeLabel":"object"},"description":"Custom headers for the preview environment created or reused for this build. Omit to leave stored headers unchanged; pass an empty list to clear them.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.customHeaders","typeLabel":"object[]"},"basicAuth":{"type":"array","items":{"type":"object","required":["domains","username","password"],"properties":{"domains":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.basicAuth.items.[INDEX].domains.items.[INDEX]","typeLabel":"string"},"description":"Host patterns that receive these credentials. `*.preview.example.com` matches the apex and any subdomain.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.basicAuth.items.[INDEX].domains","typeLabel":"string[]"},"username":{"type":"string","pattern":"^[^:]+$","description":"Basic auth username. May not contain `:`.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.basicAuth.items.[INDEX].username","typeLabel":"string"},"password":{"type":"string","description":"Basic auth password. Applied by the platform on matching requests; generated test code cannot read it.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.basicAuth.items.[INDEX].password","typeLabel":"string"}},"description":"Host patterns (`*.preview.example.com` or an exact host) and the HTTP Basic Auth credentials to send to matching hosts. Browser, crawler, and API tests send `Authorization: Basic` to matching hosts only. When provided on an environment override, the rules are persisted on the environment.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.basicAuth.items.[INDEX]","typeLabel":"object"},"description":"Basic auth rules for the preview environment created or reused for this build. Omit to leave stored rules unchanged; pass an empty list to clear them.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2.basicAuth","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment.oneOf.2","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].environment","typeLabel":"object"},"devicePresetShortId":{"type":"string","pattern":"^preset(-.+_.+|_.+)$","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].devicePresetShortId","typeLabel":"string"},"issueReporters":{"type":"object","description":"Which issue reporters run for this application on this run. A partial accessibility object is completed when the run is created.","properties":{"accessibility":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Watch for axe accessibility issues on this application for this run. Omit to use the caller default: on for API runs, off for MCP.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].issueReporters.accessibility.enabled","typeLabel":"boolean"},"tags":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].issueReporters.accessibility.tags.items.[INDEX]","typeLabel":"string"},"description":"axe-core tags to scan, such as wcag2aa. Omit for the default WCAG 2.0, 2.1, and 2.2 set.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].issueReporters.accessibility.tags","typeLabel":"string[]"},"disabledRules":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].issueReporters.accessibility.disabledRules.items.[INDEX]","typeLabel":"string"},"description":"axe-core rule ids to skip. Omit for the default disabled rules. An empty list disables none.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].issueReporters.accessibility.disabledRules","typeLabel":"string[]"},"includeIncomplete":{"type":"boolean","description":"File axe incomplete results as well as violations. Omit to include them.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].issueReporters.accessibility.includeIncomplete","typeLabel":"boolean"},"iframes":{"type":"boolean","description":"Scan inside iframes. Omit to skip iframes.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].issueReporters.accessibility.iframes","typeLabel":"boolean"}},"description":"Partial accessibility scan override. Omitted fields are filled when the run is created.","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].issueReporters.accessibility","typeLabel":"object"}},"uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX].issueReporters","typeLabel":"object"}},"description":"Application override with a required environment","uniqueKey":"oneOf.1.applicationOverrides.items.[INDEX]","typeLabel":"object"},"description":"Required per-application environment overrides. Optional customHeaders and basicAuth on environment persist auth or protection-bypass rules.","isRequired":true,"uniqueKey":"oneOf.1.applicationOverrides","typeLabel":"object[]"},"context":{"type":"string","uniqueKey":"oneOf.1.context","typeLabel":"string"},"actor":{"type":"string","description":"Username that triggered the CI job. Example: `octocat`.","uniqueKey":"oneOf.1.actor","typeLabel":"string"},"branch":{"type":"string","description":"Branch the run was triggered from. Example: `main` or `refs/heads/main`.","uniqueKey":"oneOf.1.branch","typeLabel":"string"},"commitHash":{"type":"string","description":"Full commit SHA the run was triggered for. Used to link the run back to the commit.","uniqueKey":"oneOf.1.commitHash","typeLabel":"string"},"commitMessage":{"type":"string","description":"Commit message subject for the triggering commit.","uniqueKey":"oneOf.1.commitMessage","typeLabel":"string"},"repository":{"type":"string","description":"Repository the run was triggered from, as `owner/name`. Example: `QAdottech/qatech`.","uniqueKey":"oneOf.1.repository","typeLabel":"string"},"projectShortId":{"type":"string","description":"Target a specific project by its prefixed short ID (proj-slug_shortId or proj_shortId), as returned by the projects API. Required for organization-scoped API keys; project-scoped keys may only pass their own project's short ID.","pattern":"^proj(-.+_.+|_.+)$","uniqueKey":"oneOf.1.projectShortId","typeLabel":"string"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"mode":"pr","applicationOverrides":[{"applicationShortId":"\u003cstring>","environment":{"url":"\u003cstring>","name":"\u003cstring>","customHeaders":[{"domains":["\u003cstring>"],"headers":{}}],"basicAuth":[{"domains":["\u003cstring>"],"username":"\u003cstring>","password":"\u003cstring>"}]},"devicePresetShortId":"\u003cstring>","issueReporters":{"accessibility":{"enabled":true,"tags":["\u003cstring>"],"disabledRules":["\u003cstring>"],"includeIncomplete":true,"iframes":true}}}],"prUrl":"\u003cstring>","context":"\u003cstring>","forceNewConversation":false,"triage":{"enabled":true,"prompt":"\u003cstring>"},"disableReviewComments":true,"actor":"\u003cstring>","branch":"\u003cstring>","commitHash":"\u003cstring>","commitMessage":"\u003cstring>","repository":"\u003cstring>","projectShortId":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"255fa41e-452f-4113-b433-3f10517e2dcd":{"description":"The request has been accepted for processing, but processing has not yet completed.","content":{"application/json":{"schema":{"type":"object","required":["shortId","url","createdAt","updatedAt","status","runs"],"properties":{"shortId":{"type":"string","pattern":"^chat(-.+_.+|_.+)$","isRequired":true,"uniqueKey":"shortId","typeLabel":"string"},"url":{"type":"string","description":"Dashboard URL for the conversation.","isRequired":true,"uniqueKey":"url","typeLabel":"string"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"updatedAt","typeLabel":"string\u003cdate-time>"},"status":{"type":"string","enum":["in_progress","completed","failed","cancelled"],"description":"Overall conversation lifecycle. `in_progress` while the assistant is working or a background test run / research task is still going. Assistant message `COMPLETED` is not enough — starting a run ends the current turn. Poll until this is `completed`, `failed`, or `cancelled`.","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"runs":{"type":"array","items":{"type":"object","required":["shortId","status","result","url"],"properties":{"shortId":{"type":"string","isRequired":true,"uniqueKey":"runs.items.[INDEX].shortId","typeLabel":"string"},"status":{"type":"string","description":"Run lifecycle status: `INITIATED`, `RUNNING`, `COMPLETED`, `ERROR`, or `CANCELLED`.","isRequired":true,"uniqueKey":"runs.items.[INDEX].status","typeLabel":"string"},"result":{"oneOf":[{"type":"string","description":"Run outcome once complete: `PASSED`, `FAILED`, or `SKIPPED`. `null` while the run is still in progress.","isRequired":true,"uniqueKey":"runs.items.[INDEX].result.oneOf.0","typeLabel":"string"},{"type":"null","description":"Run outcome once complete: `PASSED`, `FAILED`, or `SKIPPED`. `null` while the run is still in progress.","isRequired":true,"uniqueKey":"runs.items.[INDEX].result.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"runs.items.[INDEX].result","typeLabel":"string | null"},"url":{"type":"string","description":"Dashboard URL for the run.","isRequired":true,"uniqueKey":"runs.items.[INDEX].url","typeLabel":"string"}},"description":"A test run started from this conversation. `shortId` works with `get_run` and `rerun_run`.","uniqueKey":"runs.items.[INDEX]","typeLabel":"object"},"description":"Test runs started from this conversation, newest first. Empty until a run is created. Use `shortId` with `get_run` (`testCases` = all) or nested test-case short IDs from that call with `get_run_test_case`.","isRequired":true,"uniqueKey":"runs","typeLabel":"object[]"},"title":{"type":"string","uniqueKey":"title","typeLabel":"string"},"source":{"type":"string","enum":["api","ui","github","gitlab","system"],"description":"Where the conversation originated. `api` for conversations created via this API, `ui` for the dashboard, `github`/`gitlab` for VCS-triggered chats, and `system` for everything else.","uniqueKey":"source","typeLabel":"enum\u003cstring>"},"messages":{"type":"array","items":{"type":"object","required":["id","role","createdAt","text"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"messages.items.[INDEX].id","typeLabel":"string"},"role":{"type":"string","enum":["user","assistant"],"isRequired":true,"uniqueKey":"messages.items.[INDEX].role","typeLabel":"enum\u003cstring>"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"messages.items.[INDEX].createdAt","typeLabel":"string\u003cdate-time>"},"text":{"type":"string","description":"The plain-text body of the message.","isRequired":true,"uniqueKey":"messages.items.[INDEX].text","typeLabel":"string"},"status":{"type":"string","enum":["INITIATED","PARTIAL","COMPLETED","CANCELLED","FAILED"],"description":"Lifecycle status of this message. Do not treat assistant `COMPLETED` as the end of the conversation — starting a test run ends the current turn while the run continues in the background. Poll the conversation `status` instead.","uniqueKey":"messages.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"isStreaming":{"type":"boolean","description":"True while the assistant is still streaming tokens for this message.","uniqueKey":"messages.items.[INDEX].isStreaming","typeLabel":"boolean"}},"description":"A chat message. Tool calls and reasoning are not exposed in this version; only the text response is returned.","uniqueKey":"messages.items.[INDEX]","typeLabel":"object"},"description":"Recent messages, newest first. Empty on creation; poll `get_chat_conversation` to retrieve. Internal wake messages are omitted.","uniqueKey":"messages","typeLabel":"object[]"}},"description":"Conversation data with recent messages (newest first).","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"shortId":"\u003cstring>","url":"\u003cstring>","createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z","status":"in_progress","runs":[{"shortId":"\u003cstring>","status":"\u003cstring>","result":"\u003cstring>","url":"\u003cstring>"}],"title":"\u003cstring>","source":"api","messages":[{"id":"\u003cstring>","role":"user","createdAt":"2023-11-07T05:31:56Z","text":"\u003cstring>","status":"INITIATED","isStreaming":true}]}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"3fc27c53-85da-4c9b-980b-3fb5d7c58b5b":{"BearerAuth":{"type":"http","scheme":"Bearer","scopes":[],"schemeName":"BearerAuth"}}},"servers":{"b99898d0-c133-4743-b3d1-6c69fe9edd93":{"url":"https://api.qa.tech","description":"Production","variables":{}}},"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":"api-reference/api.json"},"subdomain":"qatech","siteName":"QA.tech Docs","title":"Start change review chat - QA.tech Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-04T11:59:57.519Z","originalFileLocation":"api-reference/chat/start-change-review-chat.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Start an autonomous change review from either a PR URL or raw change input. Returns 202 with the review conversation. PR mode reuses the pull request\u0026#x27;s existing review conversation unless forceNewConversation is true or that conversation is archived. For a GitHub pull request\u0026#x27;s head commit: - If a POST /chat/change-review/prepare request left a review waiting, this request runs its tests against applicationOverrides in the same conversation, with this request\u0026#x27;s context. - Otherwise it runs a full review. - If PR triage skipped the commit, it does nothing unless it sends triage.enabled: false or a review was requested with @qa.tech. Send commitHash from CI (pull_request.head.sha) when calling from GitHub Actions so triage, prepare, and this request key off the commit the workflow is building. QA.tech uses it for review state and updates the stored pull request head when webhooks lag. In every case the response is the review conversation. Poll get_chat_conversation until its status is completed, failed, or cancelled.\">\u003cmeta data-mint-head name=\"application-name\" content=\"QA.tech Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/qatech/iMlZaRlMvi7xyIQO/_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/qatech/iMlZaRlMvi7xyIQO/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/qatech/iMlZaRlMvi7xyIQO/_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/qatech/iMlZaRlMvi7xyIQO/_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/qatech/iMlZaRlMvi7xyIQO/_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/qatech/iMlZaRlMvi7xyIQO/_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/qatech/iMlZaRlMvi7xyIQO/_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/qatech/iMlZaRlMvi7xyIQO/_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/qatech/iMlZaRlMvi7xyIQO/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Start change review chat - QA.tech Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Start an autonomous change review from either a PR URL or raw change input. Returns 202 with the review conversation. PR mode reuses the pull request\u0026#x27;s existing review conversation unless forceNewConversation is true or that conversation is archived. For a GitHub pull request\u0026#x27;s head commit: - If a POST /chat/change-review/prepare request left a review waiting, this request runs its tests against applicationOverrides in the same conversation, with this request\u0026#x27;s context. - Otherwise it runs a full review. - If PR triage skipped the commit, it does nothing unless it sends triage.enabled: false or a review was requested with @qa.tech. Send commitHash from CI (pull_request.head.sha) when calling from GitHub Actions so triage, prepare, and this request key off the commit the workflow is building. QA.tech uses it for review state and updates the stored pull request head when webhooks lag. In every case the response is the review conversation. Poll get_chat_conversation until its status is completed, failed, or cancelled.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"QA.tech Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.qa.tech/api-reference/chat/start-change-review-chat\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://qatech.mintlify.app/_mintlify/api/og/v2?division=Chat\u0026amp;title=Start+change+review+chat\u0026amp;description=Start+an+autonomous+change+review+from+either+a+PR+URL+or+raw+change+input.+Returns+202+with+the+review+conversation.%0A%0APR+mode+reuses+the+pull+request%27s+existin\u0026amp;theme=1ae391f617cb8a464ae673d4\u0026amp;signature=670cdda293e7a81a2de5f28c12871b39fb8fc55facd22af65071018cce281d2d\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Start change review chat - QA.tech Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Start an autonomous change review from either a PR URL or raw change input. Returns 202 with the review conversation. PR mode reuses the pull request\u0026#x27;s existing review conversation unless forceNewConversation is true or that conversation is archived. For a GitHub pull request\u0026#x27;s head commit: - If a POST /chat/change-review/prepare request left a review waiting, this request runs its tests against applicationOverrides in the same conversation, with this request\u0026#x27;s context. - Otherwise it runs a full review. - If PR triage skipped the commit, it does nothing unless it sends triage.enabled: false or a review was requested with @qa.tech. Send commitHash from CI (pull_request.head.sha) when calling from GitHub Actions so triage, prepare, and this request key off the commit the workflow is building. QA.tech uses it for review state and updates the stored pull request head when webhooks lag. In every case the response is the review conversation. Poll get_chat_conversation until its status is completed, failed, or cancelled.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://qatech.mintlify.app/_mintlify/api/og/v2?division=Chat\u0026amp;title=Start+change+review+chat\u0026amp;description=Start+an+autonomous+change+review+from+either+a+PR+URL+or+raw+change+input.+Returns+202+with+the+review+conversation.%0A%0APR+mode+reuses+the+pull+request%27s+existin\u0026amp;theme=1ae391f617cb8a464ae673d4\u0026amp;signature=670cdda293e7a81a2de5f28c12871b39fb8fc55facd22af65071018cce281d2d\">\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/qatech/iMlZaRlMvi7xyIQO/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"QA.tech Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#4F46E5\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.qa.tech/api-reference/chat/start-change-review-chat\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/chat/start-change-review-chat.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.qa.tech/#organization\",\"name\":\"QA.tech Docs\",\"url\":\"https://docs.qa.tech\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/qatech/tn7srSYA67gRWgfI/logo/logo.svg?fit=max\u0026auto=format\u0026n=tn7srSYA67gRWgfI\u0026q=85\u0026s=2f0e3745a8079e74e66e0a904232888f\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.qa.tech#website\",\"name\":\"QA.tech Docs\",\"url\":\"https://docs.qa.tech\",\"publisher\":{\"@id\":\"https://docs.qa.tech/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.qa.tech/api-reference/chat/start-change-review-chat#webpage\",\"url\":\"https://docs.qa.tech/api-reference/chat/start-change-review-chat\",\"name\":\"Start change review chat\",\"description\":\"Start an autonomous change review from either a PR URL or raw change input. Returns 202 with the review conversation. PR mode reuses the pull request's existing review conversation unless forceNewConversation is true or that conversation is archived. For a GitHub pull request's head commit: - If a POST /chat/change-review/prepare request left a review waiting, this request runs its tests against applicationOverrides in the same conversation, with this request's context. - Otherwise it runs a full review. - If PR triage skipped the commit, it does nothing unless it sends triage.enabled: false or a review was requested with @qa.tech. Send commitHash from CI (pull_request.head.sha) when calling from GitHub Actions so triage, prepare, and this request key off the commit the workflow is building. QA.tech uses it for review state and updates the stored pull request head when webhooks lag. In every case the response is the review conversation. Poll get_chat_conversation until its status is completed, failed, or cancelled.\",\"dateModified\":\"2026-11-04T11:59:57.519Z\",\"isPartOf\":{\"@id\":\"https://docs.qa.tech#website\"},\"breadcrumb\":{\"@id\":\"https://docs.qa.tech/api-reference/chat/start-change-review-chat#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.qa.tech/api-reference/chat/start-change-review-chat#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.qa.tech/api-reference/applications/list-applications\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Chat\",\"item\":\"https://docs.qa.tech/api-reference/chat/start-chat-conversation\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Start change review chat\",\"item\":\"https://docs.qa.tech/api-reference/chat/start-change-review-chat\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.qa.tech/api-reference/chat/start-change-review-chat#apireference\",\"headline\":\"Start change review chat\",\"name\":\"Start change review chat\",\"description\":\"Start an autonomous change review from either a PR URL or raw change input. Returns 202 with the review conversation. PR mode reuses the pull request's existing review conversation unless forceNewConversation is true or that conversation is archived. For a GitHub pull request's head commit: - If a POST /chat/change-review/prepare request left a review waiting, this request runs its tests against applicationOverrides in the same conversation, with this request's context. - Otherwise it runs a full review. - If PR triage skipped the commit, it does nothing unless it sends triage.enabled: false or a review was requested with @qa.tech. Send commitHash from CI (pull_request.head.sha) when calling from GitHub Actions so triage, prepare, and this request key off the commit the workflow is building. QA.tech uses it for review state and updates the stored pull request head when webhooks lag. In every case the response is the review conversation. Poll get_chat_conversation until its status is completed, failed, or cancelled.\",\"url\":\"https://docs.qa.tech/api-reference/chat/start-change-review-chat\",\"mainEntityOfPage\":{\"@id\":\"https://docs.qa.tech/api-reference/chat/start-change-review-chat#webpage\"},\"dateModified\":\"2026-11-04T11:59:57.519Z\",\"publisher\":{\"@id\":\"https://docs.qa.tech/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.qa.tech#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"QA.tech Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"QA.tech Docs","nav":{"global":{"anchors":[{"anchor":"Blog","icon":"newspaper","href":"https://qa.tech/blog/"}]},"tabs":[{"tab":"Get Started","icon":"book-open","pages":[{"title":"Get Started","href":"/core-concepts/ai-agent-testing"}]},{"tab":"AI Assistant","icon":"message-bot","pages":[{"title":"AI Assistant","href":"/core-concepts/ai-chat-assistant"}]},{"tab":"Build Tests","icon":"list-check","pages":[{"title":"Build Tests","href":"/best-practices/creating-tests"}]},{"tab":"PR Testing","icon":"code-pull-request","pages":[{"title":"PR Testing","href":"/pr-testing/overview"}]},{"tab":"Regression Testing","icon":"clipboard-list","pages":[{"title":"Regression Testing","href":"/regression-testing/overview"}]},{"tab":"Integrations","icon":"plug","pages":[{"title":"Integrations","href":"/configuration/github-app"}]},{"tab":"API and CLI","icon":"square-terminal","groups":[{"group":"Overview","pages":[{"title":"API Introduction","icon":"code","href":"/api-reference/introduction"},{"title":"Applications API","icon":"browser","href":"/api-reference/applications"},{"title":"Application Builds API","icon":"mobile","href":"/api-reference/application-builds"},{"title":"Chat API","icon":"message-bot","href":"/api-reference/chat"},{"title":"Remote Tunnels API","icon":"link","href":"/api-reference/remote-tunnels"},{"title":"Exporting Test Cases","icon":"file-export","href":"/api-reference/exporting-test-cases"}]},{"group":"Endpoints","pages":[{"group":"Applications","pages":[{"title":"List applications","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/applications","href":"/api-reference/applications/list-applications"},{"title":"Create application","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/applications","href":"/api-reference/applications/create-application"},{"title":"List application environments","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/applications/{applicationShortId}/environments","href":"/api-reference/applications/list-application-environments"}]},{"group":"Application Builds","pages":[{"title":"List application builds","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/applications/{applicationShortId}/builds","href":"/api-reference/application-builds/list-application-builds"},{"title":"Create application build","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/applications/{applicationShortId}/builds","href":"/api-reference/application-builds/create-application-build"},{"title":"Get build upload URL","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/applications/{applicationShortId}/builds/upload-url","href":"/api-reference/application-builds/get-build-upload-url"}]},{"group":"Automations","pages":[{"title":"List automations","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/automations","href":"/api-reference/automations/list-automations"},{"title":"Create automation","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/automations","href":"/api-reference/automations/create-automation"},{"title":"Delete automation","deprecated":null,"version":null,"openapi":"/api-reference/api.json delete /v1/automations/{automationId}","href":"/api-reference/automations/delete-automation"},{"title":"Update automation","deprecated":null,"version":null,"openapi":"/api-reference/api.json patch /v1/automations/{automationId}","href":"/api-reference/automations/update-automation"},{"title":"Trigger automation","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/automations/{automationId}/trigger","href":"/api-reference/automations/trigger-automation"}]},{"group":"Status badge","pages":[{"title":"Get example status badge","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/badge-example.svg","href":"/api-reference/status-badge/get-example-status-badge"},{"title":"Get status badge","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/badge.svg","href":"/api-reference/status-badge/get-status-badge"}]},{"group":"Chat","pages":[{"title":"Start chat conversation","description":"Create a new chat conversation and send its first message.\n\nThis is the recommended way to author tests. The QA.tech agent explores the site, grounds tests in what actually exists, and sets up login and config dependencies, so the tests are reliable rather than flaky. Prefer it over `create_test_case` unless you have already verified the flow exists and gathered the details that tool requires.\n\nReturns 202 immediately with the created conversation. Processing is asynchronous: poll\n`get_chat_conversation` until conversation `status` is `completed`, `failed`, or\n`cancelled`. Assistant message `COMPLETED` is not enough — starting a test run ends\nthe current turn while the run continues. Wait at least 1s between polls. When a run\nexists, `runs[].shortId` is the handle for `get_run` / `get_run_test_case`.","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/chat","href":"/api-reference/chat/start-chat-conversation"},{"title":"Start change review chat","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/chat/change-review","href":"/api-reference/chat/start-change-review-chat"},{"title":"Prepare change review","description":"Start a GitHub pull request's change review before its preview is deployed. Call it when the PR opens or gets a new commit. Returns 202 with the review conversation, reused the same way as `POST /chat/change-review`.\n\nThe agent reads the change and creates the tests it plans to run, without running them. Once the preview is deployed, send `POST /chat/change-review` with `applicationOverrides` for the same head commit: QA.tech treats it as the deployment being ready, and the waiting review runs its tests there.\n\nSend `commitHash` from CI (`pull_request.head.sha`) on every prepare call so a new push is triaged and prepared for that commit, not a stale head still in the database. A new commit always gets a fresh prepare; a repeat call for the same commit does nothing if that commit already has a review round in the conversation.\n\nPoll `get_chat_conversation` until its `status` is `completed`, `failed`, or `cancelled`; a prepared conversation completes once the tests are created.","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/chat/change-review/prepare","href":"/api-reference/chat/prepare-change-review"},{"title":"Get chat conversation","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/chat/{chatConversationShortId}","href":"/api-reference/chat/get-chat-conversation"},{"title":"Send chat message","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/chat/{chatConversationShortId}","href":"/api-reference/chat/send-chat-message"}]},{"group":"Features","pages":[{"title":"List features","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/features","href":"/api-reference/features/list-features"},{"title":"Get feature","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/features/{featureId}","href":"/api-reference/features/get-feature"}]},{"group":"Issues","pages":[{"title":"List issues","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/issues","href":"/api-reference/issues/list-issues"},{"title":"Get issue","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/issues/{shortId}","href":"/api-reference/issues/get-issue"}]},{"group":"Knowledge","pages":[{"title":"List knowledge items","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/knowledge","href":"/api-reference/knowledge/list-knowledge-items"},{"title":"Create knowledge item","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/knowledge","href":"/api-reference/knowledge/create-knowledge-item"},{"title":"Get knowledge item","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/knowledge/{knowledgeItemId}","href":"/api-reference/knowledge/get-knowledge-item"},{"title":"Delete knowledge item","deprecated":null,"version":null,"openapi":"/api-reference/api.json delete /v1/knowledge/{knowledgeItemId}","href":"/api-reference/knowledge/delete-knowledge-item"},{"title":"Update knowledge item","deprecated":null,"version":null,"openapi":"/api-reference/api.json patch /v1/knowledge/{knowledgeItemId}","href":"/api-reference/knowledge/update-knowledge-item"}]},{"group":"Metrics","pages":[{"title":"Get project metrics","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/metrics","href":"/api-reference/metrics/get-project-metrics"}]},{"group":"Infrastructure","pages":[{"title":"Get outbound IPs","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/outbound-ips","href":"/api-reference/infrastructure/get-outbound-ips"}]},{"group":"Projects","pages":[{"title":"List projects","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/projects","href":"/api-reference/projects/list-projects"},{"title":"Create project","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/projects","href":"/api-reference/projects/create-project"}]},{"group":"Remote Tunnels","pages":[{"title":"List remote tunnels","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/remote-tunnels","href":"/api-reference/remote-tunnels/list-remote-tunnels"},{"title":"Create remote tunnel","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/remote-tunnels","href":"/api-reference/remote-tunnels/create-remote-tunnel"},{"title":"Get remote tunnel","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/remote-tunnels/{runnerId}","href":"/api-reference/remote-tunnels/get-remote-tunnel"},{"title":"Delete remote tunnel","deprecated":null,"version":null,"openapi":"/api-reference/api.json delete /v1/remote-tunnels/{runnerId}","href":"/api-reference/remote-tunnels/delete-remote-tunnel"},{"title":"Get remote tunnel status","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/remote-tunnels/{runnerId}/status","href":"/api-reference/remote-tunnels/get-remote-tunnel-status"}]},{"group":"Rules","pages":[{"title":"List rules","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/rules","href":"/api-reference/rules/list-rules"},{"title":"Create rule","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/rules","href":"/api-reference/rules/create-rule"},{"title":"Delete rule","deprecated":null,"version":null,"openapi":"/api-reference/api.json delete /v1/rules/{ruleId}","href":"/api-reference/rules/delete-rule"},{"title":"Update rule","deprecated":null,"version":null,"openapi":"/api-reference/api.json patch /v1/rules/{ruleId}","href":"/api-reference/rules/update-rule"}]},{"group":"Runs","pages":[{"title":"List runs","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/run","href":"/api-reference/runs/list-runs"},{"title":"Start test run","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/run","href":"/api-reference/runs/start-test-run"},{"title":"Get run test case","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/run-test-case/{shortId}","href":"/api-reference/runs/get-run-test-case"},{"title":"Get test case history","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/run-test-case/{shortId}/history","href":"/api-reference/runs/get-test-case-history"},{"title":"Get run test case logs","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/run-test-case/{shortId}/logs","href":"/api-reference/runs/get-run-test-case-logs"},{"title":"Get run test case screenshots","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/run-test-case/{shortId}/screenshots","href":"/api-reference/runs/get-run-test-case-screenshots"},{"title":"Get run test case trace","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/run-test-case/{shortId}/trace","href":"/api-reference/runs/get-run-test-case-trace"},{"title":"Get run","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/run/{shortId}","href":"/api-reference/runs/get-run"},{"title":"Rerun run","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/run/{shortId}","href":"/api-reference/runs/rerun-run"},{"title":"Get run issues","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/run/{shortId}/issues","href":"/api-reference/runs/get-run-issues"},{"title":"Export run test record","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/runs/{runShortId}/exports","href":"/api-reference/runs/export-run-test-record"},{"title":"Get run export","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/runs/{runShortId}/exports/{exportId}","href":"/api-reference/runs/get-run-export"}]},{"group":"Test Cases","pages":[{"title":"List test cases","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/test-cases","href":"/api-reference/test-cases/list-test-cases"},{"title":"Create test case","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/test-cases","href":"/api-reference/test-cases/create-test-case"},{"title":"Get test case","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/test-cases/{id}","href":"/api-reference/test-cases/get-test-case"},{"title":"Update test case","deprecated":null,"version":null,"openapi":"/api-reference/api.json patch /v1/test-cases/{id}","href":"/api-reference/test-cases/update-test-case"}]},{"group":"Todos","pages":[{"title":"List todos","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/todos","href":"/api-reference/todos/list-todos"},{"title":"Create todo","deprecated":null,"version":null,"openapi":"/api-reference/api.json post /v1/todos","href":"/api-reference/todos/create-todo"},{"title":"Get todo","deprecated":null,"version":null,"openapi":"/api-reference/api.json get /v1/todos/{shortId}","href":"/api-reference/todos/get-todo"},{"title":"Update todo","deprecated":null,"version":null,"openapi":"/api-reference/api.json patch /v1/todos/{shortId}","href":"/api-reference/todos/update-todo"}]}]},{"group":"CLI","pages":[{"title":"CLI Overview","icon":"terminal","href":"/cli/overview"},{"group":"Commands","expanded":true,"pages":[{"title":"qatech configure","icon":"gear","href":"/cli/commands/configure"},{"title":"qatech test-cases","icon":"list-check","href":"/cli/commands/test-cases"},{"title":"qatech applications","icon":"cube","href":"/cli/commands/applications"},{"title":"qatech environments","icon":"cubes","href":"/cli/commands/environments"},{"title":"qatech run","icon":"play","href":"/cli/commands/run"},{"title":"qatech status","icon":"circle-check","href":"/cli/commands/status"},{"title":"qatech chat","icon":"comment","href":"/cli/commands/chat"},{"title":"qatech tunnel","icon":"link","href":"/cli/commands/tunnel"},{"title":"qatech init","icon":"wand-magic-sparkles","href":"/cli/commands/init"}]}]}]}]},"basePath":"","title":"Start change review chat - QA.tech Docs","buildId":"dpl_2gSLkbMoF5kkLsBqYzq9KWtDyJRo","deploymentId":"dpl_2gSLkbMoF5kkLsBqYzq9KWtDyJRo","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-hfTk6MZX.js","utils-Bfp7HcY4.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-D8dSW7yV.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CFgQXcZO.js","snippetPresets-dMW1-pV3.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-DyrCOido.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-Bwwdcyh3.js","shallow-drVXTg79.js","getApiPlaygroundDisplay-GMPxUzWV.js","CodeSnippet-wTmV0wP6.js","CodeSnippets-D_QxCJEq.js","Page-BsZAA8xk.js","getPastedJson-Dev-X0Xy.js","icon-7L2WL0jD.js","MethodPill-Ble59Dl_.js","DuplicateIcon-r-98uLGh.js","createIcon-DaFzipjW.js","DynamicMarkdown-Jk8YAWGN.js","SectionHeading-nLgrCDOg.js","axios-vUo_bRtp.js","Markdown-_QGow1Wo.js","clsx-v8ssfMzu.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CjboTi0T.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-DkAyo-p5.js"]}