This page documents the error responses returned by the thig.ai API, including HTTP status codes, application-specific error codes, and troubleshooting tips.
The error field is always present. The code field is included when a specific application error code applies. Some endpoints may include additional fields such as details for validation errors.
Streaming endpoints (such as Chat and PRD generation) use Server-Sent Events (SSE) to deliver responses incrementally. When an error occurs during streaming, it is sent as an SSE event rather than an HTTP error status:
Validation errors caught before streaming begins are also delivered as SSE events with the code VALIDATION_ERROR:
data: {"type": "error", "message": "Project ID is required", "code": "VALIDATION_ERROR"}
Your client should listen for events where type is "error" and handle them appropriately — for example, by displaying the message to the user and closing the connection.
thig.ai uses a dual rate limiting system to protect the platform and ensure fair usage:
Tier-based limits — Based on your subscription plan (Free, Pro, Business, Enterprise). These govern monthly AI token usage, project counts, and other resource quotas. See Billing for plan details.
Endpoint-based limits — Anti-abuse limits applied per endpoint and per IP address. These prevent excessive request volumes regardless of plan tier.
When you exceed a rate limit, the API returns a 429 status with the RATE_LIMITED error code.
Check the Retry-After header in 429 responses. It indicates how many seconds to wait before retrying. Implement exponential backoff in your integration to handle rate limits gracefully.
“401 Unauthorized” on every request — Your session has likely expired. Log out and log back in, or generate a fresh API key from Settings > API Keys.
“403 Feature disabled” — The feature you are trying to use is not enabled for your current plan. Check your plan limits and upgrade if needed.
“429 Rate limited” — You are sending too many requests. Implement exponential backoff and respect the Retry-After header. Consider batching requests where possible.
“500 on AI endpoints” — The AI provider may be experiencing issues. Try switching to a different provider in your project settings or BYOK configuration.
“Empty response from AI” — The conversation or PRD content may be too short for the AI to analyze meaningfully. Add more context to your conversation before generating.
“Export fails” — Ensure the project has a generated PRD before attempting to export. If exporting to Notion or Google Docs, verify that the integration is connected.
“404 on a resource you just created” — The resource may belong to a different organization context. Verify you are authenticated as a member of the correct organization.
“409 Conflict on version creation” — A PRD version with that number already exists. The system auto-increments version numbers, but manual creation may cause conflicts. Use the next available version number.
“403 Approval required” — An approval workflow is configured for this action. Your request has been submitted for review. Wait for designated approvers to approve it.
“403 IP blocked” — Your IP is not in the organization’s allowlist. Contact your admin to add your IP or CIDR range.
“401 API key expired” — Your REST API key has passed its expiration date. Create a new key or extend the expiration from Settings > Developer.
{"docsConfig":{"$schema":"https://mintlify.com/docs.json","theme":"mint","name":"THIG","colors":{"primary":"#10B981","light":"#34D399","dark":"#047857"},"favicon":"/favicon.svg","logo":{"light":"https://mintcdn.com/thigai/CjqH8zZhZzCOnywk/logo/light.svg?fit=max\u0026auto=format\u0026n=CjqH8zZhZzCOnywk\u0026q=85\u0026s=0b30e9d9b88f0f3ddd3e305af5a976d2","dark":"https://mintcdn.com/thigai/CjqH8zZhZzCOnywk/logo/dark.svg?fit=max\u0026auto=format\u0026n=CjqH8zZhZzCOnywk\u0026q=85\u0026s=1f62e6571b0256a7accbdfdb5be7b4ef"},"api":{"openapi":["openapi.json"]},"background":{"decoration":null,"color":{"light":null,"dark":"#0b1120"}},"navbar":{"links":[{"label":"Website","href":"https://thig.ai"},{"label":"App","href":"https://app.thig.ai"}],"primary":{"type":"button","label":"Get Started","href":"https://app.thig.ai"}},"seo":{"metatags":{"og:site_name":"THIG Documentation","og:description":"Documentation for THIG — the AI-powered PRD generator"},"indexing":"navigable"},"footer":{"socials":{"website":"https://thig.ai"}},"fonts":{"heading":{"family":"Inter","weight":700},"body":{"family":"Inter","weight":400}},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"App","href":"https://app.thig.ai","icon":"rocket"},{"anchor":"Website","href":"https://thig.ai","icon":"globe"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"thigai","hasAudioNarration":false,"actualSubdomain":"thigai","customDomains":["docs.thig.ai"],"gitSource":{"type":"github","owner":"veeral710","repo":"thig-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{},"buildId":"6ae9496de5b11aa510b5f9d5:success","clientVersion":"0.0.4088","searchFilterCounts":[{"language":"default","tag":"Documentation","count":37},{"language":"default","tag":"API Reference","count":14},{"language":"default","tag":"Endpoints","count":12},{"language":"default","tag":"Administration","count":11},{"language":"default","tag":"Features","count":10},{"language":"default","tag":"Creating PRDs","count":7},{"language":"default","tag":"Get Started","count":5},{"language":"default","tag":"Overview","count":2},{"language":"default","tag":"Support","count":2},{"language":"default","tag":"Enterprise","count":2}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"error-reference","slug":"/error-reference","pageMetadata":{"title":"Error Reference","description":"HTTP status codes, error codes, and troubleshooting guide","href":"/error-reference"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"HTTP status codes, error codes, and troubleshooting guide\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`1`,id:`error-reference`,children:`Error Reference`}),`\n`,_jsx(_components.p,{children:`This page documents the error responses returned by the thig.ai API, including HTTP status codes, application-specific error codes, and troubleshooting tips.`}),`\n`,_jsx(Heading,{level:`2`,id:`error-response-format`,children:`Error Response Format`}),`\n`,_jsx(_components.p,{children:`All API errors return a JSON body with a human-readable message and an optional error code:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Human-readable error message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"ERROR_CODE\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`error`}),` field is always present. The `,_jsx(_components.code,{children:`code`}),` field is included when a specific application error code applies. Some endpoints may include additional fields such as `,_jsx(_components.code,{children:`details`}),` for validation errors.`]}),`\n`,_jsx(Heading,{level:`2`,id:`http-status-codes`,children:`HTTP Status Codes`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Code`}),_jsx(_components.th,{children:`Meaning`}),_jsx(_components.th,{children:`Common Cause`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.strong,{children:`200`})}),_jsx(_components.td,{children:`OK`}),_jsx(_components.td,{children:`Request succeeded`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.strong,{children:`201`})}),_jsx(_components.td,{children:`Created`}),_jsx(_components.td,{children:`Resource created successfully`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.strong,{children:`400`})}),_jsx(_components.td,{children:`Bad Request`}),_jsx(_components.td,{children:`Invalid input, missing required fields, or malformed JSON`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.strong,{children:`401`})}),_jsx(_components.td,{children:`Unauthorized`}),_jsx(_components.td,{children:`Missing or invalid session cookie / API key`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.strong,{children:`403`})}),_jsx(_components.td,{children:`Forbidden`}),_jsx(_components.td,{children:`Insufficient role permissions or feature not enabled for your plan`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.strong,{children:`404`})}),_jsx(_components.td,{children:`Not Found`}),_jsx(_components.td,{children:`Resource does not exist or belongs to a different organization`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.strong,{children:`409`})}),_jsx(_components.td,{children:`Conflict`}),_jsx(_components.td,{children:`Duplicate resource (e.g., a version with that number already exists)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.strong,{children:`422`})}),_jsx(_components.td,{children:`Unprocessable Entity`}),_jsx(_components.td,{children:`Request body failed schema validation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.strong,{children:`429`})}),_jsx(_components.td,{children:`Too Many Requests`}),_jsx(_components.td,{children:`Rate limit exceeded`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.strong,{children:`500`})}),_jsx(_components.td,{children:`Internal Server Error`}),_jsx(_components.td,{children:`Unexpected server-side error`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`error-codes`,children:`Error Codes`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Code`}),_jsx(_components.th,{children:`HTTP Status`}),_jsx(_components.th,{children:`Description`}),_jsx(_components.th,{children:`Resolution`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`UNAUTHORIZED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`401`}),_jsx(_components.td,{children:`Missing or invalid session or API key`}),_jsx(_components.td,{children:`Log in again or verify your API key is correct`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`FORBIDDEN`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Insufficient role permissions for this action`}),_jsx(_components.td,{children:`Contact your organization admin for elevated access`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`RATE_LIMITED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`429`}),_jsx(_components.td,{children:`Too many requests in a short period`}),_jsx(_components.td,{children:`Wait and retry with exponential backoff`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VALIDATION_ERROR`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`400`}),_jsx(_components.td,{children:`Request body failed schema validation`}),_jsxs(_components.td,{children:[`Check required fields, types, and formats against the `,_jsx(_components.a,{href:`/api-reference/introduction`,children:`API Reference`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`FEATURE_DISABLED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Feature flag not enabled for your plan`}),_jsxs(_components.td,{children:[`Upgrade your `,_jsx(_components.a,{href:`/user-guide/billing`,children:`plan`}),` or contact support`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GENERATION_ERROR`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`500`}),_jsx(_components.td,{children:`AI provider failed to generate content`}),_jsx(_components.td,{children:`Retry the request; if the error persists, try switching to a different AI provider`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`USAGE_LIMIT_EXCEEDED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Monthly usage quota reached for your plan`}),_jsx(_components.td,{children:`Upgrade your plan or wait for your usage to reset at the next billing cycle`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PROVIDER_ERROR`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`502`}),_jsx(_components.td,{children:`Upstream AI provider returned an error`}),_jsx(_components.td,{children:`Try a different AI provider or retry after a brief wait`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`NOT_FOUND`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`404`}),_jsx(_components.td,{children:`The requested resource does not exist`}),_jsx(_components.td,{children:`Verify the resource ID and that it belongs to your organization`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`DUPLICATE`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`409`}),_jsx(_components.td,{children:`A resource with that identifier already exists`}),_jsx(_components.td,{children:`Use a different name, key, or version number`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ACCOUNT_LOCKED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Account locked after too many failed login attempts`}),_jsx(_components.td,{children:`Wait 15 minutes for automatic unlock, or use password reset`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`MFA_REQUIRED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Two-factor authentication code required`}),_jsx(_components.td,{children:`Enter the 6-digit code from your authenticator app`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`IP_BLOCKED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Request IP not in organization’s allowlist`}),_jsxs(_components.td,{children:[`Contact your admin to add your IP to the `,_jsx(_components.a,{href:`/user-guide/security#ip-allowlisting`,children:`allowlist`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APPROVAL_REQUIRED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Action requires approval workflow completion`}),_jsx(_components.td,{children:`Wait for designated approvers to approve your request`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GRACE_PERIOD_EXPIRED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Subscription past due and grace period has expired`}),_jsx(_components.td,{children:`Update payment method to restore plan access`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`API_KEY_EXPIRED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`401`}),_jsx(_components.td,{children:`REST API key has passed its expiration date`}),_jsx(_components.td,{children:`Create a new API key or update the expiration on the existing one`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`API_KEY_INACTIVE`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`401`}),_jsx(_components.td,{children:`REST API key has been deactivated`}),_jsx(_components.td,{children:`Re-activate the key from Settings > Developer`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`sse-error-events`,children:`SSE Error Events`}),`\n`,_jsxs(_components.p,{children:[`Streaming endpoints (such as `,_jsx(_components.a,{href:`/api-reference/chat`,children:`Chat`}),` and PRD generation) use Server-Sent Events (SSE) to deliver responses incrementally. When an error occurs during streaming, it is sent as an SSE event rather than an HTTP error status:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`data: {\"type\": \"error\", \"message\": \"Generation failed\", \"code\": \"GENERATION_ERROR\"}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Validation errors caught before streaming begins are also delivered as SSE events with the code `,_jsx(_components.code,{children:`VALIDATION_ERROR`}),`:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`data: {\"type\": \"error\", \"message\": \"Project ID is required\", \"code\": \"VALIDATION_ERROR\"}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Your client should listen for events where `,_jsx(_components.code,{children:`type`}),` is `,_jsx(_components.code,{children:`\"error\"`}),` and handle them appropriately — for example, by displaying the message to the user and closing the connection.`]}),`\n`,_jsx(Heading,{level:`2`,id:`rate-limits`,children:`Rate Limits`}),`\n`,_jsx(_components.p,{children:`thig.ai uses a dual rate limiting system to protect the platform and ensure fair usage:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Tier-based limits`}),` — Based on your subscription plan (Free, Pro, Business, Enterprise). These govern monthly AI token usage, project counts, and other resource quotas. See `,_jsx(_components.a,{href:`/user-guide/billing`,children:`Billing`}),` for plan details.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Endpoint-based limits`}),` — Anti-abuse limits applied per endpoint and per IP address. These prevent excessive request volumes regardless of plan tier.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`When you exceed a rate limit, the API returns a `,_jsx(_components.code,{children:`429`}),` status with the `,_jsx(_components.code,{children:`RATE_LIMITED`}),` error code.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Check the `,_jsx(_components.code,{children:`Retry-After`}),` header in 429 responses. It indicates how many seconds to wait before retrying. Implement exponential backoff in your integration to handle rate limits gracefully.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting-tips`,children:`Troubleshooting Tips`}),`\n`,_jsx(_components.p,{children:`Common issues and how to resolve them:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`“401 Unauthorized” on every request`}),` — Your session has likely expired. Log out and log back in, or generate a fresh API key from `,_jsx(_components.strong,{children:`Settings > API Keys`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`“403 Feature disabled”`}),` — The feature you are trying to use is not enabled for your current plan. Check your `,_jsx(_components.a,{href:`/user-guide/billing`,children:`plan limits`}),` and upgrade if needed.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`“429 Rate limited”`}),` — You are sending too many requests. Implement exponential backoff and respect the `,_jsx(_components.code,{children:`Retry-After`}),` header. Consider batching requests where possible.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`“500 on AI endpoints”`}),` — The AI provider may be experiencing issues. Try switching to a different provider in your project settings or `,_jsx(_components.a,{href:`/user-guide/settings`,children:`BYOK configuration`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`“Empty response from AI”`}),` — The conversation or PRD content may be too short for the AI to analyze meaningfully. Add more context to your conversation before generating.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`“Export fails”`}),` — Ensure the project has a generated PRD before attempting to export. If exporting to Notion or Google Docs, verify that the `,_jsx(_components.a,{href:`/user-guide/settings#integrations`,children:`integration is connected`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`“404 on a resource you just created”`}),` — The resource may belong to a different organization context. Verify you are authenticated as a member of the correct organization.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`“409 Conflict on version creation”`}),` — A PRD version with that number already exists. The system auto-increments version numbers, but manual creation may cause conflicts. Use the next available version number.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`“403 Approval required”`}),` — An approval workflow is configured for this action. Your request has been submitted for review. Wait for designated approvers to approve it.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`“403 IP blocked”`}),` — Your IP is not in the organization’s allowlist. Contact your admin to add your IP or CIDR range.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`“401 API key expired”`}),` — Your REST API key has passed its expiration date. Create a new key or extend the expiration from `,_jsx(_components.strong,{children:`Settings > Developer`}),`.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Error Reference","description":"HTTP status codes, error codes, and troubleshooting guide","href":"/error-reference"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Error Reference","slug":"error-reference","depth":1,"children":[]},{"title":"Error Response Format","slug":"error-response-format","depth":2,"children":[]},{"title":"HTTP Status Codes","slug":"http-status-codes","depth":2,"children":[]},{"title":"Error Codes","slug":"error-codes","depth":2,"children":[]},{"title":"SSE Error Events","slug":"sse-error-events","depth":2,"children":[]},{"title":"Rate Limits","slug":"rate-limits","depth":2,"children":[]},{"title":"Troubleshooting Tips","slug":"troubleshooting-tips","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"thigai","siteName":"THIG","title":"Error Reference - THIG","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-04-01T12:34:16.407Z","originalFileLocation":"error-reference.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=\"HTTP status codes, error codes, and troubleshooting guide\">\u003cmeta data-mint-head name=\"application-name\" content=\"THIG\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/thigai/KfE5AHXzd8XI2FcU/_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/thigai/KfE5AHXzd8XI2FcU/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/thigai/KfE5AHXzd8XI2FcU/_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/thigai/KfE5AHXzd8XI2FcU/_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/thigai/KfE5AHXzd8XI2FcU/_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/thigai/KfE5AHXzd8XI2FcU/_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/thigai/KfE5AHXzd8XI2FcU/_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/thigai/KfE5AHXzd8XI2FcU/_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/thigai/KfE5AHXzd8XI2FcU/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Error Reference - THIG\">\u003cmeta data-mint-head property=\"og:description\" content=\"Documentation for THIG — the AI-powered PRD generator\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"THIG Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.thig.ai/error-reference\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://thigai.mintlify.site/_mintlify/api/og/v2?division=Support\u0026amp;title=Error+Reference\u0026amp;description=HTTP+status+codes%2C+error+codes%2C+and+troubleshooting+guide\u0026amp;theme=950b58472654795a680da9ef\u0026amp;signature=2e7bd9901fcb142b567a4f8eafc491ec99d262c706975405bdac3f290fc0db00\">\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=\"Error Reference - THIG\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Documentation for THIG — the AI-powered PRD generator\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://thigai.mintlify.site/_mintlify/api/og/v2?division=Support\u0026amp;title=Error+Reference\u0026amp;description=HTTP+status+codes%2C+error+codes%2C+and+troubleshooting+guide\u0026amp;theme=950b58472654795a680da9ef\u0026amp;signature=2e7bd9901fcb142b567a4f8eafc491ec99d262c706975405bdac3f290fc0db00\">\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/thigai/KfE5AHXzd8XI2FcU/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"THIG\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#10B981\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.thig.ai/error-reference\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/error-reference.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.thig.ai/#organization\",\"name\":\"THIG\",\"url\":\"https://docs.thig.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/thigai/CjqH8zZhZzCOnywk/logo/light.svg?fit=max\u0026auto=format\u0026n=CjqH8zZhZzCOnywk\u0026q=85\u0026s=0b30e9d9b88f0f3ddd3e305af5a976d2\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.thig.ai#website\",\"name\":\"THIG\",\"url\":\"https://docs.thig.ai\",\"publisher\":{\"@id\":\"https://docs.thig.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.thig.ai/error-reference#webpage\",\"url\":\"https://docs.thig.ai/error-reference\",\"name\":\"Error Reference\",\"description\":\"HTTP status codes, error codes, and troubleshooting guide\",\"dateModified\":\"2026-04-01T12:34:16.407Z\",\"isPartOf\":{\"@id\":\"https://docs.thig.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.thig.ai/error-reference#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.thig.ai/error-reference#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Support\",\"item\":\"https://docs.thig.ai/faq\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Error Reference\",\"item\":\"https://docs.thig.ai/error-reference\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.thig.ai/error-reference#article\",\"headline\":\"Error Reference\",\"name\":\"Error Reference\",\"description\":\"HTTP status codes, error codes, and troubleshooting guide\",\"url\":\"https://docs.thig.ai/error-reference\",\"mainEntityOfPage\":{\"@id\":\"https://docs.thig.ai/error-reference#webpage\"},\"dateModified\":\"2026-04-01T12:34:16.407Z\",\"publisher\":{\"@id\":\"https://docs.thig.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.thig.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"THIG\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"THIG","nav":{"global":{"anchors":[{"anchor":"App","href":"https://app.thig.ai","icon":"rocket"},{"anchor":"Website","href":"https://thig.ai","icon":"globe"}]},"tabs":[{"tab":"Documentation","groups":[{"group":"Get Started","pages":[{"title":"Introduction","href":"/introduction"},{"title":"Quickstart","href":"/quickstart"},{"title":"How It All Fits Together","href":"/user-guide/how-it-works"},{"title":"Organizing Work","href":"/user-guide/organizing-work"},{"title":"How AI Gets Smart","href":"/user-guide/how-ai-context-works"}]},{"group":"Creating PRDs","pages":[{"title":"Onboarding","href":"/user-guide/onboarding"},{"title":"Getting Started","href":"/user-guide/getting-started"},{"title":"Projects","href":"/user-guide/projects"},{"title":"AI Chat","href":"/user-guide/ai-chat"},{"title":"PRD Editor","href":"/user-guide/prd-editor"},{"title":"Templates","href":"/user-guide/templates"},{"title":"Template Marketplace","href":"/user-guide/marketplace"}]},{"group":"Features","pages":[{"title":"AI Tools","href":"/user-guide/ai-tools"},{"title":"AI Model Configuration","href":"/user-guide/ai-model-config"},{"title":"Exports","href":"/user-guide/exports"},{"title":"Collaboration","href":"/user-guide/collaboration"},{"title":"Stakeholder Reviews","href":"/user-guide/stakeholder-reviews"},{"title":"Integrations","href":"/user-guide/integrations"},{"title":"Webhooks","href":"/user-guide/webhooks"},{"title":"Developer Settings","href":"/user-guide/developer"},{"title":"Knowledge Base \u0026 AI Memory","href":"/user-guide/knowledge-base"},{"title":"Notifications","href":"/user-guide/notifications"}]},{"group":"Administration","pages":[{"title":"Team Management","href":"/user-guide/team-management"},{"title":"Team Workspaces","href":"/user-guide/workspaces"},{"title":"AI Profile \u0026 Preferences","href":"/user-guide/profile"},{"title":"Settings","href":"/user-guide/settings"},{"title":"Custom Domains","href":"/user-guide/custom-domains"},{"title":"Usage Analytics","href":"/user-guide/analytics"},{"title":"Usage Dashboard","href":"/user-guide/usage-dashboard"},{"title":"Feature Access Control","href":"/user-guide/feature-access"},{"title":"Team Announcements","href":"/user-guide/announcements"},{"title":"Billing","href":"/user-guide/billing"},{"title":"Keyboard Shortcuts","href":"/user-guide/keyboard-shortcuts"}]},{"group":"Enterprise","pages":[{"title":"Security","href":"/user-guide/security"},{"title":"Approval Workflows","href":"/user-guide/approval-workflows"}]},{"group":"Support","pages":[{"title":"FAQ","description":"Frequently asked questions about thig.ai","href":"/faq"},{"title":"Error Reference","href":"/error-reference"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/introduction"}]}]},"basePath":"","title":"Error Reference - THIG","buildId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","deploymentId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","dynamics":[],"chunks":[]}