A 400 invalid_request_error normally means malformed JSON or a missing required field. But on the newest Claude models there is a second, sneakier category: requests that are perfectly well-formed and were valid on older models, yet are rejected by design on newer ones. If a model upgrade suddenly produces 400s, check these three rule changes before debugging your serialization code.
Rule 1: assistant prefill is gone on new models
Prefilling — ending your messages array with a partial assistant turn so the model continues from your words — was a popular trick for forcing output format. It is not supported on Claude Fable 5, Mythos 5 and Mythos Preview, Opus 4.8, 4.7, and 4.6, or Sonnet 4.6; such requests return a 400. Anthropic's migration advice is to use structured outputs (output_config.format with a JSON schema) for format control, direct "no preamble" instructions in the system prompt, or tool/enum classification patterns instead. If you have a prompt library that appends assistant stubs, this is the first thing to audit before any model upgrade.
Rule 2: sampling knobs are rejected, not ignored
Claude Fable 5, Mythos 5 and Mythos Preview, Opus 4.8, Opus 4.7, and Sonnet 5 reject non-default temperature, top_p, and top_k with a 400 error on every request — regardless of whether extended thinking is active. The models do not silently ignore the parameters; they refuse the call. The fix is simply to omit them.
The thinking configuration follows the same pattern. Manual extended thinking — thinking: {"type": "enabled", "budget_tokens": N} — returns a 400 on Fable 5, Mythos 5, Opus 4.8, Opus 4.7, and Sonnet 5. These models use adaptive thinking ({"type": "adaptive"}) instead, where the model decides how much to reason per request; depth is steered with the separate output_config.effort parameter rather than a token budget. Fable 5 goes one step further: thinking is always on, so even an explicit {"type": "disabled"} is rejected — omit the parameter entirely.
# Old (400 on Fable 5 / Opus 4.8 / Sonnet 5) # New
# temperature=0.7, # (omit sampling params)
# thinking={"type": "enabled", thinking={"type": "adaptive"},
# "budget_tokens": 8000}, output_config={"effort": "high"}
Rule 3: thinking blocks are tamper-evident
When a response contains thinking or redacted_thinking content blocks and you send the conversation back — for example, when returning tool results — those blocks must be passed back exactly as received. Modifying, reordering, or filtering the thinking blocks in the latest assistant message returns a 400. Each block carries a cryptographic signature field, so "harmless" edits like stripping whitespace or dropping an empty block are detected. On Fable 5 and Mythos 5, blocks can legitimately arrive with an empty thinking field (raw chain of thought is never returned); pass those back verbatim too, empty or not.
One related trap when switching models mid-conversation: thinking blocks from a different model in earlier turns should be stripped — other models silently ignore them but they still cost input tokens. The tamper rule applies to the latest assistant turn being continued, which is exactly where tool-use loops resend content.
error.message body, not just the status code — it usually tells you exactly which of the three rules you tripped.These rules travel with the model, not the platform
Because they are enforced by the model layer, the same 400s appear on all four platforms — Amazon Bedrock, Vertex AI, Microsoft Foundry, and Claude Platform on AWS — whenever you call an affected model. Microsoft's Foundry documentation, for instance, notes per-model thinking support (Fable 5 accepts only adaptive) matching the first-party behavior. A cross-platform migration won't save a prefill-dependent prompt; only a prompt rewrite will.
Where to go next
See temperature and sampling parameters for what the knobs did, thinking budgets for the manual-mode background, and the Fable 5 data-retention 400 for the one model-specific 400 that has nothing to do with your request body at all.