<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Owen</title>
    <description>The latest articles on DEV Community by Owen (@owen_fox).</description>
    <link>https://dev.to/owen_fox</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3893304%2Fb8cec06b-7789-423e-a8d0-386db7f00620.png</url>
      <title>DEV Community: Owen</title>
      <link>https://dev.to/owen_fox</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/owen_fox"/>
    <language>en</language>
    <item>
      <title>Check your first coding-client connection before adding another</title>
      <dc:creator>Owen</dc:creator>
      <pubDate>Tue, 22 Sep 2026 01:43:25 +0000</pubDate>
      <link>https://dev.to/owen_fox/check-your-first-coding-client-connection-before-adding-another-4ij5</link>
      <guid>https://dev.to/owen_fox/check-your-first-coding-client-connection-before-adding-another-4ij5</guid>
      <description>&lt;p&gt;A coding assistant can answer successfully while still using an older provider configuration. When you connect several clients, verify one connection at a time so you can tell which settings produced each request.&lt;/p&gt;

&lt;p&gt;This is a documentation-based workflow from the Ofox team, using Ofox Desktop as the setup example. It is not a report of a live API test or a guarantee that every client and model combination works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prepare one small test
&lt;/h2&gt;

&lt;p&gt;Check the current installer requirements and the documentation for the client you actually use. Keep the CLI and desktop versions of a tool separate when their instructions differ. Note the existing provider settings and locate the configuration backup before applying changes.&lt;/p&gt;

&lt;p&gt;Start with an empty test folder. Connect your account in Desktop, select one installed client and a model suitable for it, then apply the configuration. Keep that model unchanged while checking the connection. Changing the client, model and provider together makes a failure harder to isolate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Match both sides of the request
&lt;/h2&gt;

&lt;p&gt;Open a fresh session in the coding client and ask for a short fixed response, such as OFOX_CONNECTION_CHECK, without reading files or using tools. This is a proposed test, not a captured result.&lt;/p&gt;

&lt;p&gt;Record the approximate time and selected model. In the same Ofox account's request history, find the corresponding entry and compare its time, model, status and client-specific key information where available. Check the recorded charge too; a desktop installation is not evidence of free model usage.&lt;/p&gt;

&lt;p&gt;A response without an identifiable matching record leaves the connection unverified. A record without a usable response leaves the test incomplete. Check the active client configuration, the dashboard account and the relevant error before submitting more requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the scope of success clear
&lt;/h2&gt;

&lt;p&gt;A short text response checks basic connectivity. It does not validate repository access, file edits, tool calling or a complete coding workflow. After the first check, use a small, non-sensitive coding task with an explicit acceptance condition. Review the resulting changes and run the checks relevant to that task.&lt;/p&gt;

&lt;p&gt;For each client, keep its version, selected model, test time, matching request and result in a separate record. Only then add the next client. When requesting help, share a redacted error and these identifiers rather than API keys, private prompts or repository content.&lt;/p&gt;

&lt;p&gt;The practical benefit of this sequence is a narrower investigation: you can distinguish setup, request routing and task execution instead of treating a successful login as proof that all three worked.&lt;/p&gt;

&lt;p&gt;AI assisted the preparation and review of this adaptation. The full Ofox Desktop setup guide provides the installation context and client-specific documentation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ofox.ai/blog/ofox-desktop-multi-tool-setup-guide/?utm_source=devto&amp;amp;utm_medium=organic_social&amp;amp;utm_campaign=desktop_20260922&amp;amp;utm_content=first_request" rel="noopener noreferrer"&gt;https://ofox.ai/blog/ofox-desktop-multi-tool-setup-guide/?utm_source=devto&amp;amp;utm_medium=organic_social&amp;amp;utm_campaign=desktop_20260922&amp;amp;utm_content=first_request&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Codex keeps testing but never finishes: what to change</title>
      <dc:creator>Owen</dc:creator>
      <pubDate>Thu, 17 Sep 2026 04:34:29 +0000</pubDate>
      <link>https://dev.to/owen_fox/codex-keeps-testing-but-never-finishes-what-to-change-4af4</link>
      <guid>https://dev.to/owen_fox/codex-keeps-testing-but-never-finishes-what-to-change-4af4</guid>
      <description>&lt;p&gt;&lt;strong&gt;If Codex keeps testing without finishing, interrupt the loop, inspect the latest diff and failure, then resume with a specific acceptance criterion.&lt;/strong&gt; Keep the tests that verify the requested change. Repeatedly running an unchanged command without new evidence is different from fixing a newly discovered defect.&lt;/p&gt;

&lt;p&gt;This is a workflow diagnosis, not a claim that one model or every Codex installation has a defect. A slow run can also be waiting on a process, network request, permission or an unusually large test suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find out what is actually repeating
&lt;/h2&gt;

&lt;p&gt;Before changing the model, look at the last command and its result. Did the test fail? Did the agent change relevant code before running it again? Is the process still producing output? Is the same environmental failure being mistaken for a code bug?&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Observation&lt;/th&gt;
&lt;th&gt;Next check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Same failing test and unchanged code&lt;/td&gt;
&lt;td&gt;Ask for the specific new hypothesis before another run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New failure after a real change&lt;/td&gt;
&lt;td&gt;Investigate the regression; another test run may be justified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No output from a running command&lt;/td&gt;
&lt;td&gt;Inspect process status and external dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent keeps widening the test plan&lt;/td&gt;
&lt;td&gt;Restate the requested deliverable and scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Task interrupted by a usage limit&lt;/td&gt;
&lt;td&gt;Check the actual limit window before diagnosing the code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Do not discard the working tree to escape a loop. Preserve a checkpoint and inspect changes first. The &lt;a href="https://ofox.ai/blog/codex-weekly-limit-drained-2026/" rel="noopener noreferrer"&gt;Codex reset guide&lt;/a&gt; covers account limits; a test loop and a weekly quota are separate problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the task a finish line
&lt;/h2&gt;

&lt;p&gt;An acceptance criterion should describe an observable result. "Make the app robust" invites an open-ended project. "Prevent an empty search from throwing, and verify the empty and nonempty paths" is something a reviewer can assess.&lt;/p&gt;

&lt;p&gt;Try this instruction, adapted to your repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fix the empty-search failure in the existing component.
Keep unrelated refactors outside this task.
Before editing, name the smallest relevant acceptance check.
After a meaningful change, run that check and the required project checks.
Repeat a check only after a change or a new failure explains why.
If the same failure persists without a new hypothesis, stop and report it.
Finish with the changed behavior, checks run and any remaining uncertainty.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an editorial example, not a measured guarantee of lower usage. Keep repository-required security and regression checks. The goal is to connect validation to a change, not to instruct the agent to skip all tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review the instructions the task inherits
&lt;/h2&gt;

&lt;p&gt;Look for overlapping instructions in the task, project guidance and skills. One instruction may require a bounded fix while another implicitly expands the assignment into a broad audit. Clarify which checks are required for the actual change and which are future work.&lt;/p&gt;

&lt;p&gt;If a command is blocked by an environment problem, report that separately from a failing acceptance test. Do not ask the agent to bypass permissions, disable protections or manufacture a passing result to finish sooner.&lt;/p&gt;

&lt;p&gt;For an interruption while receiving an answer, consult the &lt;a href="https://ofox.ai/blog/codex-stream-disconnected-before-completion/" rel="noopener noreferrer"&gt;stream disconnection guide&lt;/a&gt;. Replaying a whole task can duplicate work; inspect the checkpoint and existing files before restarting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compare cost per completed task
&lt;/h2&gt;

&lt;p&gt;A large token counter does not by itself tell you whether the task was expensive or productive. Cache reads, uncached input and output can have different API rates, and a ChatGPT subscription limit is not an API invoice. OpenAI's &lt;a href="https://learn.chatgpt.com/docs/pricing" rel="noopener noreferrer"&gt;Codex pricing guidance&lt;/a&gt; is the reference for plan usage; use your own account's displayed limits.&lt;/p&gt;

&lt;p&gt;For API work, the &lt;a href="https://developers.openai.com/api/docs/guides/prompt-caching" rel="noopener noreferrer"&gt;official caching guide&lt;/a&gt; explains why input categories must be separated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8287x1unpdl3h1cdr0uc.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8287x1unpdl3h1cdr0uc.webp" alt="Official OpenAI table distinguishing cache reads and writes across model generations" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenAI API documentation, captured September 16, 2026. This table explains API token categories; it is not a Codex subscription quota conversion table.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Record elapsed time, acceptance result, manual repair and any billed retries. If comparing models, begin from the same repository snapshot and give each the same task and permissions. Use the &lt;a href="https://ofox.ai/blog/gpt-6-astra-vs-gpt-5-6-sol-2026/" rel="noopener noreferrer"&gt;Astra versus Sol comparison&lt;/a&gt; for provider-specific cost distinctions. Do not infer which model wins from a single unusually good run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Should I tell Codex never to write tests?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Specify the required verification and stop conditions. Removing all tests can hide the very defect you asked the agent to fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will starting a new task reset my weekly allowance?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A new conversation is not a quota reset. Check the account's usage dashboard and preserve the current task's checkpoint before moving work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I switch models immediately?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First identify whether the blocker is a failing command, unclear scope or repeated reasoning without progress. A model comparison is useful only when the task and acceptance check stay comparable.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ofox.ai/blog/codex-keeps-testing-never-finishes/" rel="noopener noreferrer"&gt;ofox.ai/blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>apiguide</category>
      <category>troubleshooting</category>
      <category>codex</category>
    </item>
    <item>
      <title>Codex stream disconnected before completion: Diagnose the Cause</title>
      <dc:creator>Owen</dc:creator>
      <pubDate>Wed, 16 Sep 2026 11:40:27 +0000</pubDate>
      <link>https://dev.to/owen_fox/codex-stream-disconnected-before-completion-diagnose-the-cause-4l5d</link>
      <guid>https://dev.to/owen_fox/codex-stream-disconnected-before-completion-diagnose-the-cause-4l5d</guid>
      <description>&lt;p&gt;&lt;code&gt;stream disconnected before completion&lt;/code&gt; tells you that a Codex response did not finish as expected. It does not identify one universal cause. Read the rest of the error, check whether the transport was SSE or WebSocket, and distinguish an explicit quota or context error from a connection that closed before the completion event arrived.&lt;/p&gt;

&lt;p&gt;Before retrying, inspect any files the agent changed and any actions its tools performed. A disconnected response does not mean that earlier commands were rolled back. This guide is for Codex users and developers operating compatible Responses endpoints. It is based on official documentation and source inspection on September 14, 2026. We have not reproduced your specific incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classify the suffix, not just the headline
&lt;/h2&gt;

&lt;p&gt;The current Codex SSE parser distinguishes an unfinished stream from more specific recorded errors. Its generic closed-before-completed fallback is not evidence that the user's internet connection was necessarily responsible.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Observation&lt;/th&gt;
&lt;th&gt;What it establishes&lt;/th&gt;
&lt;th&gt;First investigation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Closed before &lt;code&gt;response.completed&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Normal completion was not observed&lt;/td&gt;
&lt;td&gt;Transport, server and intermediary logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;response.failed&lt;/code&gt; with a code&lt;/td&gt;
&lt;td&gt;Provider reported a specific failure&lt;/td&gt;
&lt;td&gt;The actual code and error message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;response.incomplete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;An explicit incomplete event arrived&lt;/td&gt;
&lt;td&gt;&lt;code&gt;incomplete_details.reason&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSE idle timeout&lt;/td&gt;
&lt;td&gt;No SSE event arrived within the configured idle window&lt;/td&gt;
&lt;td&gt;Upstream delays and intermediary timeouts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebSocket closed by server&lt;/td&gt;
&lt;td&gt;A WebSocket close was observed&lt;/td&gt;
&lt;td&gt;Route support and close details&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A readable partial answer is not proof that the response completed. In the streaming documentation, text events and response lifecycle events serve different purposes. &lt;code&gt;response.output_text.done&lt;/code&gt; ends a text portion; it should not be treated as a substitute for the overall response completion signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve work before repeating the task
&lt;/h2&gt;

&lt;p&gt;Review the current diff, terminal output and any external action that was started. A tool can finish while the final model response fails to reach the interface. For actions with side effects, check the destination or execution record before asking the agent to repeat them.&lt;/p&gt;

&lt;p&gt;Do not assume that an automatic retry gives exactly-once execution or that a failed-looking request is free. Those guarantees depend on the operation and provider. When continuing a coding task, describe what has already been verified and what remains uncertain so that the next attempt does not blindly rerun every step.&lt;/p&gt;

&lt;p&gt;For a controlled diagnostic, use a new session and a short read-only task. Keep the model and route unchanged at first. If that succeeds while the original session fails, history length, compaction or a tool sequence becomes worth inspecting. It does not by itself prove a particular client bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handle explicit errors on their own terms
&lt;/h2&gt;

&lt;p&gt;The official API error guide separates authentication, access, rate limits and server failures. Check the response body rather than treating every failed stream as a retryable network issue.&lt;/p&gt;

&lt;p&gt;A missing model or wrong route belongs in the model-not-found guide. A subscription allowance is different from API billing balance and from a rate limit measured over time. For account-window questions, see the Codex limit guide. Do not solve a named quota error by repeatedly increasing a network timeout.&lt;/p&gt;

&lt;p&gt;Likewise, &lt;code&gt;context_length_exceeded&lt;/code&gt; points to a different constraint from an idle connection. Reduce or manage the relevant context using supported client features and preserve important task state. A new empty conversation may diagnose the difference, but it is not a substitute for understanding which history the original request contained.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspect the actual network path
&lt;/h2&gt;

