OAuth Max 20x: bare 429 rate_limit_error on premium models without the Claude Code system block first — entitlement gate, not quota; headerless 429 indistinguishable from pushback

Status Open
Maintainer reply None cached
Activity 1 comment · opened Aug 17, 2026

Root cause (verified 17/08/2026, 5/5 alternating trials)

This is NOT a quota issue and NOT a provider outage. Anthropic's OAuth subscription entitlement gate refuses premium-model (claude-opus-5, claude-sonnet-5, etc.) inference unless the FIRST system block is verbatim:

You are Claude Code, Anthropic's official CLI for Claude.

Refusal = 429 {"type":"error","error":{"type":"rate_limit_error","message":"Error"}} with no anthropic-ratelimit-unified-* headers and no Retry-After. claude-haiku-4-5 is exempt from the gate (200 regardless of system), which is why a "premium-model shed" was misread.

Measured discriminator (same token, same IP, seconds apart — only system varying)

| Request shape | Result |
|---|---|
| no system block | 429 headerless |
| CC block first (array) | 200 + unified headers |
| CC block first + extra blocks after | 200 |
| CC block present but SECOND | 429 headerless |
| CC block as plain string | 200 |
| haiku, no system block | 200 |

anthropic-beta: oauth-2025-04-20 present or absent → no difference.

Reproduce

TOK=$(jq -r .claudeAiOauth.accessToken ~/.claude/.credentials.json)
# 429
curl -q -sS https://api.anthropic.com/v1/messages \
  -H "authorization: Bearer $TOK" -H "anthropic-version: 2023-06-01" -H "content-type: application/json" \
  -d '{"model":"claude-opus-5","max_tokens":1,"messages":[{"role":"user","content":"hi"}]}'
# 200
curl -q -sS https://api.anthropic.com/v1/messages \
  -H "authorization: Bearer $TOK" -H "anthropic-version: 2023-06-01" -H "content-type: application/json" \
  -d '{"model":"claude-opus-5","max_tokens":1,"system":[{"type":"text","text":"You are Claude Code, Anthropic'"'"'s official CLI for Claude."}],"messages":[{"role":"user","content":"hi"}]}'

The actionable complaint for Anthropic

The headerless 429 makes the entitlement refusal indistinguishable from real quota pushback: no retry-after, no anthropic-ratelimit-unified-* headers, message just "Error". Downstream clients (throttle proxies, orchestrators, raw SDK callers) cannot tell "your request is missing the entitlement marker" from "slow down" — so a probe without the system block is misread as budget pressure and triggers AIMD shrink / synthetic pauses on healthy allowed_warning accounts. This caused a cascade on the reporter's fleet (17/08): 3 system-block-less probes through the proxy → 429 → 2×30s synthetic pause → max_concurrent 5→1 on two accounts that were serving 200s.

Requested: either (a) include the unified/entitlement headers or a distinct error type on shape-gated 429s, or (b) document the gate so clients can carry the required system block.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