A refusal on Claude Fable 5 is a successful HTTP 200 with stop_reason: "refusal", not an exception. Code that treats every 200 as usable output is wrong on this tier. Anthropic shipped Fable 5 (claude-fable-5) on 2026-06-09 at $10/$50 per million tokens with a 1M context; the integration-breaking change is the classifier contract, not the price.
What to build
- Branch on
stop_reason === "refusal"on every call. - Retry on Opus 5 (or enable Anthropic’s beta automatic
fallbacks). - Account for billing: as of September 2026 a refusal before any output is free in most categories but billed for
bio,frontier_llm, andreasoning_extraction, and a mid-stream refusal bills the input plus streamed output; fallback credit covers the prompt-cache cost of the retry model.
const msg = await client.messages.create({
model: "claude-fable-5",
max_tokens: 4096,
messages,
});
if (msg.stop_reason === "refusal") {
// HTTP 200, not an exception. Retry on another Claude model.
return retryOn("claude-opus-5", messages);
}
Fable 5 is an escalation tier - move up only when Opus 5 is not enough, because the price doubles and refusal handling adds integration cost lower tiers do not have. Mythos 5 is the same model without classifiers, limited to verified organizations. Fable 5.1 (claude-fable-5-1, same price) has since superseded Fable 5 and keeps the same refusal contract.
Full playbook: Claude Fable 5: refusals are an API contract, not an error.