&lt;p&gt;Record the endpoint hostname, proxy configuration, client version and transport. SSE and WebSocket are separate paths; a proxy that handles ordinary HTTPS requests may still have different connection lifetime or WebSocket behavior. Compare logs from the client, gateway and upstream when you control them.&lt;/p&gt;

&lt;p&gt;Use an organization-approved standard network path as a comparison if one is available. Do not disable TLS verification or security controls to make a test pass. A certificate error deserves certificate-chain diagnosis, not an insecure bypass.&lt;/p&gt;

&lt;p&gt;Check whether failures happen after a consistent period without events, only on a particular route, or only during tool-heavy turns. Those patterns suggest what to test next. They are not sufficient evidence to blame the model provider, the proxy or the client without additional observations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understand idle timeout and retry settings
&lt;/h2&gt;

&lt;p&gt;The current Codex configuration reference distinguishes custom-provider &lt;code&gt;stream_idle_timeout_ms&lt;/code&gt;, &lt;code&gt;stream_max_retries&lt;/code&gt; and &lt;code&gt;request_max_retries&lt;/code&gt;. The documented defaults are 300,000 milliseconds, five stream retries and four request retries respectively. These defaults describe the documented settings as of the review date. The stream settings are documented for SSE; do not assume they control every WebSocket failure.&lt;/p&gt;

&lt;p&gt;An idle timeout measures inactivity in the relevant stream, not the maximum duration of the entire task. Raising it cannot prevent a server or intermediary from closing a connection for another reason. Change it only when the evidence points to that timeout and your upstream supports the longer wait.&lt;/p&gt;

&lt;p&gt;Use the existing config.toml guide to locate the effective configuration. A setting in an unused profile will not change the running session. Avoid copying an unverified switch that claims to disable WebSocket support across every Codex version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a useful incident record
&lt;/h2&gt;

&lt;p&gt;Keep the start and failure times, operating system, client version, transport, endpoint hostname, full error suffix and request or response ID. Add whether a fresh session succeeds, whether tools had already executed, and the shortest harmless task that reproduces the issue.&lt;/p&gt;

&lt;p&gt;Remove secrets, cookies, authentication files and private repository contents before sharing logs. Historical issues can provide comparison cases, but check their dates and status. For example, Codex issue 4302 is a closed historical report; it is not evidence that the same old defect remains unfixed today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does this error always mean my network failed?
&lt;/h3&gt;

&lt;p&gt;No. The prefix covers an unfinished response path. The full suffix, lifecycle event and provider error are needed to separate connection failures from explicit request failures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I safely ask Codex to repeat everything?
&lt;/h3&gt;

&lt;p&gt;Check what already happened first. File changes and external tool actions may have completed before the stream failed, and repeating them can duplicate work or side effects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I keep increasing the timeout?
&lt;/h3&gt;

&lt;p&gt;Only if the relevant idle timeout is the observed cause. A larger client timeout does not repair invalid credentials, unavailable models, exhausted allowances or upstream connection policies.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does stream disconnected before completion mean?
&lt;/h3&gt;

&lt;p&gt;A Codex response failed to finish as expected. The full error distinguishes an explicit failure from a connection that closed early.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is response.output_text.done enough to confirm completion?
&lt;/h3&gt;

&lt;p&gt;No. It ends a text portion, not necessarily the complete response lifecycle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does a failed stream undo executed tools?
&lt;/h3&gt;

&lt;p&gt;No rollback should be assumed. Inspect the operation state before retrying.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ofox.ai/blog/codex-stream-disconnected-before-completion/" rel="noopener noreferrer"&gt;ofox.ai/blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>troubleshooting</category>
      <category>developertools</category>
      <category>codex</category>
    </item>
    <item>
      <title>Claude 400: Fix tool_use Without a Matching tool_result</title>
      <dc:creator>Owen</dc:creator>
      <pubDate>Tue, 15 Sep 2026 04:33:49 +0000</pubDate>
      <link>https://dev.to/owen_fox/claude-400-fix-tooluse-without-a-matching-toolresult-431o</link>
      <guid>https://dev.to/owen_fox/claude-400-fix-tooluse-without-a-matching-toolresult-431o</guid>
      <description>&lt;p&gt;A Claude error stating that &lt;code&gt;tool_use&lt;/code&gt; has no matching &lt;code&gt;tool_result&lt;/code&gt; typically indicates a structural conversation problem rather than a prompt issue. In the native Messages API, the assistant calls a client tool and the following user message should return the result with the matching ID. Verify this relationship before retrying.&lt;/p&gt;

&lt;p&gt;This guide addresses this specific error category in custom integrations and clients such as OpenCode. Not every OpenCode HTTP 400 error stems from this cause. The guidelines follow Claude's &lt;a href="https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls" rel="noopener noreferrer"&gt;tool-call handling documentation&lt;/a&gt;, verified September 14, 2026. Examples presented are synthetic message fragments, not traces from live API testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find the unmatched ID first
&lt;/h2&gt;

&lt;p&gt;Locate the referenced tool-use ID in the previous assistant message by reading the complete error message. Then inspect the following user message. Its &lt;code&gt;tool_result.tool_use_id&lt;/code&gt; must reference that exact ID; the tool name cannot substitute for the identifier.&lt;/p&gt;

&lt;p&gt;In the native Claude protocol, a tool result is a content block within a user message. There is no native &lt;code&gt;role: "tool"&lt;/code&gt; in this message structure. If your adapter supports another provider's format, translate roles and fields rather than forwarding them unchanged.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Valid relationship&lt;/th&gt;
&lt;th&gt;Common failure&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Identifier&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;tool_use.id&lt;/code&gt; equals &lt;code&gt;tool_result.tool_use_id&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;New or truncated ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message order&lt;/td&gt;
&lt;td&gt;Assistant call followed by user results&lt;/td&gt;
&lt;td&gt;Another message inserted between them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple calls&lt;/td&gt;
&lt;td&gt;Every client call gets its result&lt;/td&gt;
&lt;td&gt;Only the first result is retained&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User content order&lt;/td&gt;
&lt;td&gt;Tool-result blocks before ordinary text&lt;/td&gt;
&lt;td&gt;A text block precedes the results&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  A minimal valid message fragment
&lt;/h2&gt;

&lt;p&gt;This JSON shows only the relevant messages. A full request also requires the selected model, tool definition, token limit and remaining conversation. The demonstration result is invented for the example and must not replace executing a real tool.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tool_use"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"toolu_demo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lookup"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"demo"&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tool_result"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"tool_use_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"toolu_demo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"demo result"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not recreate the assistant message from text displayed in a chat window. Save the complete structured content returned by the API. Other blocks may need to remain in the conversation, including thinking data when the model and workflow require it. Signature validation is a separate issue covered in the &lt;a href="https://ofox.ai/blog/claude-invalid-signature-thinking-block/" rel="noopener noreferrer"&gt;Claude thinking-signature guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parallel calls must return a complete set of results
&lt;/h2&gt;

&lt;p&gt;When one assistant message requests two client tools, collect both results and include them in the immediately following user message. Do not send one result, insert another assistant turn, then attempt to return the second result to the original call. Place any permitted explanatory user text after the result blocks.&lt;/p&gt;

&lt;p&gt;The official &lt;a href="https://platform.claude.com/docs/en/agents-and-tools/tool-use/troubleshooting-tool-use" rel="noopener noreferrer"&gt;troubleshooting guide&lt;/a&gt; describes mixed server-tool workflows. If the same round has an unfinished server tool, the user message should contain only the client tool results, and the request should preserve the tools array. Do not generalize a minimal client-only example to every server-tool workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handle real tool failures without inventing success
&lt;/h2&gt;

&lt;p&gt;A failed lookup or command can still have a correctly paired tool result. Return the same ID with &lt;code&gt;is_error: true&lt;/code&gt; and an accurate error description when documented in the client-tool pattern. The protocol relationship and the underlying operation's success are separate checks.&lt;/p&gt;

&lt;p&gt;If the client was interrupted, first determine whether the tool actually executed. A timeout in the interface does not prove that a file write, deployment or external request failed. Inspect the operation's state before repeating anything with side effects. Do not manufacture a successful result to satisfy validation, and do not automatically execute a consequential tool twice.&lt;/p&gt;

&lt;p&gt;For development, reproduce the sequence with a harmless lookup in a disposable session. A read-only example reveals the pairing failure without risking another write or transaction. Capture the client version and the message immediately before and after the interruption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recover a damaged session carefully
&lt;/h2&gt;

&lt;p&gt;Preserve a local copy of the relevant history before attempting repairs. If the original result is available, restore the correctly paired message using the client's supported recovery mechanism. If the history cannot be repaired safely, create a new session with a concise summary of verified work and pending actions, while retaining the old session for reference.&lt;/p&gt;

&lt;p&gt;Deleting arbitrary tool blocks can change what the model believes happened. Deleting all conversation files is therefore not a default fix. When filing an issue, provide a small redacted sequence with roles, content types and matching IDs. Remove API keys, private tool arguments and sensitive results.&lt;/p&gt;

&lt;p&gt;A client upgrade may be worth checking against its release notes, but this article does not identify one version that fixes every case. Historical issues establish that a failure occurred in a particular configuration; they do not prove the same bug remains in the latest release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why retrying alone does not solve it
&lt;/h2&gt;

&lt;p&gt;The API validates the conversation structure before continuing the model turn. Sending the same unmatched sequence again leaves the structural problem unchanged. This conclusion follows from protocol rules, not a measured claim about every client's retry implementation.&lt;/p&gt;

&lt;p&gt;An HTTP 429 or overloaded service calls for different investigation. Check the actual status and error body before applying this guide. For other access errors, use the &lt;a href="https://ofox.ai/blog/openai-api-model-not-found-errors-troubleshooting/" rel="noopener noreferrer"&gt;model-not-found diagnostic&lt;/a&gt;; it addresses a different protocol and should not be confused with Claude tool-message pairing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can a tool return an error and still satisfy the pairing requirement?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. A truthful error result can match the original tool-use ID. Successful execution is not required to represent the failure correctly in the next message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I use role tool with the native Claude API?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Native client tool results are user-message content blocks. An OpenAI-compatible adapter may expose another shape, so follow the protocol of the endpoint actually receiving the request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is starting a new session a complete fix?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It can isolate damaged history, but it does not repair an adapter that keeps dropping results. Check the serializer or client path that created the broken sequence before relying on the new session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does retrying the same tool_result error fail?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The same unmatched message sequence remains invalid; repair the pairing and order first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where does a native Claude tool result go?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a user content block with tool_use_id matching the preceding assistant tool_use ID.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I return a tool execution error?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Return a truthful error result for the original ID rather than inventing successful output.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ofox.ai/blog/claude-tool-use-missing-tool-result-400/" rel="noopener noreferrer"&gt;ofox.ai/blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>troubleshooting</category>
      <category>developertools</category>
      <category>claude</category>
    </item>
    <item>
      <title>Claude Invalid Signature in Thinking Block: What to Check</title>
      <dc:creator>Owen</dc:creator>
      <pubDate>Tue, 15 Sep 2026 02:43:41 +0000</pubDate>
      <link>https://dev.to/owen_fox/claude-invalid-signature-in-thinking-block-what-to-check-3n9b</link>
      <guid>https://dev.to/owen_fox/claude-invalid-signature-in-thinking-block-what-to-check-3n9b</guid>
      <description>&lt;p&gt;When Claude reports an invalid signature in a thinking block, inspect the structured conversation you sent back. Preserve the original thinking block and its signature rather than reconstructing it from displayed text. If the error explicitly mentions a different conversation, also inspect changes to the preceding system prompt, tools and messages.&lt;/p&gt;

&lt;p&gt;These are different failure modes. A signature string can be present and unchanged while a conversation-bound block is no longer valid for an edited prefix. This guide follows the current thinking troubleshooting documentation, checked September 14, 2026. It is a protocol diagnostic, not a claim that all models enforce identical binding rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the error before changing the history
&lt;/h2&gt;

&lt;p&gt;Keep the full error type and message, request ID, model identifier and client version. Determine whether the first request failed or whether the failure began only after a tool call, a session restore or a history edit. That boundary helps locate the code path that lost or changed state.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;First inspection&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Failure after a tool result&lt;/td&gt;
&lt;td&gt;Whether complete assistant content was preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure after streaming&lt;/td&gt;
&lt;td&gt;Whether signature deltas were collected before block completion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure after a summary or edited prompt&lt;/td&gt;
&lt;td&gt;Whether the error identifies conversation binding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure only through an adapter&lt;/td&gt;
&lt;td&gt;The serialized request at each protocol boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Do not paste private conversation histories or opaque signatures into a public issue. A redacted description of block types and the transformation is usually a better starting point. Retain an unmodified local diagnostic copy if needed to compare your own request paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve the complete assistant content
&lt;/h2&gt;

&lt;p&gt;A native &lt;code&gt;thinking&lt;/code&gt; block contains a &lt;code&gt;thinking&lt;/code&gt; value and an opaque &lt;code&gt;signature&lt;/code&gt;. A &lt;code&gt;redacted_thinking&lt;/code&gt; block uses &lt;code&gt;data&lt;/code&gt; and must not be treated as ordinary visible prose. Empty visible thinking text alone does not establish that the block is corrupt.&lt;/p&gt;

