Opus 4.8 fast mode stops working on 30 November. Find every place it's switched on
After that date, a request for fast mode on Opus 4.8 is rejected. A short script finds the settings, workflows and API calls that still ask for it.

Fast mode for Claude Opus 4.8 is removed on 30 November 2026. It was deprecated on 30 October, and from the 30th the API rejects any Opus 4.8 request that asks for it. Nothing falls back to standard speed. Anthropic’s fast mode docs
give two exits for Claude Code: move to Opus 5.5 and keep fast mode, or run /fast off and stay on Opus 4.8 at standard speed. The same date applies to the Messages API
, where a request with model: "claude-opus-4-8" and speed: "fast" returns an error.
The deadline is easy to miss because the setting rarely lives in one place. It sits in a personal settings file, a team’s checked-in .claude/settings.json, a CI workflow that calls claude -p, and an SDK call someone added for a latency-sensitive feature in the spring. The people who’d notice the failure are whoever owns the nightly job. This is the same shape as the Opus 4.7 fast mode removal on 24 July, which the docs say was deprecated on 25 June.
What stops, and what doesn’t
Opus 4.8 itself keeps working at standard speed. Only the combination of that model and fast mode ends. That distinction matters for how you search: a repository that mentions claude-opus-4-8 is fine unless something in the same request path also asks for speed.
Fast mode isn’t a different model. The docs describe it as the same Opus with a different API configuration, up to 2.5x faster in output tokens per second, at a higher price per token. The speed gain is in output rate, not time to first token, so a job that mostly waits on a long prompt won’t feel much difference either way.
Pricing, from the API docs, per million tokens in fast mode:
| Model | Input | Output |
|---|---|---|
| Opus 5.5 | $8 | $40 |
| Opus 5 and Opus 4.8 | $10 | $50 |
So the migration target is cheaper per fast-mode token than what it replaces. Anthropic doesn’t say whether that makes a given workload cheaper overall, because Opus 5.5 is a different model with its own token usage. Treat the table as a price list, not a saving, and measure a real task on both. The Opus 5.5 pricing and coding post covers the model itself.
Where it hides
Four places cover nearly every case.
- Claude Code settings:
"fastMode": truein a user, project or managed settings file, usually beside amodelthat pins Opus 4.8. SettingfastModeon a model that doesn’t support it just leaves you at standard speed, so the failure only appears when the model is Opus 4.8. - Headless runs:
claude -p --settings '{"fastMode": true}'. The docs say/fastworks in a-psession only when it was launched with fast mode in its--settingsvalue, so a CI step that has this string is deliberately opting in. - Environment:
ANTHROPIC_MODELoutranks themodelsetting, andANTHROPIC_DEFAULT_OPUS_MODELchanges what theopusalias means. A repository that never namesclaude-opus-4-8can still run on it through a CI variable. - API code:
speed: "fast"on a Messages request, or on the model object of a Managed Agents definition, plus theanthropic-beta: fast-mode-2026-02-01header that Opus 5 and Opus 4.8 need.
The audit script
A search for the model id alone produces noise, and a search for fastMode alone misses the pairing. This script reports lines that mention either, and flags a file when it contains both. It’s a heuristic: it looks per file, not per request, so read each hit.
#!/usr/bin/env python3
"""List places where Opus 4.8 and fast mode meet. Usage: fastmode_audit.py [root]"""
import pathlib, re, sys
root = pathlib.Path(sys.argv[1] if len(sys.argv) > 1 else ".")
SKIP = {".git", "node_modules", "bin", "obj", "dist"}
MODEL = re.compile(r"opus-4-8|opus 4\.8", re.I)
FAST = re.compile(
r"""["']?fastMode["']?\s*[:=]\s*true|speed["']?\s*[:=]\s*["']fast"""
r"""|fast-mode-2026-02-01|/fast\s+on""",
re.I,
)
exit_code = 0
for path in sorted(root.rglob("*")):
if not path.is_file() or SKIP & set(path.parts):
continue
try:
lines = path.read_text(encoding="utf-8").splitlines()
except (UnicodeDecodeError, OSError):
continue
text = "\n".join(lines)
for n, line in enumerate(lines, 1):
tags = []
if MODEL.search(line):
tags.append("opus-4.8")
if FAST.search(line):
tags.append("fast")
if tags:
print(f"{path}:{n}: [{'+'.join(tags)}] {line.strip()}")
if MODEL.search(text) and FAST.search(text):
print(f" -> BREAKS ON 30 NOVEMBER: {path} pins Opus 4.8 and asks for fast mode")
exit_code = 1
sys.exit(exit_code)
Pointed at a small repository with a settings file, a workflow, one API call that asks for fast mode and one that doesn’t, it prints:
repo/.claude/settings.json:2: [opus-4.8] "model": "claude-opus-4-8",
repo/.claude/settings.json:3: [fast] "fastMode": true
-> BREAKS ON 30 NOVEMBER: repo/.claude/settings.json pins Opus 4.8 and asks for fast mode
repo/.github/workflows/review.yml:4: [opus-4.8+fast] - run: claude -p --model claude-opus-4-8 --settings '{"fastMode": true}' "review the diff"
-> BREAKS ON 30 NOVEMBER: repo/.github/workflows/review.yml pins Opus 4.8 and asks for fast mode
repo/src/client.ts:2: [opus-4.8] model: "claude-opus-4-8",
repo/src/client.ts:4: [fast] speed: "fast",
repo/src/client.ts:6: [fast] }, { headers: { "anthropic-beta": "fast-mode-2026-02-01" } });
-> BREAKS ON 30 NOVEMBER: repo/src/client.ts pins Opus 4.8 and asks for fast mode
repo/src/summary.ts:1: [opus-4.8] const res = await client.messages.create({ model: "claude-opus-4-8", max_tokens: 512, messages });
The last line is the point. summary.ts uses Opus 4.8 at standard speed, gets no flag, and needs no change. Exit code 1 means at least one file is affected, so it can also run as a CI step until the date passes.
The script can’t see your user-level ~/.claude/settings.json, shell profiles, secrets stores or a claude invocation built from a variable. Run it against those paths too, and run /fast in an interactive session: it reports whether fast mode is on.
Making the change
For Claude Code, the interactive fix is /model to Opus 5.5. The docs say fast mode stays on after the switch and that Opus 5.5 needs Claude Code v2.1.280 or later. If a new session still starts on Opus 4.8, something with higher priority is setting the model: a project or managed model value, or ANTHROPIC_MODEL in the shell. The startup header names the file when project or managed settings are the cause.
For files in the repository, change the model id and leave fastMode alone:
{
"model": "claude-opus-5-5",
"fastMode": true
}
If the job is a long unattended run where speed doesn’t pay for itself, the better edit is removing fastMode instead. The docs list long autonomous tasks, batch work and CI pipelines under standard mode, and the Batch API doesn’t support fast mode at all.
For API code, change the model and keep speed. Opus 5.5 doesn’t need the beta header, which only Opus 5 and Opus 4.8 require, so the header can go. Then check what you actually got, because the response reports it in usage.speed:
const res = await client.messages.create({
model: "claude-opus-5-5",
max_tokens: 1024,
speed: "fast",
messages,
});
if (res.usage.speed !== "fast") {
logger.warn({ speed: res.usage.speed }, "fast mode not applied");
}
That snippet follows the API docs and wasn’t run against the live API. Fast mode has its own rate limit, separate from standard Opus. On a 429 the docs suggest catching the error and retrying without speed, with one cost: fast and standard requests don’t share prompt caches.
What changes besides the id
Opus 5.5 isn’t Opus 4.8 with a faster lane. Output style, tool-call behaviour and token usage can differ, so run your own evaluation set or a handful of real tasks on the new id before the deadline, not after. Cache behaviour also bites on the switch. The docs say the first time fast mode is enabled in a conversation, you pay the full fast mode uncached input price for the whole context, and each later speed switch re-reads part or all of it uncached. Switch at the start of a session, not in the middle of a long one.
Subscription users should also know that fast mode on Pro, Max and Ultra plans draws on usage credits, not the plan’s included usage, and that Team and Enterprise organisations need an Owner to enable it first. A move to Opus 5.5 doesn’t change that.
Run the script against every repository and CI configuration you own this week. For the ones it flags, decide per job whether the speed was worth the price, then change the model or delete the flag. That takes less time than finding out on 30 November which nightly job has been failing.