Request migration linter
Paste a request, pick the model you’re moving to, and see every field that will be rejected or behave differently, with a fixed request.
Runs in your browser. Nothing you paste is uploaded.
messages.create, chat.completions.create and responses.create calls with literal values. It's checked in your browser.Checking…
Fixed request
26 rules, each from an official OpenAI or Anthropic page, last checked 2026-11-02. Browse every rule.
How to use it
- Paste the JSON body of an API request, or a Python or TypeScript SDK call (
messages.create,chat.completions.createorresponses.create) with literal values. - Pick the model you’re moving to. If the pasted model is retiring, its official replacement is preselected. For Claude, set your
anthropic-versionand anyanthropic-betaheaders. - Fix each finding, or copy the fixed request. Every rule quotes the official docs, so you can check it yourself.
How the linter works
The linter parses your request (or SDK call), works out which API it targets, and runs every rule for the model you pick. Each rule comes from an official OpenAI or Anthropic page and quotes it, with the date we last checked it. Where the docs quote the exact error message, we show it word for word; where they don’t, we say so instead of guessing.
Rules flagged Returns 400 are documented as HTTP 400. Rejected means the docs say the field isn’t supported or will raise an error, without naming a status code. Behavior change means the request still works but the output changes, such as Claude Sonnet 5.5 thinking by default.
What it can’t see: values held in variables, headers your SDK adds for you, and differences on Amazon Bedrock or Vertex AI. It checks the fields in a request and can’t tell whether your prompts still give good answers, so run your evaluation set on the new model as well. To find every place your code still calls a retiring model, use the deprecated model-ID scanner.
Sources
- Anthropic: Claude Sonnet 5.5 migration guide, Claude Haiku 5.5 migration guide, API version 2026-10-21 migration (checked 2026-11-02)
- OpenAI: Latest model guide, Reasoning guide, Upgrading to GPT-5.6, Chat Completions reference (checked 2026-11-02)
FAQ
Why does Claude Sonnet 5.5 return a 400 error for my request?
The most common causes are sampling parameters (temperature, top_p, top_k), an assistant prefill, a forced tool_choice (any or tool), thinking with budget_tokens or type: disabled, and a top-level output_format. Paste your request above to see which ones apply.
Does temperature still work on Claude?
Not on Claude Sonnet 5.5, and not on any model when you send anthropic-version: 2026-10-21, where temperature, top_p and top_k return a 400 even at their default values. Claude Haiku 5.5 docs say sampling parameters can return an error, so omit them there too.
How do I replace a forced tool_choice on Claude Sonnet 5.5?
Send tool_choice: {"type": "auto"}, mark the tool strict: true so its input matches the schema, and tell the model in the prompt when to call it. The linter’s fixed request does the first two for you.
Can I use function tools with GPT-6 on Chat Completions?
On GPT-6 Astra, GPT-6.1 Sol and GPT-6.1 Terra, tool calling requires the Responses API. GPT-6 Sol, GPT-6 Luna and GPT-5.6 support function tools on Chat Completions only with reasoning_effort: "none".
Is my request sent anywhere?
No. Parsing and checks run in your browser. Remove secrets anyway before pasting code.