&lt;p&gt;The official thinking tool-workflow guide explains how these blocks participate in continued tool turns. Preserve their original values and order together with the rest of the assistant response. Do not summarize a thinking block, replace the signature, or rebuild the message from the UI's text-only transcript.&lt;/p&gt;

&lt;p&gt;The following Python fragment illustrates preservation after a response has already been obtained. It is not a complete request or a live API test. Adapt the serialization step to your installed SDK, keeping the full returned content instead of just text fields.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;assistant_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exclude_none&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;assistant_content&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="c1"&gt;# Append the real tool_result message next, following the native tool protocol.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not insert a made-up signature into sample requests. A string that looks plausible is not evidence of a valid provider-issued block. If the original content is lost, diagnose why it was lost instead of attempting to manufacture the missing state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Streaming requires more than text deltas
&lt;/h2&gt;

&lt;p&gt;A streaming integration must assemble the supported content-block events. The Messages API reference documents &lt;code&gt;signature_delta&lt;/code&gt;, which arrives before the corresponding &lt;code&gt;content_block_stop&lt;/code&gt;. A collector that saves only &lt;code&gt;text_delta&lt;/code&gt; or visible thinking text will not preserve the same structured response as a full SDK response object.&lt;/p&gt;

&lt;p&gt;Check whether an early disconnect, cancellation or UI redraw caused the client to mark a partially assembled block as complete. Keep the block index and event order when debugging. Do not forward an unfinished block merely because the screen contains a readable partial answer.&lt;/p&gt;

&lt;p&gt;Using the official SDK's supported stream handling can reduce custom assembly work, but it does not protect history that your own application subsequently flattens or filters. Compare the in-memory response with the next serialized request. The transformation between those two objects is often the most useful place to inspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conversation binding is a separate check
&lt;/h2&gt;

&lt;p&gt;The current documentation describes conversation-bound signatures for Claude Fable 5.1, enforced for accounts created on or after August 31, 2026, and requests that set the documented binding control. This is a model-specific rule. For an error that specifically identifies a different conversation, changes before the thinking block can matter even when the block itself is untouched. Examples include changing the system instructions, changing tools, or rewriting earlier messages.&lt;/p&gt;

&lt;p&gt;Use append-only history when following that workflow, or the documented server-side compaction and context-editing mechanisms. Do not apply a blanket local history rewrite and assume that preserved signatures will make it valid. Model-specific recovery controls also exist in the official documentation, but they are not generic settings to paste into every Claude request.&lt;/p&gt;

&lt;p&gt;This article deliberately does not recommend enabling a special recovery beta as the first step. First verify that the selected model and exact error match its documented scope. A recovery option that drops a block can alter retained state, so it should be evaluated as a deliberate application choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not assume every cross-model change is invalid
&lt;/h2&gt;

&lt;p&gt;The current troubleshooting page explains that blocks unreadable by another model may be dropped rather than necessarily causing the conversation-binding error. Therefore, "switching models always breaks thinking signatures" is too broad. The same caution applies to claims that all cross-provider routes are inherently incompatible.&lt;/p&gt;

&lt;p&gt;Record the source model, target route and exact error, then consult the relevant compatibility documentation. If your client converts between native Claude messages and another API format, verify that it preserves the required metadata instead of guessing a universal field mapping.&lt;/p&gt;

&lt;p&gt;Tool-result pairing is another independent validation layer. If the message names an unmatched tool ID, follow the missing tool_result guide rather than changing signatures. Gemini has its own thought-signature fields; they are not interchangeable with Claude's native &lt;code&gt;signature&lt;/code&gt; field.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I fix the signature by editing its value?
&lt;/h3&gt;

&lt;p&gt;No. Treat it as opaque provider-issued state. Restore the original complete block if available, and investigate any transformation that changed or discarded it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does the second request fail when the first worked?
&lt;/h3&gt;

&lt;p&gt;The continuation may have lost structured thinking data or altered a conversation-bound prefix. Compare the full first response with the actual follow-up request instead of only the visible transcript.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does a new session prove the bug is fixed?
&lt;/h3&gt;

&lt;p&gt;No. A new session can isolate damaged history, but an adapter that strips required fields may break again on the next tool round. Verify the preservation path before closing the issue.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I edit a Claude thinking signature?
&lt;/h3&gt;

&lt;p&gt;No. Preserve the original block and opaque signature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can an unchanged block fail after editing history?
&lt;/h3&gt;

&lt;p&gt;For documented conversation-bound signatures, a changed prefix can cause a binding error.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are Claude and Gemini signature fields interchangeable?
&lt;/h3&gt;

&lt;p&gt;No. Each protocol has its own field placement and continuation rules.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ofox.ai/blog/claude-invalid-signature-thinking-block/" rel="noopener noreferrer"&gt;ofox.ai/blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>troubleshooting</category>
      <category>developertools</category>
      <category>claude</category>
    </item>
    <item>
      <title>Connect Codex to DeepSeek V4.1 Flash: setup and checks</title>
      <dc:creator>Owen</dc:creator>
      <pubDate>Mon, 14 Sep 2026 04:32:00 +0000</pubDate>
      <link>https://dev.to/owen_fox/connect-codex-to-deepseek-v41-flash-setup-and-checks-3i58</link>
      <guid>https://dev.to/owen_fox/connect-codex-to-deepseek-v41-flash-setup-and-checks-3i58</guid>
      <description>&lt;p&gt;&lt;strong&gt;To use DeepSeek V4.1 Flash in Codex, select &lt;code&gt;deepseek-flash&lt;/code&gt;, configure DeepSeek as a Responses API provider and install its complete model catalog.&lt;/strong&gt; DeepSeek publishes both a setup script and a manual configuration in its &lt;a href="https://api-docs.deepseek.com/quick_start/agent_integrations/codex/" rel="noopener noreferrer"&gt;official Codex integration guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Checked September 10, 2026. This tutorial describes the direct DeepSeek service; we have not executed paid inference or confirmed a successful Codex coding session. See the &lt;a href="https://ofox.ai/blog/deepseek-v4-1-flash-preview/" rel="noopener noreferrer"&gt;release overview&lt;/a&gt; for the model announcement and the &lt;a href="https://ofox.ai/blog/deepseek-v4-1-flash-api-setup/" rel="noopener noreferrer"&gt;API setup guide&lt;/a&gt; for direct API requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use the official setup with an existing Codex installation
&lt;/h2&gt;

&lt;p&gt;Start with Codex installed and launched at least once. DeepSeek's script expects the &lt;code&gt;~/.codex&lt;/code&gt; directory to exist. Check your installed version with &lt;code&gt;codex --version&lt;/code&gt;; the current official catalog declares &lt;code&gt;0.144.0&lt;/code&gt; as its minimum client version, not as a requirement to install that exact release.&lt;/p&gt;

&lt;p&gt;On macOS or Linux, download the official script so you can inspect it before running it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://cdn.deepseek.com/api-docs/codex-deepseek-setup-en.sh &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; /tmp/codex-deepseek-setup-en.sh
less /tmp/codex-deepseek-setup-en.sh
bash /tmp/codex-deepseek-setup-en.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Choose menu option &lt;strong&gt;1&lt;/strong&gt; for &lt;code&gt;deepseek-flash&lt;/code&gt; and supply a key from the &lt;a href="https://platform.deepseek.com/" rel="noopener noreferrer"&gt;DeepSeek Platform&lt;/a&gt;. The documented script backs up &lt;code&gt;config.toml&lt;/code&gt; under &lt;code&gt;~/.codex/backup-deepseek/&lt;/code&gt;, writes the model catalog and adjusts the necessary provider settings. Review its reported changes before starting work. The official guide also provides a PowerShell script for Windows.&lt;/p&gt;

&lt;p&gt;If you installed the earlier DeepSeek configuration, rerunning the current script updates its old Flash entries. Option 2 selects V4 Pro, which has a &lt;a href="https://ofox.ai/blog/deepseek-v4-pro-to-v4-1-flash-migration/" rel="noopener noreferrer"&gt;scheduled September 14 migration&lt;/a&gt;; choose Flash explicitly for a new V4.1 setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manual setup needs the complete catalog
&lt;/h2&gt;

&lt;p&gt;The catalog is more than a list of model names. It declares context, reasoning levels, input modalities and tool behavior. Open the manual section of the &lt;a href="https://api-docs.deepseek.com/quick_start/agent_integrations/codex/" rel="noopener noreferrer"&gt;official guide&lt;/a&gt; and copy its &lt;strong&gt;full &lt;code&gt;models.json&lt;/code&gt; content&lt;/strong&gt; into &lt;code&gt;~/.codex/models.json&lt;/code&gt;. Do not replace it with a small invented JSON snippet.&lt;/p&gt;

&lt;p&gt;Then merge the guide's provider configuration into &lt;code&gt;~/.codex/config.toml&lt;/code&gt;, preserving your unrelated settings. These are the important values to verify; this table is not a replacement configuration file:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Documented value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;deepseek-flash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model_provider&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;deepseek&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model_catalog_json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.codex/models.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model_reasoning_effort&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;high&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provider &lt;code&gt;base_url&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://api.deepseek.com/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provider &lt;code&gt;wire_api&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;responses&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The full example also sets API authentication, disables built-in web search and places the key in &lt;code&gt;experimental_bearer_token&lt;/code&gt;. Treat that configuration and its backups as credentials; omit them from shared repository commits. A Chat Completions endpoint or a models-only JSON file does not reproduce this documented setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify the selected model and a real task
&lt;/h2&gt;

&lt;p&gt;Run &lt;code&gt;codex&lt;/code&gt; from a small test project. DeepSeek's guide identifies &lt;code&gt;model: deepseek-flash&lt;/code&gt; in the CLI startup banner as the configuration check. Inspect any configuration error before sending a task; JSON syntax, catalog location and provider selection are separate failure points.&lt;/p&gt;

&lt;p&gt;Then use a bounded coding task with a known outcome: ask for an explanation of one file, followed by a small change and its relevant test. Review the diff and test result. If image input matters, include a representative screenshot. Successful model selection alone does not establish tool or image compatibility in your environment.&lt;/p&gt;

&lt;p&gt;Budget that test using the &lt;a href="https://ofox.ai/blog/deepseek-v4-1-flash-api-setup/#pricing" rel="noopener noreferrer"&gt;current Flash pricing&lt;/a&gt;. For the Anthropic-protocol route, use the separate &lt;a href="https://ofox.ai/blog/deepseek-v4-1-flash-claude-code-setup/" rel="noopener noreferrer"&gt;Claude Code tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Considering Ofox? First check the &lt;a href="https://ofox.io/models" rel="noopener noreferrer"&gt;model catalog&lt;/a&gt;, exact model ID and Responses support. This direct-provider configuration does not establish an Ofox route, price or availability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Which API protocol does Codex use with DeepSeek V4.1 Flash?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DeepSeek's Codex integration uses the Responses API with wire_api set to responses. The official provider base URL is &lt;a href="https://api.deepseek.com/" rel="noopener noreferrer"&gt;https://api.deepseek.com/&lt;/a&gt; and the model ID is deepseek-flash.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is changing the Codex model name enough?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. DeepSeek's documented setup also configures the provider and authentication and installs a complete models.json catalog. Use the official script or the full manual configuration rather than an abbreviated catalog.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this guide confirm a successful paid Codex session?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. It checks the documented configuration as of September 10, 2026. You still need to validate authentication, model selection and a representative coding task in your own environment.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ofox.ai/blog/deepseek-v4-1-flash-codex-setup/" rel="noopener noreferrer"&gt;ofox.ai/blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>deepseek</category>
      <category>codex</category>
      <category>api</category>
    </item>
    <item>
      <title>Use DeepSeek V4.1 Flash in Claude Code: setup guide</title>
      <dc:creator>Owen</dc:creator>
      <pubDate>Sun, 13 Sep 2026 11:34:07 +0000</pubDate>
      <link>https://dev.to/owen_fox/use-deepseek-v41-flash-in-claude-code-setup-guide-2f33</link>
      <guid>https://dev.to/owen_fox/use-deepseek-v41-flash-in-claude-code-setup-guide-2f33</guid>
      <description>&lt;p&gt;&lt;strong&gt;Claude Code can connect to DeepSeek V4.1 Flash through &lt;code&gt;https://api.deepseek.com/anthropic&lt;/code&gt;. DeepSeek’s documented setup uses &lt;code&gt;deepseek-flash[1m]&lt;/code&gt; for the main, Opus and Sonnet selections, and &lt;code&gt;deepseek-flash&lt;/code&gt; for Haiku and subagents.&lt;/strong&gt; Those distinctions appear in the &lt;a href="https://api-docs.deepseek.com/quick_start/agent_integrations/claude_code/" rel="noopener noreferrer"&gt;official Claude Code integration guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This guide was checked on September 10, 2026, against the direct DeepSeek documentation. We have not run paid inference or verified a successful Claude Code task. The &lt;a href="https://ofox.ai/blog/deepseek-v4-1-flash-preview/" rel="noopener noreferrer"&gt;release overview&lt;/a&gt; and &lt;a href="https://ofox.ai/blog/deepseek-v4-1-flash-api-setup/" rel="noopener noreferrer"&gt;API setup guide&lt;/a&gt; explain the model and its direct API access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure an existing Claude Code installation
&lt;/h2&gt;

