Multi-Platform Portability & Model Upgrades

Dual-Platform Rate-Limit Isolation: Exploiting Independent Token Pools

The same Claude model on two platforms draws from two unrelated quota pools. For bursty workloads, a second platform is a pressure-relief valve — if the router is built to spill, not to double-spend.

Claude 3P 101 · Updated July 2026 · Unofficial guide

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:

Rule of thumb: one primary, one spillover, spill only on 429, measure headroom locally per platform, and tag every request with the platform that served it so finance can reconcile two invoices without archaeology.

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.

Sources