Skip to content

Browse catalog

Search catalog

[READY] Type a title, tag, or description.

NOTES // concept

Refusal as API contract

LAST_MODIFIED
2026.07.29
CATEGORY
concept

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

  1. Branch on stop_reason === "refusal" on every call.
  2. Retry on Opus 5 (or enable Anthropic’s beta automatic fallbacks).
  3. Account for billing: a request refused before any output is generated is not billed; 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 approved customers.

Full playbook: Claude Fable 5: refusals are an API contract, not an error.

claudefablerefusalsapi

Related_Notes