&lt;p&gt;First check that &lt;code&gt;claude --version&lt;/code&gt; works. If Claude Code is absent, install it using the current Claude Code installation instructions before applying provider settings. Obtain a DeepSeek API key from the &lt;a href="https://platform.deepseek.com/" rel="noopener noreferrer"&gt;DeepSeek Platform&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For macOS or Linux, use these settings in the terminal from which you will launch Claude Code. Replace the token placeholder locally. Quoting the model names keeps the &lt;code&gt;[1m]&lt;/code&gt; suffix from being interpreted as a shell filename pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://api.deepseek.com/anthropic"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"REPLACE_WITH_DEEPSEEK_API_KEY"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek-flash[1m]"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_DEFAULT_OPUS_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek-flash[1m]"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek-flash[1m]"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_DEFAULT_HAIKU_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek-flash"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CLAUDE_CODE_SUBAGENT_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek-flash"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CLAUDE_CODE_EFFORT_LEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"max"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CLAUDE_CODE_AUTO_COMPACT_WINDOW&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"786432"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are the values in DeepSeek’s published integration, including the effort and compaction settings. The &lt;code&gt;[1m]&lt;/code&gt; form is a client integration setting; the direct API model name remains &lt;code&gt;deepseek-flash&lt;/code&gt;. Do not append the suffix to every API request by assumption.&lt;/p&gt;

&lt;p&gt;Windows users can use the equivalent &lt;code&gt;$env:NAME="value"&lt;/code&gt; assignments listed in the official guide. Keep credentials out of project files and shared terminal transcripts. Start with session-level settings so your existing provider setup remains easy to restore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check every model selection, not just the main one
&lt;/h2&gt;

&lt;p&gt;The Opus, Sonnet, Haiku and subagent variables matter because a workflow can select more than its main model. Keeping an old default can leave some requests on a different route.&lt;/p&gt;

&lt;p&gt;DeepSeek also documents automatic mappings for incoming Claude model names: &lt;code&gt;claude-opus&lt;/code&gt; names map to V4 Pro, while &lt;code&gt;claude-haiku&lt;/code&gt; and &lt;code&gt;claude-sonnet&lt;/code&gt; names map to Flash. Its guide says the Opus mapping retains Pro billing until &lt;strong&gt;September 14, 2026, at 12:00 Beijing time (UTC+8)&lt;/strong&gt;. After that, Pro requests move to Flash and Flash billing. See the &lt;a href="https://ofox.ai/blog/deepseek-v4-pro-to-v4-1-flash-migration/" rel="noopener noreferrer"&gt;Pro migration guide&lt;/a&gt; for the scheduled change.&lt;/p&gt;

&lt;p&gt;That is why the explicit Flash settings above are preferable when your goal is to evaluate V4.1 Flash now. A familiar Claude label does not prove which DeepSeek model or rate served the request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validate a small workflow and its cost
&lt;/h2&gt;

&lt;p&gt;Enter a test project and run &lt;code&gt;claude&lt;/code&gt; from the configured terminal. Ask it to explain one file before requesting a bounded edit. Check the resulting diff, tool behavior and test outcome; if your normal workflow delegates work, verify that path too.&lt;/p&gt;

&lt;p&gt;Inspect the provider’s usage and billing records for the task. Our example is a setup procedure, not evidence of tested speed, savings or equivalent coding quality. The &lt;a href="https://ofox.ai/blog/deepseek-v4-1-flash-api-setup/#pricing" rel="noopener noreferrer"&gt;Flash pricing guide&lt;/a&gt; separates input cache hits, misses, output and peak/off-peak pricing.&lt;/p&gt;

&lt;p&gt;If authentication fails, check the key and endpoint together. A request-format problem needs the response’s error details; repeatedly changing model names will not repair an incorrect protocol. Codex uses a different setup through the &lt;a href="https://ofox.ai/blog/deepseek-v4-1-flash-codex-setup/" rel="noopener noreferrer"&gt;Responses API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For a gateway such as Ofox, verify its actual model ID, Anthropic support and account price before replacing these direct-provider settings. The &lt;a href="https://ofox.ai/models" rel="noopener noreferrer"&gt;Ofox catalog&lt;/a&gt; is a place to begin that check; this article does not confirm that V4.1 Flash is available through Ofox or that signing up enables it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What model name should I set in Claude Code for DeepSeek V4.1 Flash?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DeepSeek's official integration sets ANTHROPIC_MODEL, ANTHROPIC_DEFAULT_OPUS_MODEL and ANTHROPIC_DEFAULT_SONNET_MODEL to deepseek-flash[1m]. It uses deepseek-flash without the suffix for Haiku and subagents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which base URL does the direct DeepSeek integration use?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Set ANTHROPIC_BASE_URL to &lt;a href="https://api.deepseek.com/anthropic" rel="noopener noreferrer"&gt;https://api.deepseek.com/anthropic&lt;/a&gt; and authenticate with a DeepSeek API key in ANTHROPIC_AUTH_TOKEN. Do not substitute the Codex Responses configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does selecting a Claude Opus alias guarantee Flash billing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. DeepSeek documents claude-opus names as mapping to V4 Pro, with Pro billing until September 14, 2026, at 12:00 Beijing time. Use the explicit Flash settings and check provider usage records.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ofox.ai/blog/deepseek-v4-1-flash-claude-code-setup/" rel="noopener noreferrer"&gt;ofox.ai/blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>deepseek</category>
      <category>claudecode</category>
      <category>api</category>
    </item>
    <item>
      <title>DeepSeek V4.1 Flash API: pricing, providers and setup</title>
      <dc:creator>Owen</dc:creator>
      <pubDate>Sun, 13 Sep 2026 04:32:30 +0000</pubDate>
      <link>https://dev.to/owen_fox/deepseek-v41-flash-api-pricing-providers-and-setup-300l</link>
      <guid>https://dev.to/owen_fox/deepseek-v41-flash-api-pricing-providers-and-setup-300l</guid>
      <description>&lt;p&gt;&lt;strong&gt;To call DeepSeek V4.1 Flash directly, use &lt;code&gt;deepseek-flash&lt;/code&gt; at &lt;code&gt;https://api.deepseek.com&lt;/code&gt;.&lt;/strong&gt; Before buying credit, choose the provider and protocol, estimate the task cost, then configure a key issued by that same provider. This guide follows that full path, from a purchase decision to the first request.&lt;/p&gt;

&lt;p&gt;Checked against DeepSeek's official documentation on September 11, 2026. The code is documentation-checked and syntax-checked; it is not a paid end-to-end test. Running the examples can consume credit.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Choose where to obtain API access
&lt;/h2&gt;

&lt;p&gt;The official release log confirms direct API access. A third-party entry needs its own verification: DeepSeek's legacy-name routing does not establish a gateway's model mapping.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Destination&lt;/th&gt;
&lt;th&gt;What this check establishes&lt;/th&gt;
&lt;th&gt;What to confirm before funding&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Direct DeepSeek API&lt;/td&gt;
&lt;td&gt;Official documentation identifies &lt;code&gt;deepseek-flash&lt;/code&gt; as V4.1 Flash&lt;/td&gt;
&lt;td&gt;Your account access, current rates and required operation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ofox&lt;/td&gt;
&lt;td&gt;The retrieved public catalog showed older DeepSeek entries; this check did not establish a V4.1 serving route&lt;/td&gt;
&lt;td&gt;Actual model version and ID, protocol, account price and payment terms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Another gateway&lt;/td&gt;
&lt;td&gt;Not certified by this guide&lt;/td&gt;
&lt;td&gt;Its own current catalog, protocol documentation and billing terms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Ofox result is a limit of verification, not proof of unavailability. A provider may update routing independently of display labels; a blog announcement alone does not prove a purchasable route exists. Confirm the operation you need: text chat, Codex Responses, Claude Code tools and image input are separate compatibility checks.&lt;/p&gt;

&lt;p&gt;For Ofox, inspect the catalog and authentication documentation. If a confirmed route meets your requirements, create an account and prepare an API key. A gateway account does not fund your direct DeepSeek account.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Calculate the cost before buying credit
&lt;/h2&gt;

&lt;p&gt;These are &lt;strong&gt;direct DeepSeek USD prices per one million tokens&lt;/strong&gt;, checked on the official pricing page. They are not an Ofox quote.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token category&lt;/th&gt;
&lt;th&gt;Off-peak USD / 1M tokens&lt;/th&gt;
&lt;th&gt;Peak USD / 1M tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input with a cache hit&lt;/td&gt;
&lt;td&gt;$0.003&lt;/td&gt;
&lt;td&gt;$0.006&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input with a cache miss&lt;/td&gt;
&lt;td&gt;$0.15&lt;/td&gt;
&lt;td&gt;$0.30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;$0.60&lt;/td&gt;
&lt;td&gt;$1.20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Peak periods are Monday–Friday, &lt;strong&gt;01:00–04:00 and 06:00–10:00 UTC&lt;/strong&gt;. Other times are off-peak. These periods are 09:00–12:00 and 14:00–18:00 in Beijing, or 10:00–13:00 and 15:00–19:00 in Tokyo and Seoul. Use timezone-aware conversion where clocks change seasonally. For a request crossing a price boundary, check the actual billing rule instead of inventing a split-charge formula.&lt;/p&gt;

&lt;p&gt;A repeated prompt does not prove the whole input was billed as cached. Check the returned usage and billing record. For mixed input, estimate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cost = cached_input_tokens / 1_000_000 × cached_input_rate
     + uncached_input_tokens / 1_000_000 × uncached_input_rate
     + billed_output_tokens / 1_000_000 × output_rate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, 100 requests with 10,000 uncached input tokens and 2,000 billed output tokens each total 1 million input and 0.2 million output tokens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Off-peak: (1 × $0.15) + (0.2 × $0.60) = $0.27
Peak:     (1 × $0.30) + (0.2 × $1.20) = $0.54
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That budget fits 18 complete 100-request batches into $5 outside peak hours, or 9 at peak rates, excluding provider-specific fees. It does not guarantee 1,800 useful tasks: agents can make multiple calls, retry, accumulate history and consume more output than a final visible answer suggests.&lt;/p&gt;

&lt;p&gt;When comparing sellers, replace the official rates with the destination's quote. Check its minimum payment, purchase fees, time bands and refund conditions. Budget one complete representative task before increasing the balance.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Match the account, key and model
&lt;/h2&gt;

&lt;p&gt;Obtain a key from the provider you will call. A direct key from the DeepSeek Platform belongs with the DeepSeek endpoint; an Ofox key belongs with the documented Ofox route. Store the direct credential locally as &lt;code&gt;DEEPSEEK_API_KEY&lt;/code&gt;; do not commit or print it.&lt;/p&gt;

&lt;p&gt;Use the exact model ID. The official &lt;code&gt;deepseek-flash&lt;/code&gt; name now selects V4.1 Flash. Older Flash names are compatibility aliases, while an &lt;code&gt;expires-on-0910&lt;/code&gt; beta configuration belongs to an earlier rollout stage. Existing Pro users should also read the migration guidance.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Make one small Python or curl request
&lt;/h2&gt;

&lt;p&gt;Following the official quickstart, install the compatible Python client in your project environment with &lt;code&gt;python -m pip install openai&lt;/code&gt;, then use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DEEPSEEK_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.deepseek.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reply with one short greeting.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;disabled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This starts without thinking or tools so the diagnostic task is small. After the basic call works, add required capabilities one at a time and check their documented parameters.&lt;/p&gt;

&lt;p&gt;The equivalent curl request is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--fail-with-body&lt;/span&gt; https://api.deepseek.com/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$DEEPSEEK_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"model":"deepseek-flash","messages":[{"role":"user","content":"Reply with one short greeting."}],"max_tokens":128,"thinking":{"type":"disabled"}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep a sanitized error body if the call fails. Do not share a verbose trace containing the authorization header. For JavaScript, the OpenAI SDK option is &lt;code&gt;baseURL&lt;/code&gt;; the model and JSON fields stay the same. Follow your installed SDK's interface rather than mechanically copying Python argument names.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Configure the protocol your client needs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Client or operation&lt;/th&gt;
&lt;th&gt;What to check next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chat Completions&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/chat/completions&lt;/code&gt; with &lt;code&gt;messages&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;Responses provider settings and the complete model catalog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Anthropic-compatible base path, main-model aliases and subagents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image understanding&lt;/td&gt;
&lt;td&gt;Supported image content blocks and the chosen route's visual input support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use the dedicated Codex guide or Claude Code guide for client configuration. A text reply alone does not validate a tool loop, image input or streaming parser. Main-model selection also does not establish which model every helper uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Diagnose the error before adding credit
&lt;/h2&gt;

&lt;p&gt;If a model is missing, check the destination and exact identifier first. A stale client catalog may not list &lt;code&gt;deepseek-flash&lt;/code&gt;, and a gateway may use a different ID. Do not assume all providers return the same unknown-model error.&lt;/p&gt;

&lt;p&gt;The official error reference distinguishes 401 authentication, 402 insufficient balance, 400 request format, 422 parameters and 429 rate limits. Adding credit addresses an identified balance problem; it does not fix the other categories. Limit retries and pace transient failures deliberately.&lt;/p&gt;

