400 invalid_request_error

400 invalid_request_error on Claude Fable 5

Either your payload carries a parameter Fable 5 removed, or your organization's data retention setting blocks the model entirely.

The 30-second version

Most Fable 5 400s come from parameters that newer Claude models no longer accept: non-default temperature, top_p or top_k, assistant message prefill, thinking type disabled, and manual extended thinking with budget_tokens. The other family of 400s is organizational: Fable 5 requires 30-day data retention, and an organization configured below that gets a 400 on every single request regardless of payload.

What triggers a 400 on Fable 5

Read the error message first. It names the offending field, and for thinking block errors it also names the block position.

  • A prefilled assistant message

    Claude 4.6 and later models do not support prefilling the assistant turn. Ending the messages array with an assistant message returns 400 with a message stating the conversation must end with a user message. Use structured outputs, output_config.format, or system prompt instructions instead.

  • Organization data retention below 30 days

    Fable 5 is a Covered Model requiring 30-day data retention and is not available under zero data retention. On the Claude API, a request from an organization whose retention configuration does not meet this requirement returns 400 invalid_request_error. The symptom is that every request fails identically, including a minimal hello-world payload.

  • Thinking blocks that were edited or filtered

    If the latest assistant message contains thinking or redacted_thinking blocks that were reordered, filtered out or reconstructed before being sent back, the request returns 400. The message starts with the position of the offending block, for example messages.1.content.0.

  • temperature, top_p or top_k set to a non-default value

    Setting any of these to a non-default value returns 400. This is not Fable-specific: it has applied since Claude Opus 4.7 and covers Sonnet 5, Opus 5 and Fable 5. The SDK request types still define the fields for compatibility with older models, so the code compiles and the API rejects it server-side.

  • A thinking configuration Fable 5 does not accept

    Adaptive thinking is always on. Both thinking type disabled and manual extended thinking with a budget_tokens value return 400. The error message for the disabled case suggests thinking.type.enabled, but that form is rejected on Fable 5 too, so the fix is to omit the thinking parameter entirely.

Fix in this order

One diagnostic first: if a minimal request also fails, stop debugging your payload and go check the organization setting.

  1. 1

    3. Fix retention at the organization or workspace level

    If your organization has a zero data retention arrangement, you can still enable 30-day retention for a single workspace under Privacy controls in the Console workspace settings, leaving every other workspace at zero retention. Otherwise contact your Anthropic account team.

  2. 2

    4. Pass thinking blocks back byte-for-byte

    With tool use, return every thinking and redacted_thinking block from the assistant turn exactly as received, including blocks whose thinking field is empty. If your code filters content blocks by type before resending, add both block types to the allowlist.

  3. 3

    1. Send a minimal request to split payload from account

    Send a one-line user message with only model and max_tokens set. If that succeeds, the problem is in your payload. If it fails with the same 400, the problem is your organization's data retention configuration and no payload change will help.

  4. 4

    2. Remove the parameters Fable 5 rejects

    Delete temperature, top_p and top_k from the request rather than setting them to a default value. Delete the whole thinking object rather than trying another type. Delete any trailing assistant message used for prefill.

Not a 400 after all?

If the response is HTTP 200 with an empty content array, you are looking at a classifier refusal rather than an invalid request. It needs entirely different handling.

Frequently asked questions