ThinkFacility

Error messages

Invalid `signature` in `thinking` block. The block is bound to a different conversation.

The message

Invalid `signature` in `thinking` block. The block is bound to a different conversation.
Claude API as of September 22, 2026 read September 22, 2026AnthropicAPI errors

What it means

The Claude API rejects a thinking block you sent back when the conversation in front of it has changed. Editing an earlier message, the system prompt or the tools list invalidates that block and every thinking block after it.

What to do

Make the conversation append-only, so the system prompt, the tools and the earlier messages are the same ones the block was created under. If you can't, resend with thinking.block_binding.prefix_mismatch_behavior set to "drop_block" and the beta header.

You get this 400 when you send a thinking block back to Claude and something before that block has changed since Claude wrote it. The block carries a signature, and the signature covers the whole conversation up to that point.

Anthropic calls the feature preserved thinking, and it's there to stop people pulling a model's reasoning out to train on. Starting with Claude Fable 5.1, every thinking or redacted_thinking block you return gets checked for two things: that the current model can read it, and that nothing in front of it moved.

What counts as a change

The block's prefix is the top-level system prompt, the tools, and the messages before the block.

If the prefix differs from what you sent when the block was produced, that block and every later thinking block are invalid

From Preserved thinking

So the cause is usually a history you rewrite instead of append to. Trimming an old message to save tokens does it, and so does adding a tool or editing the system prompt halfway through a session.

Why it started happening to you

The prefix check runs by default for accounts created on or after August 31, 2026, 00:00 UTC. On older accounts the API only runs it when the request sets thinking.block_binding.prefix_mismatch_behavior, which is how the same code can run clean on your key and 400 on somebody else's. If people run your tool with their own API keys, they hit this before you do.

The two ways out

Append-only is the one that works everywhere. Keep the prefix a block was created under intact and send the block back inside it, and the check passes on any account.

When you can't, set prefix_mismatch_behavior. The default is "error", which rejects the request with a 400 invalid_request_error naming the first failing block. Set it to "drop_block" and the API drops each failing block and lets the request through. That setting needs a beta header, and the error says so when it's missing.

That setting requires the `thinking-binding-controls-2026-08-01` value in the `anthropic-beta` header.

From Preserved thinking

Don't retry the same body, because it fails the same way every time. Retry once with the beta header and "drop_block", and store that choice with the session. The message usually ends with a sentence naming what changed, and that sentence is the fastest route to the bug in your own code.

Lines that look like this one

A tampered or undecryptable signature returns the same first sentence with nothing after it about the conversation, and prefix_mismatch_behavior has no effect on it. A block the current model can't read is a quieter case: the API drops it from the request without an error at all, which is what happens when you switch models mid-conversation.

Send block_binding to a model that doesn't run the prefix check and you get a different 400, one whose message ends block_binding: Extra inputs are not permitted. The token counting endpoint runs the same prefix check and returns the same 400, so you can find this without spending the tokens.