&lt;p&gt;After a successful representative task, record the model, provider, time, token usage and billed amount without secrets. Compare the bill with your budget and check the result's usefulness. Increase funding only after the needed operation and its cost have been verified on the actual route.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What model ID calls DeepSeek V4.1 Flash?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use deepseek-flash on the direct DeepSeek API. A gateway can use its own identifier; verify the route before using or funding it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much does the official V4.1 Flash API cost?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The September 10 direct API rates per million tokens outside peak hours are $0.003 for cached input, $0.15 for uncached input and $0.60 for output. Peak prices are twice those rates. Gateway prices must be checked separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where can I buy access?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The official DeepSeek API is documented as available. For a gateway, confirm its actual model version, supported protocol, account price and payment terms before funding it. This check has not established an Ofox V4.1 route.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use a DeepSeek key on Ofox?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use the credential issued by the provider receiving the request. Provider keys and balances are separate; do not combine a DeepSeek key with an Ofox endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will adding credit fix an API error?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It can address a confirmed insufficient-balance error, such as 402 on the direct API. It does not fix authentication, malformed requests, an unsupported model or client configuration.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ofox.ai/blog/deepseek-v4-1-flash-api-setup/" rel="noopener noreferrer"&gt;ofox.ai/blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>deepseek</category>
      <category>api</category>
      <category>pricing</category>
    </item>
    <item>
      <title>Codex GPT-5.5 model not found: diagnose the 404</title>
      <dc:creator>Owen</dc:creator>
      <pubDate>Sat, 12 Sep 2026 11:34:10 +0000</pubDate>
      <link>https://dev.to/owen_fox/codex-gpt-55-model-not-found-diagnose-the-404-2j1j</link>
      <guid>https://dev.to/owen_fox/codex-gpt-55-model-not-found-diagnose-the-404-2j1j</guid>
      <description>&lt;p&gt;If Codex reports that &lt;code&gt;gpt-5.5&lt;/code&gt; does not exist or you do not have access to it, &lt;strong&gt;check the combination of model ID, provider and authentication before changing your subscription&lt;/strong&gt;. A valid ChatGPT login does not establish access through an API key, and a valid provider key does not establish that the provider accepts the model ID in your configuration.&lt;/p&gt;

&lt;p&gt;This guide is for a Codex CLI session showing an error such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;unexpected status 404 Not Found: The model `gpt-5.5` does not exist or you do not have access to it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The wording identifies the requested model, not the cause. It is not evidence that GPT-5.5 was retired. The steps below are based on the official Codex configuration and authentication documentation checked on September 8, 2026; they do not claim that GPT-5.5 is available to every account or provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the route, not a reinstall
&lt;/h2&gt;

&lt;p&gt;Run these inspection commands in the same terminal where Codex fails:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex &lt;span class="nt"&gt;--version&lt;/span&gt;
codex login status
codex &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Record the version and authentication method. Also record the directory you launched from, any &lt;code&gt;--model&lt;/code&gt;, &lt;code&gt;--profile&lt;/code&gt; or &lt;code&gt;-c&lt;/code&gt; arguments, and whether an IDE launched the session. Do not share API keys, access tokens or the contents of &lt;code&gt;auth.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;codex login status&lt;/code&gt; describes authentication; it is not a complete report of the endpoint selected by a custom provider. Read it alongside the provider configuration.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your intended connection&lt;/th&gt;
&lt;th&gt;What to check first&lt;/th&gt;
&lt;th&gt;What not to infer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT sign-in&lt;/td&gt;
&lt;td&gt;Correct account/workspace and a model offered for that session&lt;/td&gt;
&lt;td&gt;A ChatGPT subscription guarantees the same model through the API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI API key&lt;/td&gt;
&lt;td&gt;Intended API account/project, model availability and OpenAI endpoint&lt;/td&gt;
&lt;td&gt;A successful ChatGPT session proves this API key has access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Third-party provider&lt;/td&gt;
&lt;td&gt;Provider URL, its model ID and the environment variable supplying its key&lt;/td&gt;
&lt;td&gt;An OpenAI model ID or OpenAI key automatically works on that provider&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;OpenAI documents the distinction between &lt;a href="https://developers.openai.com/codex/auth/" rel="noopener noreferrer"&gt;ChatGPT subscription access and API-key usage-based access&lt;/a&gt;. Keep those routes separate throughout the diagnosis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find the setting Codex actually reads
&lt;/h2&gt;

&lt;p&gt;A common troubleshooting mistake is editing the user configuration while the launch command still selects another model. Inspect the relevant configuration files locally and record only the fields you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="err"&gt;model&lt;/span&gt;
&lt;span class="err"&gt;model_provider&lt;/span&gt;
&lt;span class="err"&gt;openai_base_url&lt;/span&gt;
&lt;span class="err"&gt;model_providers.&amp;lt;provider&amp;gt;.base_url&lt;/span&gt;
&lt;span class="err"&gt;model_providers.&amp;lt;provider&amp;gt;.env_key&lt;/span&gt;
&lt;span class="err"&gt;model_providers.&amp;lt;provider&amp;gt;.requires_openai_auth&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;According to the current &lt;a href="https://developers.openai.com/codex/config-basic/" rel="noopener noreferrer"&gt;configuration basics&lt;/a&gt;, precedence runs from highest to lowest:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CLI flags and &lt;code&gt;--config&lt;/code&gt; overrides.&lt;/li&gt;
&lt;li&gt;Trusted project configuration, with the file closest to the working directory winning.&lt;/li&gt;
&lt;li&gt;The profile file selected with &lt;code&gt;--profile&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;User configuration at &lt;code&gt;~/.codex/config.toml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;System configuration, then built-in defaults.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is an important restriction: current &lt;a href="https://developers.openai.com/codex/config-advanced/" rel="noopener noreferrer"&gt;advanced configuration documentation&lt;/a&gt; says project configuration ignores provider-related keys such as &lt;code&gt;model_provider&lt;/code&gt;, &lt;code&gt;model_providers&lt;/code&gt; and &lt;code&gt;openai_base_url&lt;/code&gt;, with a startup warning. Keep provider definitions in user-level configuration. A project can still override other allowed settings, including the model, so inspecting only one file can miss a mismatch.&lt;/p&gt;

&lt;p&gt;The current docs describe profile files as &lt;code&gt;~/.codex/profile-name.config.toml&lt;/code&gt;. Older tutorials may use a different profile layout. Check your installed version before copying either format.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repair the connection you intended to use
&lt;/h2&gt;

&lt;h3&gt;
  
  
  If you intended ChatGPT sign-in
&lt;/h3&gt;

&lt;p&gt;Confirm the account and workspace, then select a model actually available in that session. Remove an obsolete model override from the launch command or the configuration layer that supplied it. If the model is not offered, check account availability rather than assuming that manually entering &lt;code&gt;gpt-5.5&lt;/code&gt; grants access.&lt;/p&gt;

&lt;p&gt;Only reauthenticate when the active account is wrong or authentication has failed. Reinstalling Codex or deleting credentials is not a necessary first step for a model lookup error.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you intended an OpenAI API key
&lt;/h3&gt;

&lt;p&gt;Confirm that the request uses the intended OpenAI endpoint and API account/project. Compare the requested ID with that account's current model availability. Check &lt;code&gt;openai_base_url&lt;/code&gt; for an old proxy override before concluding that OpenAI rejected the request.&lt;/p&gt;

&lt;p&gt;API access and billing are separate from included ChatGPT plan credits. If another model works with the same key, that is useful evidence about the route, but it does not prove access to GPT-5.5.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you intended a third-party provider
&lt;/h3&gt;

&lt;p&gt;Treat the URL, model identifier and key as one matched set. A provider may use a namespaced model ID; use its documented value rather than adding or removing a prefix by guesswork.&lt;/p&gt;

&lt;p&gt;This is a &lt;strong&gt;configuration template&lt;/strong&gt;, not a working endpoint or an assertion of GPT-5.5 availability. Replace both placeholders with values from your provider. Put these entries in user-level configuration, merging with existing sections rather than duplicating them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;model&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"REPLACE_WITH_PROVIDER_MODEL_ID"&lt;/span&gt;
&lt;span class="py"&gt;model_provider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"diagnostic_provider"&lt;/span&gt;

&lt;span class="nn"&gt;[model_providers.diagnostic_provider]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"My provider"&lt;/span&gt;
&lt;span class="py"&gt;base_url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://api.example.com/v1"&lt;/span&gt;
&lt;span class="py"&gt;env_key&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"PROVIDER_API_KEY"&lt;/span&gt;
&lt;span class="py"&gt;requires_openai_auth&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="py"&gt;wire_api&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"responses"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The selected provider must support the Responses API; the current Codex configuration reference lists &lt;code&gt;responses&lt;/code&gt; as the only supported &lt;code&gt;wire_api&lt;/code&gt; value. A provider offering only Chat Completions cannot use this template. Set &lt;code&gt;PROVIDER_API_KEY&lt;/code&gt; through your usual local secret-management method; do not paste the secret into a shared TOML file.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;requires_openai_auth&lt;/code&gt; defaults to &lt;code&gt;false&lt;/code&gt;; it is explicit here to keep this template on the provider-key route. If an existing provider definition sets it to &lt;code&gt;true&lt;/code&gt;, Codex uses OpenAI authentication and ignores &lt;code&gt;env_key&lt;/code&gt;. Check this setting when a provider key appears to have no effect.&lt;/p&gt;

&lt;p&gt;Before editing, save a copy of the affected configuration. Keep unrelated settings. After editing, start a new session from the same directory and run a small request that does not ask Codex to edit files. API usage may be billed. Restore the saved configuration if the change breaks a previously working route.&lt;/p&gt;

&lt;p&gt;For a broader setup walkthrough, see &lt;a href="https://ofox.ai/blog/codex-cli-custom-model-providers-byo-setup/" rel="noopener noreferrer"&gt;custom model providers in Codex&lt;/a&gt;. If you use Ofox, check the &lt;a href="https://ofox.ai/models" rel="noopener noreferrer"&gt;current model catalog&lt;/a&gt; for the exact ID and supported connection before configuring it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use the next response to narrow the cause
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Result after the change&lt;/th&gt;
&lt;th&gt;Next step&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Same model-specific 404&lt;/td&gt;
&lt;td&gt;Recheck effective model ID, host and account access; avoid repeated identical retries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML 404 or a generic route-not-found response&lt;/td&gt;
&lt;td&gt;Check URL/path construction and proxy routing before blaming model permissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;401 authentication error&lt;/td&gt;
&lt;td&gt;Check the credential for the selected provider; follow the &lt;a href="https://ofox.ai/blog/codex-cli-401-unauthorized-fix-2026/" rel="noopener noreferrer"&gt;Codex 401 guide&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;429 or a usage-limit message&lt;/td&gt;
&lt;td&gt;Model lookup is no longer the only issue; inspect the actual quota/rate-limit response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A successful response&lt;/td&gt;
&lt;td&gt;Confirm the intended account/provider and request record before resuming the larger job&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you compare a direct API request with Codex, use the same host, key, model and Responses endpoint. A successful Chat Completions request to another host does not isolate a Codex problem. A direct success on the matched route shifts attention toward Codex configuration or request differences; it does not prove which difference caused the error.&lt;/p&gt;

&lt;p&gt;A local &lt;code&gt;model metadata ... not found&lt;/code&gt; warning is also distinct from an HTTP 404. Capture the final server response rather than assuming those messages have the same cause. For non-Codex SDKs and Azure cases, use the &lt;a href="https://ofox.ai/blog/openai-api-model-not-found-errors-troubleshooting/" rel="noopener noreferrer"&gt;general OpenAI model-not-found guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to include if you still need support
&lt;/h2&gt;

&lt;p&gt;Send a redacted report containing the Codex version, operating system, authentication type, selected model/provider, endpoint host and path, working-directory context, relevant startup warnings and the exact final error. Include the request ID if the provider supplies one. Exclude secrets and private prompts.&lt;/p&gt;

&lt;p&gt;That report lets support distinguish account availability from a stale override or provider mismatch. It is a better next step than changing the account, model and endpoint all at once and losing the original evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/auth/" rel="noopener noreferrer"&gt;OpenAI Codex authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/config-basic/" rel="noopener noreferrer"&gt;OpenAI Codex configuration basics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/config-advanced/" rel="noopener noreferrer"&gt;OpenAI Codex advanced configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/config-reference/" rel="noopener noreferrer"&gt;OpenAI Codex configuration reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/cli/reference/" rel="noopener noreferrer"&gt;OpenAI Codex CLI reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does a GPT-5.5 404 mean the model was removed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. The error alone does not distinguish an unavailable model from the wrong provider, model ID or account access. Check the request route and that account's current model availability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does a ChatGPT subscription pay for API requests?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Codex authentication with an API key uses API billing rather than included ChatGPT plan credits. Check which authentication route your session actually uses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I delete auth.json to fix this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start with codex login status and your selected provider. Deleting credentials does not fix a wrong model ID or endpoint and can interrupt a working login.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ofox.ai/blog/codex-gpt-5-5-model-not-found-404-fix-2026/" rel="noopener noreferrer"&gt;ofox.ai/blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codex</category>
      <category>troubleshooting</category>
      <category>apiguide</category>
    </item>
    <item>
      <title>Codex Errors: 15 Symptoms Mapped to a Tested Fix (2026)</title>
      <dc:creator>Owen</dc:creator>
      <pubDate>Sat, 12 Sep 2026 04:34:14 +0000</pubDate>
      <link>https://dev.to/owen_fox/codex-errors-15-symptoms-mapped-to-a-tested-fix-2026-31i</link>
      <guid>https://dev.to/owen_fox/codex-errors-15-symptoms-mapped-to-a-tested-fix-2026-31i</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Most Codex errors are misfiled. The message names the symptom, not the cause, so people spend an afternoon rotating an API key when the real problem is a Windows Store install path or a missing &lt;code&gt;bubblewrap&lt;/code&gt; package. This page is the index: 15 failures we have reproduced, each mapped to the thing that is actually broken and to the page with the tested fix. Start with your version, then find your string.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Last updated 2026-08-31. Version numbers and issue states on this page were read from npm, GitHub and OpenAI’s own docs on that date.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For configuration rather than an error, go directly to &lt;a href="https://ofox.ai/blog/codex-cli-config-toml-deep-dive/" rel="noopener noreferrer"&gt;config.toml paths and examples&lt;/a&gt; or &lt;a href="https://ofox.ai/blog/codex-cli-custom-model-providers-byo-setup/" rel="noopener noreferrer"&gt;custom providers and profiles&lt;/a&gt;. For an API model 404, use the &lt;a href="https://ofox.ai/blog/openai-api-model-not-found-errors-troubleshooting/" rel="noopener noreferrer"&gt;model ID, access and endpoint checks&lt;/a&gt;. Match the actual error text before changing credentials or reinstalling.&lt;/p&gt;

