Rate limits on Claude are enforced per platform, by that platform's own machinery. The first-party Claude API enforces requests-per-minute and token-per-minute limits per organization per model, using a token-bucket algorithm. Amazon Bedrock enforces AWS service quotas — and even tracks its two endpoints, bedrock-runtime and bedrock-mantle, against separate quota allocations for the same model. Vertex AI enforces Google Cloud quotas per model lineage and location, with the global endpoint and each multi-region endpoint as independent buckets. And Claude Platform on AWS explicitly uses a separate capacity pool from both the first-party API and Bedrock; Anthropic's docs note that workloads can run on multiple platforms and fail over between them. None of these pools know about each other.
That independence is the whole trick: an organization capped at N tokens per minute on one surface can, legitimately, provision the same model on a second surface and gain a second N — not by negotiating a bigger limit, but by having two meters.
The overflow router
The design is primary-plus-spillover, not load balancing. Send everything to the primary platform; only when it returns a 429 rate_limit_error does the router send that request to the secondary. This keeps the routing decision deterministic, keeps cache locality high on the primary, and makes cost attribution trivial.
from anthropic import Anthropic, AnthropicBedrockMantle, RateLimitError
primary = Anthropic() # 1P pool
overflow = AnthropicBedrockMantle(aws_region="us-east-1") # Bedrock pool
def create(params: dict):
try:
return primary.messages.create(model="claude-opus-4-8", **params)
except RateLimitError:
# Bedrock requires the prefixed model-ID form
return overflow.messages.create(
model="anthropic.claude-opus-4-8", **params)
Note the model-ID translation: the same request needs claude-opus-4-8 on the first-party API and anthropic.claude-opus-4-8 on Bedrock's current surface (Vertex would take the bare ID with AnthropicVertex(project_id="...", region="global")). In production, wrap this with a short circuit-breaker so a sustained 429 storm flips traffic for a cooldown period instead of paying a failed primary call per request, and honor the retry-after header the first-party API returns before sending the next request to the primary.
Not double-counting quota
Each platform reports its own headroom in its own dialect, and your router should read the local signals rather than keeping one global counter. The first-party API returns anthropic-ratelimit-* response headers showing the most restrictive limit currently in effect — and, cache-aware, doesn't count cache reads toward input TPM for most models. Bedrock's mantle endpoint likewise exempts cached input tokens from its input-TPM quota, but uses admission control that reserves input tokens plus max_tokens up front, so an inflated max_tokens burns Bedrock headroom in a way it doesn't on the first-party API (where OTPM counts only actually generated tokens). Vertex exposes quota through the console and monitoring metrics instead of response headers — and Google itself cautions that the console quota page's token usage can be inaccurate, recommending token_count metrics. Foundry returns no anthropic-ratelimit-* headers at all. Treat "remaining capacity" as a per-platform local measurement, never a shared number.
Not doubling costs
Overflow doesn't double spend by itself — each request is paid once, on whichever platform served it, and cloud marketplace list prices match first-party list prices. The real cost leaks are subtler:
- Cold caches on the secondary. Prompt caches don't follow requests across platforms; spilled traffic re-pays cache writes on the secondary. If overflow is more than occasional, keep the secondary's cache warm deliberately (see cache pre-warming).
- Racing instead of failing over. Never send the same request to both platforms and take the faster answer — that genuinely doubles cost. Spill only on a definitive 429.
- Retrying a request that already billed. Only spill on errors that mean "not served" (429, connection failures). A mid-stream error after tokens were generated needs idempotency care, not blind resubmission.
- Committed-spend asymmetry. Marketplace private offers and committed-use discounts are per-platform and don't transfer — Anthropic notes discounts don't move automatically even between Bedrock and Claude Platform on AWS. Route overflow toward whichever pool your commitments make cheapest.
Where to go next
See rate-limit headers and token-bucket behavior for the primary-pool mechanics, the separate P-AWS capacity pool for the lowest-friction second pool on AWS, and dual-run cost accounting for the finance side of this pattern.