&lt;h2&gt;
  
  
  What should you check before any Codex fix?
&lt;/h2&gt;

&lt;p&gt;Three of the biggest error families in this list are regressions with a known fixed build. If you are on the broken build, the fix is the upgrade and nothing else on this page applies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex &lt;span class="nt"&gt;--version&lt;/span&gt;                    &lt;span class="c"&gt;# CLI&lt;/span&gt;
npm view @openai/codex version     &lt;span class="c"&gt;# latest published: 0.151.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The editor extension carries its own version, and it is the one that matters for the “couldn’t load its resources” family: the break landed in &lt;code&gt;26.803.41515&lt;/code&gt; and the fix landed in &lt;code&gt;26.810.41047&lt;/code&gt;. AGENTS.md loading in symlinked workspaces was fixed in CLI &lt;code&gt;v0.138&lt;/code&gt;. Upgrade first, reproduce second.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which Codex are you running?
&lt;/h2&gt;

&lt;p&gt;Five surfaces ship under the same name and they fail in different places. Getting this wrong is the most common reason a fix does not work.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Surface&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Where its errors come from&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@openai/codex&lt;/code&gt;, a Rust binary with an npm wrapper&lt;/td&gt;
&lt;td&gt;PATH, &lt;code&gt;~/.codex/config.toml&lt;/code&gt;, the sandbox, auth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Editor extension&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;the Codex panel in VS Code and forks&lt;/td&gt;
&lt;td&gt;resource loading, the app-server handshake, the native host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chrome extension&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;browser control, installed from the ChatGPT desktop app&lt;/td&gt;
&lt;td&gt;native host version, permissions, browser support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ChatGPT mobile&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Codex inside the phone app&lt;/td&gt;
&lt;td&gt;nothing local; it is a remote session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Desktop app&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;the ChatGPT desktop client that hosts the above&lt;/td&gt;
&lt;td&gt;model picker, &lt;code&gt;model_catalog_json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your error mentions resources, a native host, or an app-server, you are in extension territory even if you also use the CLI. If it mentions &lt;code&gt;config.toml&lt;/code&gt;, a sandbox, or a provider, you are in CLI territory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which Codex error do you have?
&lt;/h2&gt;

&lt;p&gt;Every string below is quoted as it appears. Find yours, then follow the link for the reproduction and the fix.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why will Codex not install or start?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error message&lt;/th&gt;
&lt;th&gt;What is actually wrong&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zsh: command not found: codex&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;npm installed it somewhere not on your PATH, usually because of NVM, Volta, or a custom &lt;code&gt;npm prefix -g&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/codex-command-not-found-fix-npm-install-2026/" rel="noopener noreferrer"&gt;codex: command not found&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;failed to start codex app-server (os error 3)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Windows cannot resolve the path it was handed, most often a Microsoft Store install under &lt;code&gt;WindowsApps\&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/codex-failed-to-start-app-server-windows-2026/" rel="noopener noreferrer"&gt;failed to start codex app-server on Windows&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;manifest entry is missing required path nodePath/resourcesPath&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the launcher read an install manifest whose recorded paths no longer exist&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/codex-failed-to-start-app-server-windows-2026/" rel="noopener noreferrer"&gt;same page, fix 6&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;unable to locate the codex cli binary&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the extension is looking for a CLI that was never installed, or was installed under a different user&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/codex-failed-to-start-app-server-windows-2026/" rel="noopener noreferrer"&gt;failed to start codex app-server on Windows&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Codex could not start the extension. Codex couldn't load its resources.&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the &lt;code&gt;26.803.41515&lt;/code&gt; regression, which breaks five different ways behind one message&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/codex-couldnt-load-its-resources-fix-2026/" rel="noopener noreferrer"&gt;couldn’t load its resources&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;codex chrome native host is out of date&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the browser extension and the desktop app are on mismatched builds&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/codex-couldnt-load-its-resources-fix-2026/" rel="noopener noreferrer"&gt;couldn’t load its resources&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Windows deserves its own note, because a lot of advice still says WSL2 is mandatory. It is not. The project README gives Windows its own one-liner:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Run the following on Windows to install Codex CLI: &lt;code&gt;powershell -ExecutionPolicy ByPass -c "irm https://chatgpt.com/codex/install.ps1 | iex"&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That installer needs no Node at all. WSL2 is a choice rather than a requirement, but the two paths get different sandboxes. &lt;a href="https://ofox.ai/blog/codex-windows-wsl-installation/" rel="noopener noreferrer"&gt;Native versus WSL2&lt;/a&gt; has the trade-off; &lt;a href="https://ofox.ai/blog/codex-official-installation-complete/" rel="noopener noreferrer"&gt;the install guide&lt;/a&gt; has all the routes including the standalone installer that needs no Node at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why can Codex not authenticate?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error message&lt;/th&gt;
&lt;th&gt;What is actually wrong&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Missing bearer or basic authentication in header&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no key was sent at all, usually an env var that never made it into the shell Codex runs in&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/codex-cli-401-unauthorized-fix-2026/" rel="noopener noreferrer"&gt;Codex CLI 401: 9 tested causes&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Incorrect API key provided&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;a key was sent and rejected, which is a different problem with a different fix&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/codex-cli-401-unauthorized-fix-2026/" rel="noopener noreferrer"&gt;Codex CLI 401: 9 tested causes&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;requests hang and then time out on connect&lt;/td&gt;
&lt;td&gt;a PAC or WPAD corporate proxy that Codex does not discover, or a missing CA certificate&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/codex-cli-corporate-proxy-pac-wpad/" rel="noopener noreferrer"&gt;Codex behind a corporate proxy&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nine failures return something a user reads as a 401, and only some of them are literally 401. Read the message body, not the status code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why has Codex run out of quota?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error message&lt;/th&gt;
&lt;th&gt;What is actually wrong&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;You've hit your usage limit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;a subscription window closed; the reset is a server-side &lt;code&gt;resetsAt&lt;/code&gt; timestamp, not a clock rule&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/codex-weekly-limit-drained-2026/" rel="noopener noreferrer"&gt;Codex reset: when your limit clears&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;429 Too Many Requests&lt;/code&gt; on a metered key&lt;/td&gt;
&lt;td&gt;rate limiting or a spend cap on the API side, which is a separate system from the subscription window&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/codex-weekly-limit-cap-spend-api-2026/" rel="noopener noreferrer"&gt;cap your spend with a drop-in API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is the single biggest source of Codex searches we see, and most of the advice online is wrong about it. There is no fixed number of days to wait, there are exactly two windows, and an earned reset is a credit you can redeem rather than a date you wait for. A 429 on a metered key is not the same event at all: for what the code means per provider, see &lt;a href="https://ofox.ai/blog/llm-api-error-codes-reference-2026/" rel="noopener noreferrer"&gt;LLM API error codes&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does Codex refuse to run commands or read your files?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error message&lt;/th&gt;
&lt;th&gt;What is actually wrong&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;command failed; retry without sandbox&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;on Linux, &lt;code&gt;bubblewrap&lt;/code&gt; is missing or cannot open the paths it needs; on any OS, &lt;code&gt;sandbox_mode&lt;/code&gt; is stricter than the task&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/codex-command-failed-retry-without-sandbox-fix-2026/" rel="noopener noreferrer"&gt;command failed; retry without sandbox&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AGENTS.md is ignored, no error at all&lt;/td&gt;
&lt;td&gt;the workspace path traverses a symlink, on CLI builds before v0.138&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/codex-agents-md-not-loading-symlinked-workspaces-2026/" rel="noopener noreferrer"&gt;AGENTS.md not loading in symlinked workspaces&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The sandbox one has a trap worth knowing: Codex prints a bubblewrap warning whose match string does not exist on every distribution, so a broken sandbox can fail silently on some Linux installs. The fix page has the five-distribution test.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why will your model or provider not appear?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error message&lt;/th&gt;
&lt;th&gt;What is actually wrong&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;custom models missing from the Codex Desktop picker&lt;/td&gt;
&lt;td&gt;the &lt;code&gt;model_catalog_json&lt;/code&gt; bug; the picker has nothing to describe when the model is set inline&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/codex-desktop-not-showing-custom-models-2026/" rel="noopener noreferrer"&gt;Codex Desktop not showing custom models&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;an unknown model silently caps at 258K context&lt;/td&gt;
&lt;td&gt;Codex falls back to a default context size for models not in its catalog&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ofox.ai/blog/qwen-3-8-max-codex-cli-config-cost-2026/" rel="noopener noreferrer"&gt;Qwen 3.8 Max in Codex CLI&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pointing Codex at a provider other than OpenAI is a supported path, not a hack, but there are three places to do it and they behave differently. &lt;a href="https://ofox.ai/blog/codex-cli-config-toml-deep-dive/" rel="noopener noreferrer"&gt;The &lt;code&gt;config.toml&lt;/code&gt; reference&lt;/a&gt; is the full surface. &lt;a href="https://ofox.ai/blog/codex-cli-custom-model-providers-byo-setup/" rel="noopener noreferrer"&gt;The &lt;code&gt;[model_providers]&lt;/code&gt; block&lt;/a&gt; is how you keep several providers side by side. &lt;a href="https://ofox.ai/blog/codex-cli-api-configuration-guide-2026/" rel="noopener noreferrer"&gt;The custom endpoint guide&lt;/a&gt; is the two-variable version if you only want one. One constraint that catches people: Codex only accepts &lt;code&gt;wire_api = "responses"&lt;/code&gt; for custom providers, so a chat-completions-only gateway will not work no matter how the rest is configured.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which changes need evidence first?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Changing API keys.&lt;/strong&gt; For a rejected key, verify the selected provider, credential and account. For a missing-header error, inspect whether the client actually sends authentication. A 429 needs rate-limit or quota checks, not automatic key rotation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reinstalling.&lt;/strong&gt; For a command-not-found error, inspect PATH and the installed binary before reinstalling. Installation damage and path configuration are different causes; use the logs to distinguish them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An open GitHub issue.&lt;/strong&gt; An issue still marked open does not mean the feature is missing. Codex issue #22638 asks for Chromium browser support and is still open, while the docs list five supported browsers and the feature shipped. Check the product, then the tracker.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you set Codex up from scratch?
&lt;/h2&gt;

&lt;p&gt;If nothing is broken yet and you are here to configure rather than repair:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;a href="https://ofox.ai/blog/codex-official-installation-complete/" rel="noopener noreferrer"&gt;Install it&lt;/a&gt;, on any of npm, Homebrew, the standalone installer, or a raw binary.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://ofox.ai/blog/codex-cli-config-toml-deep-dive/" rel="noopener noreferrer"&gt;Write a &lt;code&gt;config.toml&lt;/code&gt;&lt;/a&gt; and understand the three approval modes and three sandbox levels before you loosen either.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://ofox.ai/blog/codex-cli-custom-model-providers-byo-setup/" rel="noopener noreferrer"&gt;Point it at the model you actually want&lt;/a&gt;, whether that is an OpenAI model or something else through an OpenAI-compatible gateway.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://ofox.ai/blog/codex-cli-real-world-coding-workflow/" rel="noopener noreferrer"&gt;Learn the loop&lt;/a&gt;: AGENTS.md, plan mode, worktrees, and the seven mistakes that waste the first week.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Coming from somewhere else, &lt;a href="https://ofox.ai/blog/migrate-claude-code-to-codex-2026/" rel="noopener noreferrer"&gt;the Claude Code migration&lt;/a&gt; maps all 12 config surfaces and names the one dead end. Choosing rather than migrating, &lt;a href="https://ofox.ai/blog/claude-code-vs-codex-cli-vs-cursor-vs-deepseek-tui-2026/" rel="noopener noreferrer"&gt;Claude Code vs Codex vs Cursor vs DeepSeek TUI&lt;/a&gt; and &lt;a href="https://ofox.ai/blog/opencode-vs-codex-cli-terminal-coding-agent-2026/" rel="noopener noreferrer"&gt;OpenCode vs Codex CLI&lt;/a&gt; are the head-to-heads.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about the browser, mobile and desktop surfaces?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ofox.ai/blog/codex-chrome-extension-codex-app-2026/" rel="noopener noreferrer"&gt;The Chrome extension&lt;/a&gt; now covers Chrome, Edge, Brave, Opera and Vivaldi and installs from the ChatGPT desktop app. &lt;a href="https://ofox.ai/blog/codex-mobile-app-iphone-android-2026/" rel="noopener noreferrer"&gt;Codex on iPhone and Android&lt;/a&gt; is a remote session, so nothing about PATH or sandboxes applies there. &lt;a href="https://ofox.ai/blog/codex-goal-mode-remote-computer-use-2026/" rel="noopener noreferrer"&gt;Goal Mode and remote computer use&lt;/a&gt; is the long-running agentic mode and its own safety model.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.chatgpt.com/docs/config-file/config-basic" rel="noopener noreferrer"&gt;Codex configuration reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex/releases" rel="noopener noreferrer"&gt;openai/codex releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex" rel="noopener noreferrer"&gt;openai/codex on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/api/docs/guides/error-codes" rel="noopener noreferrer"&gt;OpenAI API error codes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why does Codex fail with a different error on Windows than on macOS?
&lt;/h3&gt;

&lt;p&gt;Operating systems and installation methods use different paths, permissions and process launchers. On Windows, os error 3 points to a path lookup failure; inspect the actual executable path and application logs. Do not assume every Windows failure has the same cause.&lt;/p&gt;

&lt;h3&gt;
  
  
  What should I check before working through any Codex fix?
&lt;/h3&gt;

&lt;p&gt;Your version. Run &lt;code&gt;codex --version&lt;/code&gt; for the CLI and check the extension version in your editor. Several of the most-reported 2026 errors are regressions with a known fixed build: the 'couldn't load its resources' family was introduced in 26.803.41515 and fixed in 26.810.41047, and AGENTS.md in symlinked workspaces was fixed in CLI v0.138. Upgrading is the whole fix in those cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is a Codex 401 always an authentication problem?
&lt;/h3&gt;

&lt;p&gt;No. Nine distinct failures return something that looks like a 401, and they split into three groups that need different fixes: no key was sent at all ('Missing bearer or basic authentication in header'), a key was sent and rejected ('Incorrect API key provided'), and a key that is correct but carries a trailing newline from a shell export. The status code is the same; the message body is what tells them apart.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does hitting the Codex weekly limit mean I have to wait a fixed number of days?
&lt;/h3&gt;

&lt;p&gt;No. The reset is a server-side &lt;code&gt;resetsAt&lt;/code&gt; timestamp attached to your account, not a clock rule you can compute, and there are only two windows (primary and secondary). You can read the actual timestamp rather than guessing, and an earned reset credit can be redeemed early.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which Codex surface am I actually using?
&lt;/h3&gt;

&lt;p&gt;There are five and they fail differently: the CLI (&lt;code&gt;@openai/codex&lt;/code&gt; on npm, currently 0.151.0), the editor extension, the Chrome extension driven by the ChatGPT desktop app, Codex inside the ChatGPT mobile app, and the desktop app itself. An error about resources or a native host is an extension problem; an error about &lt;code&gt;config.toml&lt;/code&gt; or a sandbox is a CLI problem.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ofox.ai/blog/codex-errors-fixes-index-2026/" rel="noopener noreferrer"&gt;ofox.ai/blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codex</category>
      <category>troubleshooting</category>
      <category>openai</category>
    </item>
    <item>
      <title>Connect Codex CLI and Claude Code to Ofox with CC Switch</title>
      <dc:creator>Owen</dc:creator>
      <pubDate>Sat, 12 Sep 2026 01:22:26 +0000</pubDate>
      <link>https://dev.to/owen_fox/connect-codex-cli-and-claude-code-to-ofox-with-cc-switch-47ik</link>
      <guid>https://dev.to/owen_fox/connect-codex-cli-and-claude-code-to-ofox-with-cc-switch-47ik</guid>
      <description>&lt;p&gt;CC Switch sets up Codex CLI and Claude Code against Ofox from one place. The two need different base URLs and API formats — mixing them up is the usual failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two clients, two protocols
&lt;/h2&gt;

&lt;p&gt;Codex CLI and Claude Code speak &lt;strong&gt;different protocols&lt;/strong&gt;. CC Switch keeps both entries side by side, which is the main reason to use it — pasting the Claude Code base URL into the Codex tab, or the reverse, is an easy mistake to make by hand.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Codex CLI&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Protocol&lt;/td&gt;
&lt;td&gt;OpenAI-compatible&lt;/td&gt;
&lt;td&gt;Anthropic native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ofox base URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://api.ofox.ai/v1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://api.ofox.ai/anthropic&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API format in CC Switch&lt;/td&gt;
&lt;td&gt;OpenAI Compatible&lt;/td&gt;
&lt;td&gt;Anthropic Messages (Native)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth field&lt;/td&gt;
&lt;td&gt;not applicable&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_AUTH_TOKEN (Default)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CC Switch tab&lt;/td&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;(provider management page)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Neither URL takes a trailing slash, and one Ofox key authenticates both. Note that this table describes the &lt;strong&gt;client&lt;/strong&gt;, not the model — every Claude model in the Ofox catalog, Fable 5.1 included, accepts either protocol.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing CC Switch
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; cc-switch

&lt;span class="c"&gt;# Debian / Ubuntu — download the .deb from Releases first&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; &amp;lt;downloaded-file&amp;gt;.deb

&lt;span class="c"&gt;# Fedora / RHEL&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;rpm &lt;span class="nt"&gt;-i&lt;/span&gt; &amp;lt;downloaded-file&amp;gt;.rpm

&lt;span class="c"&gt;# AppImage&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x &amp;lt;downloaded-file&amp;gt;.AppImage &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./&amp;lt;downloaded-file&amp;gt;.AppImage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows ships an &lt;code&gt;.msi&lt;/code&gt; installer, and macOS has a &lt;code&gt;.dmg&lt;/code&gt; on the releases page if you would rather not use Homebrew. For the full install walkthrough, see &lt;a href="https://ofox.ai/blog/cc-switch-install-multi-cli-setup-2026/" rel="noopener noreferrer"&gt;the CC Switch setup guide&lt;/a&gt;. Minimum supported versions are macOS 12, Windows 10, and Ubuntu 22.04 / Debian 11 / Fedora 34.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding the Codex CLI provider
&lt;/h2&gt;

&lt;p&gt;Switch to the &lt;strong&gt;Codex&lt;/strong&gt; tab at the top, then use the &lt;code&gt;+&lt;/code&gt; button in the top-right corner.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Provider Name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ofoxai-codex&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Website URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://ofox.ai&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Key&lt;/td&gt;
&lt;td&gt;your Ofox key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://api.ofox.ai/v1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Format&lt;/td&gt;
&lt;td&gt;OpenAI Compatible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write to Global Config&lt;/td&gt;
&lt;td&gt;checked&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Leaving "Write to Global Config" checked applies the provider across all projects rather than just the current one. Add the provider, then activate it from the list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding the Claude Code provider
&lt;/h2&gt;

&lt;p&gt;Same tool, different page and different values.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Provider Name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ofoxai-claude&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Website URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://ofox.ai&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Key&lt;/td&gt;
&lt;td&gt;your Ofox key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://api.ofox.ai/anthropic&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Format / Auth Field&lt;/td&gt;
&lt;td&gt;Anthropic Messages (Native) / &lt;code&gt;ANTHROPIC_AUTH_TOKEN (Default)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model Configuration&lt;/td&gt;
&lt;td&gt;leave empty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write to Global Config&lt;/td&gt;
&lt;td&gt;checked&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Leave Model Configuration empty.&lt;/strong&gt; It falls through to the default Claude model, which is what you want unless you are deliberately pinning one. CC Switch writes the result to &lt;code&gt;~/.claude/settings.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There are two optional toggles on this page, "Hide AI Signature" and "Teammates Mode". Neither affects routing or billing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning on usage query
&lt;/h2&gt;

&lt;p&gt;CC Switch can poll Ofox for consumption figures and show them in its dashboard. Four things to set: toggle &lt;strong&gt;Enable Usage Query&lt;/strong&gt; on, paste the same Ofox API key, set the request endpoint to &lt;code&gt;https://api.ofox.ai/v1&lt;/code&gt;, and pick the Universal Template (&lt;strong&gt;通用模板&lt;/strong&gt;) option, which the Ofox documentation recommends for best compatibility.&lt;/p&gt;

&lt;p&gt;Two things to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It does &lt;strong&gt;not&lt;/strong&gt; consume API quota — it uses a dedicated statistics API rather than your call budget.&lt;/li&gt;
&lt;li&gt;Figures lag the calls that produced them by a few minutes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Turning it off later does not disturb normal API calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  On Fable 5.1 specifically
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fable 5.1 landed in the Ofox catalog on 3 September 2026&lt;/strong&gt;, as &lt;code&gt;anthropic/claude-fable-5.1&lt;/code&gt;. Nothing above changes for it: same two base URLs, same two API formats, same key. The model string is the only difference.&lt;/p&gt;

&lt;p&gt;The setup is worth doing regardless of which model you land on: it gives you a working two-protocol path where switching models is a string change. Alongside Fable 5.1, the catalog has &lt;code&gt;anthropic/claude-fable-5&lt;/code&gt;, &lt;code&gt;anthropic/claude-opus-5&lt;/code&gt; and &lt;code&gt;anthropic/claude-sonnet-5&lt;/code&gt; at Anthropic list prices with no markup, and all four are reachable over either protocol on the same key.&lt;/p&gt;

&lt;p&gt;That matters for Fable 5.1 in particular, because its only price change is the cache read — $1 down to $0.25. Whether that is worth anything to you depends entirely on your cache-hit ratio, and the way to find out is to run your real workload through this setup and read the number off your own usage. The &lt;a href="https://ofox.ai/blog/claude-fable-5-1-api-guide-2026/" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; has the rate table and the TTL arithmetic.&lt;/p&gt;

&lt;h2&gt;
  
  
  When something does not connect
&lt;/h2&gt;

&lt;p&gt;Three common failure modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A trailing slash on the request URL.&lt;/strong&gt; The Ofox documentation calls this out for both providers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The wrong API format for the tab.&lt;/strong&gt; Codex CLI with "Anthropic Messages (Native)" selected will not work, and neither will the reverse. Check the format field before the key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A model string the catalog does not have.&lt;/strong&gt; Note that the Ofox ID for Fable 5.1 is &lt;code&gt;anthropic/claude-fable-5.1&lt;/code&gt; with a dot, not a hyphen — though the alias &lt;code&gt;anthropic/claude-fable-5-1&lt;/code&gt; also resolves. The live catalog is the authority: &lt;code&gt;GET /v1/models&lt;/code&gt; returns exactly what you can call.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;CC Switch installation targets, provider field values, base URLs and usage-query behaviour verified against the Ofox integration documentation on 3 September 2026. Catalog contents checked against the live &lt;code&gt;/v1/models&lt;/code&gt; endpoint the same day.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is CC Switch?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An open-source provider manager with a visual interface. It writes the config files for Claude Code and Codex CLI, so you do not have to edit JSON or environment variables by hand. For Claude Code it writes &lt;code&gt;~/.claude/settings.json&lt;/code&gt;. It runs on macOS 12+, Windows 10+, and Ubuntu 22.04+ / Debian 11+ / Fedora 34+.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do Codex CLI and Claude Code use the same Ofox base URL?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No — and this is where setups usually go wrong. Codex CLI is an OpenAI-protocol client and takes &lt;code&gt;https://api.ofox.ai/v1&lt;/code&gt; with the API format set to OpenAI Compatible. Claude Code is an Anthropic-protocol client and takes &lt;code&gt;https://api.ofox.ai/anthropic&lt;/code&gt; with the format set to Anthropic Messages (Native). Neither URL takes a trailing slash.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I run Claude Fable 5.1 through this setup?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, as of 3 September 2026. Fable 5.1 is in the Ofox catalog as &lt;code&gt;anthropic/claude-fable-5.1&lt;/code&gt;. Nothing in the setup changes for it — same base URLs, same API formats, same key. Only the model string differs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does CC Switch's usage query burn API quota?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Per the Ofox integration documentation it uses a dedicated statistics API and does not count against your API call limits. Usage figures typically appear within a few minutes of the calls that produced them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I keep more than one Ofox account in CC Switch?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. You can add multiple Ofox provider entries with different API keys and switch between them from the list.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ofox.ai/blog/codex-cli-cc-switch-fable-5-1-setup-2026/" rel="noopener noreferrer"&gt;ofox.ai/blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codex</category>
      <category>claudecode</category>
      <category>ccswitch</category>
    </item>
    <item>
      <title>ChatGPT DeviceCheck Registration Failed (403, 500, 503): Real Fixes</title>
      <dc:creator>Owen</dc:creator>
      <pubDate>Mon, 07 Sep 2026 04:34:54 +0000</pubDate>
      <link>https://dev.to/owen_fox/chatgpt-devicecheck-registration-failed-403-500-503-real-fixes-3cn</link>
      <guid>https://dev.to/owen_fox/chatgpt-devicecheck-registration-failed-403-500-503-real-fixes-3cn</guid>
      <description>&lt;h1&gt;
  
  
  ChatGPT DeviceCheck Registration Failed (403, 500, 503): Real Fixes
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;DeviceCheck errors block ChatGPT login before your password is ever checked, and the official advice about date and time fixes almost none of them.&lt;/strong&gt; The error means your device could not produce an attestation token proving it is genuine hardware. That is a conversation between your device and Apple or Google — OpenAI is only the party that gets told "no".&lt;/p&gt;

&lt;p&gt;Which is why the same account signs in fine on the website. This page covers what each variant means and the fixes that actually resolve reports, ordered by how often they work.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error family:   DeviceCheckError / "DeviceCheck registration failed"
Also seen as:   Token generation failed · Preauth PlayIntegrity verification failed
                DeviceCheck token generation is unavailable (macOS)
Codes attached: 403, 500, 503 — these are transport codes, not distinct root causes
Blocks:         native app login only. Browser login is unaffected.
Root cause:     device attestation, not your OpenAI account
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Sources are OpenAI's own help article, OpenAI Developer Community threads, and openai/codex issue #33463. Read 6 September 2026.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What DeviceCheck Actually Is
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apple's DeviceCheck and Google's Play Integrity let an app ask the OS vendor "is this a real, unmodified device?"&lt;/strong&gt; OpenAI uses that to stop bulk account creation on emulators and modified phones.&lt;/p&gt;

&lt;p&gt;The sequence when it fails:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You tap Log in. The app asks the OS for an attestation token.&lt;/li&gt;
&lt;li&gt;The OS tries to produce one, talking to Apple or Google in the process.&lt;/li&gt;
&lt;li&gt;Something in that chain fails.&lt;/li&gt;
&lt;li&gt;The app never gets a token, so it never sends your credentials, and you see a DeviceCheck error.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Your account is never involved.&lt;/strong&gt; That is the single most useful thing to understand here, because it rules out password resets, account recovery and support tickets about billing — none of which touch this.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 403, 500 and 503 in the search results
&lt;/h3&gt;

&lt;p&gt;People search for &lt;code&gt;devicecheck registration failed (403)&lt;/code&gt;, &lt;code&gt;(500)&lt;/code&gt; and &lt;code&gt;(503)&lt;/code&gt; because those numbers appear in the error text. They are HTTP statuses from the attestation call, not separate bugs with separate fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;403&lt;/strong&gt; — the request was rejected. Usually integrity: a modified device, or an edge/WAF layer refusing the client. Several iPhone reports trace 403 to a Cloudflare challenge during login.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;500 / 503&lt;/strong&gt; — the attestation service failed or was unavailable. Often transient on the provider side.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you see 503, wait and retry before changing anything. If you see 403 repeatedly, it is more likely one of the device-side causes below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 1: Clear Your Browser Cache (Most Reported Success)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The ChatGPT app hands login to your system browser, so a poisoned browser cache breaks the app while the website still works.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is counterintuitive enough that people skip it, and it is the fix that resolves the most reports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;iPhone:&lt;/strong&gt; clear the cache in &lt;em&gt;both&lt;/em&gt; Safari and Chrome, not just your default.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Settings → Safari → Clear History and Website Data&lt;/li&gt;
&lt;li&gt;Chrome → ⋯ → Delete Browsing Data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Android:&lt;/strong&gt; switch your default browser to Chrome and retry. Multiple reports resolve immediately on moving off Brave or a custom browser.&lt;/p&gt;

&lt;p&gt;One community report after months of failed attempts: after clearing both Safari and Chrome caches, "it magically started working perfectly." The mechanism is that login runs through the system browser in the background, so the browser's state is the app's state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 2: Install Pending OS Updates, Then Restart
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A pending security update that could not install is a documented cause.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One iPhone report worked through switching Wi-Fi, hotspot, reinstalling, private mode, and logging out and in — none of it helped. The actual cause was an iOS update blocked by low storage. After freeing space, installing, and letting the phone reboot, login worked immediately.&lt;/p&gt;

&lt;p&gt;Check Settings → General → Software Update, install anything pending including security responses, and restart before trying again. Outdated security components can cause the edge layer to reject the device during login.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 3: Device Integrity (And Why Retrying Does Not Help)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If your device is rooted or jailbroken, DeviceCheck failing is the system working as designed.&lt;/strong&gt; OpenAI's help article names this directly: "Modifications like rooting or jailbreaking may cause this error."&lt;/p&gt;

&lt;p&gt;The detail that wastes people's time is in the same article: &lt;strong&gt;integrity check results can be cached for up to 24 hours.&lt;/strong&gt; So if you fix the underlying problem and retry immediately, you are testing against a cached failure. Clear the app data before retrying.&lt;/p&gt;

&lt;p&gt;On rooted Android with Magisk, the community fix is the Play Integrity Fix module, then reboot. That is a workaround for a check that is deliberately failing, so treat it accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 4: Clear App and Play Services Data (Android)
&lt;/h2&gt;

&lt;p&gt;Ordered from least to most disruptive:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Settings → Apps → ChatGPT → Storage → &lt;strong&gt;Clear cache&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Same screen → &lt;strong&gt;Clear data&lt;/strong&gt; (this signs you out)&lt;/li&gt;
&lt;li&gt;Settings → Apps → &lt;strong&gt;Play Store&lt;/strong&gt; → Clear data&lt;/li&gt;
&lt;li&gt;Settings → Apps → &lt;strong&gt;Google Play Services&lt;/strong&gt; → Clear cache&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then reboot and retry. Doing all four at once works but tells you nothing about the cause; going in order costs a few minutes and identifies it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 5: macOS "DeviceCheck Token Generation Is Unavailable"
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;This variant has a different root cause from every fix above, and none of them will resolve it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The macOS symptom is distinct: authentication succeeds, the app launches and restores your session, and then Chat fails. From the diagnostics in &lt;a href="https://github.com/openai/codex/issues/33463" rel="noopener noreferrer"&gt;openai/codex issue #33463&lt;/a&gt;, the system logs show:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;failed to do a bootstrap look-up: xpc_error=[3: No such process]
Could not find service "com.apple.devicecheckd" in domain for system

preauth_cookie_failed=APIClient.DeviceCheckError: Token generation failed
MobileActivation.ErrorDomain Code=-4 "UCRT is unavailable."
devicecheckd: Failed to fetch client certificate.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;One reporter confirmed no HTTP 401, no 403 and no TLS failures — the failure is after authentication, during initialisation. The Secure Enclave key generation and attestation steps succeed; what fails is MobileActivation supplying the client certificate DeviceCheck needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What resolved it in that thread:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A plain reboot&lt;/strong&gt;, for two reporters on an older app version.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Updating macOS and restarting.&lt;/strong&gt; One persistent case survived 26.5 → 26.6 and multiple app updates, then recovered on 26.6.1 with a restart. The logs flipped to &lt;code&gt;Performing UCRT OOB. Successfully performed UCRT OOB.&lt;/code&gt; and &lt;code&gt;devicecheckd&lt;/code&gt; immediately obtained new attestation certificates.&lt;/li&gt;
&lt;li&gt;That same reporter had also &lt;strong&gt;changed their Apple Account password&lt;/strong&gt; and could not tell which action fixed it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What did not help:&lt;/strong&gt; creating a new macOS user account (the failure followed), and toggling Find My.&lt;/p&gt;

&lt;p&gt;If you are hitting this, update macOS and restart first. It is an Apple-side certificate problem, so reinstalling ChatGPT is not the lever.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Do While It Is Broken
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Log in through a browser.&lt;/strong&gt; The web app does not require device attestation, which is exactly why it keeps working when the native app does not. Every community thread on this confirms the website is unaffected.&lt;/p&gt;

&lt;p&gt;If you signed up with email and password, do not try Google, Microsoft or Apple sign-in on the app — mixing methods causes its own separate failure. Use the same method you registered with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you need API access rather than the consumer app&lt;/strong&gt;, DeviceCheck is not in the path at all. API keys authenticate with a bearer token and never touch device attestation, so this class of error cannot occur:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.ofox.ai/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$OFOX_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "openai/gpt-5.6-sol",
    "messages": [{"role": "user", "content": "..."}]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a different product from the ChatGPT app, not a workaround for it — worth knowing only if what you actually needed was programmatic access.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Does Not Fix It
&lt;/h2&gt;

&lt;p&gt;Collected from threads where people tried these repeatedly without success, so you can skip them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reinstalling the app.&lt;/strong&gt; Frequently tried, rarely the fix, and on macOS it cannot be the fix because the problem is in Apple's certificate chain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password resets and account recovery.&lt;/strong&gt; Your credentials are never sent. The failure is upstream of them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switching Wi-Fi to cellular.&lt;/strong&gt; Occasionally helps if a network is genuinely blocking the attestation endpoint, but it is far down the list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrying immediately after a change.&lt;/strong&gt; Integrity verdicts cache for up to 24 hours. Clear app data or you are re-reading a stale result.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One more, for completeness: a firewall can cause this. One macOS user resolved it by allowing ChatGPT four specific connections in Little Snitch. If you run a per-app firewall, check it before anything else on this page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Errors
&lt;/h2&gt;

&lt;p&gt;If your problem is authentication rather than attestation, these are different failures with different fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ofox.ai/blog/codex-cli-401-unauthorized-fix-2026/" rel="noopener noreferrer"&gt;Codex CLI 401 Unauthorized&lt;/a&gt; — a real credential rejection, unlike DeviceCheck.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ofox.ai/blog/codex-command-not-found-fix-npm-install-2026/" rel="noopener noreferrer"&gt;&lt;code&gt;codex: command not found&lt;/code&gt; and EACCES&lt;/a&gt; — install-path problems, not login.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ofox.ai/blog/codex-failed-to-start-app-server-windows-2026/" rel="noopener noreferrer"&gt;Codex "failed to start app-server" on Windows&lt;/a&gt; — the Windows desktop equivalent of "the app will not start", with a completely separate cause list.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://help.openai.com/en/articles/9945489-something-went-wrong-please-make-sure-your-device-s-date-and-time-are-set-properly-check-that-your-internet-connection-is-stable-then-restart-the-app-and-try-again-devicecheckerror" rel="noopener noreferrer"&gt;OpenAI help article: DeviceCheckError&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex/issues/33463" rel="noopener noreferrer"&gt;openai/codex issue #33463&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.openai.com/t/when-i-log-in-to-chatgpt-i-am-prompted-for-a-login-failure-and-a-message-something-went-wrong-please-make-sure-your-devices-date-and-time-are-set-properly/508758" rel="noopener noreferrer"&gt;OpenAI Developer Community: login failure thread&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.openai.com/t/fix-for-network-error-cloudflare-403-504-on-iphone-worked-for-me/1379385" rel="noopener noreferrer"&gt;OpenAI Developer Community: Cloudflare 403/504 on iPhone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.openai.com/t/unable-to-log-into-chatgpt-mac-app/780030" rel="noopener noreferrer"&gt;OpenAI Developer Community: unable to log into ChatGPT Mac app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Official causes and the 24-hour integrity cache note are from OpenAI's help article. The macOS &lt;code&gt;devicecheckd&lt;/code&gt; / UCRT diagnostics and the recovery accounts are quoted from openai/codex issue #33463. Remaining fixes are drawn from OpenAI Developer Community threads where a reporter confirmed the fix worked; they are community reports rather than vendor-documented solutions, and none of this is our own reproduction — DeviceCheck failures depend on individual device state and cannot be reliably reproduced on demand.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What does DeviceCheck registration failed mean in ChatGPT?
&lt;/h3&gt;

&lt;p&gt;It means the app could not generate a device attestation token, so OpenAI cannot verify the device is genuine and blocks the login before your credentials are ever checked. DeviceCheck is Apple's device-integrity API and Play Integrity is the Android equivalent. The failure is about your device's relationship with Apple or Google, not about your OpenAI account, which is why the same account signs in fine in a browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does OpenAI tell me to check my date and time?
&lt;/h3&gt;

&lt;p&gt;Because attestation tokens are time-sensitive and a badly skewed clock will break them. That is a real cause but a rare one. In practice most reports come from a stale browser cache, a pending OS update, a modified device that fails integrity checks, or on macOS a broken devicecheckd certificate. Set the clock to automatic, then move on to the causes below rather than retrying.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I fix DeviceCheck error on iPhone?
&lt;/h3&gt;

&lt;p&gt;Clear the Safari and Chrome caches first. The ChatGPT app hands login to the system browser, so a poisoned browser cache breaks the app while the website still works. Then install any pending iOS update and restart; several reports trace the failure to a security update that could not install for lack of storage. If it persists, sign in through the browser and use a different sign-in method than the one that is failing.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I fix DeviceCheck error on Android?
&lt;/h3&gt;

&lt;p&gt;Switch your default browser and retry — reports resolve on Android by moving from Brave or a custom browser to Chrome, because login is handed to the default browser. Then clear the ChatGPT app cache and data, and clear Play Store and Play Services data. If the device is rooted, Play Integrity will fail by design; that is the cause, not a bug.&lt;/p&gt;

&lt;h3&gt;
  
  
  What causes DeviceCheck token generation is unavailable on macOS?
&lt;/h3&gt;

&lt;p&gt;A broken Apple attestation chain rather than anything in ChatGPT. In openai/codex issue #33463 the logs show devicecheckd failing to reach com.apple.devicecheckd, then MobileActivation error code -4, UCRT is unavailable, and Failed to fetch client certificate. Authentication itself succeeds with no 401 or 403; the failure happens after login during initialisation. Reporters recovered by updating macOS and restarting, one after refreshing the Apple Account password.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does a jailbroken or rooted device cause DeviceCheck errors?
&lt;/h3&gt;

&lt;p&gt;Yes, and OpenAI says so directly. Its help article lists device integrity as a cause and notes that rooting or jailbreaking may trigger the error. It also warns that integrity check results can be cached for up to 24 hours, so clear the app data before retrying or you will be testing against a stale verdict.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use ChatGPT while DeviceCheck is broken?
&lt;/h3&gt;

&lt;p&gt;Yes. Log in through a browser — the web app does not require device attestation, which is why it keeps working when the native app does not. If you need API access rather than the consumer app, an OpenAI-compatible gateway such as api.ofox.ai is unaffected because API keys do not go through DeviceCheck at all.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ofox.ai/blog/chatgpt-devicecheck-registration-failed-fix-2026/" rel="noopener noreferrer"&gt;ofox.ai/blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>openai</category>
      <category>troubleshooting</category>
    </item>
  </channel>
</rss>
