Multi-Platform Portability & Model Upgrades

Request-Shape Differences Across All Four Platforms

The Claude request body is nearly identical everywhere. The two things that move around are the model identifier and the version marker — and knowing where each one lives per platform is most of what "portability" means in practice.

Claude 3P 101 · Updated July 2026 · Unofficial guide

If you send raw HTTP to Claude on more than one platform, you will hit the same two questions every time: where does the model ID go, and where does the version marker go? On the first-party Claude API, the model is a body field and the version is a header. Two of the four third-party platforms keep that shape exactly; the other two move things. This article lays the differences out side by side so you can write one adapter and stop rediscovering them.

The baseline: the first-party shape

A first-party Messages request puts model, max_tokens, and messages in the JSON body, and sends two mandatory headers: anthropic-version: 2023-06-01 and content-type: application/json (plus your auth header). Everything below is described as a delta from this shape.

Side by side

PlatformModel ID goes…Version markerEndpoint shape
Claude API (1P)Request body (model)Header anthropic-version: 2023-06-01api.anthropic.com/v1/messages
Claude Platform on AWSRequest body, bare 1P IDsHeader anthropic-version: 2023-06-01, plus anthropic-workspace-idaws-external-anthropic.{region}.api.aws/v1/...
Bedrock — current (Mantle)Request body, anthropic.-prefixed IDsStandard Anthropic request shapebedrock-mantle.{region}.api.aws/anthropic/v1/messages
Bedrock — legacy (InvokeModel)The InvokeModel call itself (ARN-versioned ID), not the JSON bodyBody field "anthropic_version": "bedrock-2023-05-31"bedrock-runtime InvokeModel / Converse
Vertex AIEndpoint URL, not the bodyBody field "anthropic_version": "vertex-2023-10-16"...publishers/anthropic/models/MODEL:rawPredict
Microsoft FoundryRequest body — the deployment name (defaults to the model ID)Header anthropic-version: 2023-06-01<resource>.services.ai.azure.com/anthropic/v1/messages

The three shapes, explained

Header-version, body-model (1P, Claude Platform on AWS, Bedrock Mantle, Foundry). These four surfaces all speak the standard Anthropic Messages shape. Claude Platform on AWS exposes the Claude API surface directly at /v1/... and additionally requires an anthropic-workspace-id header on every request — the SDK client sets it from configuration. Bedrock's current "Claude in Amazon Bedrock" surface serves the same body shape at its /anthropic/v1/messages path, with the one twist that model IDs carry the anthropic. prefix (see the prefix rule). Foundry keeps the standard shape too, but the model value is your deployment name, which merely defaults to the model ID — if someone named the deployment prod-sonnet, that string is what you send.

Body-version, model-in-URL (Vertex AI). Anthropic's Vertex documentation names exactly two differences from the first-party API: model is not passed in the request body (it goes in the endpoint URL), and anthropic_version is passed in the body — not as a header — and must be the string "vertex-2023-10-16". Streaming uses the same URL with :streamRawPredict instead of :rawPredict.

Body-version, model-as-parameter (legacy Bedrock). The legacy InvokeModel/Converse surface takes the model as an ARN-versioned identifier (for example global.anthropic.claude-opus-4-6-v1) on the AWS API call, and requires "anthropic_version": "bedrock-2023-05-31" inside the JSON body alongside max_tokens and messages. Streaming responses use AWS event-stream encoding rather than standard SSE. If you are still on this surface, upgrading to the Mantle surface removes most of the delta.

Rule of thumb: the version strings are not interchangeable. 2023-06-01 is a header value; bedrock-2023-05-31 and vertex-2023-10-16 are body values. Sending the wrong one — or the right one in the wrong place — is the most common failure when hand-porting curl commands between platforms.

Why this rarely bites SDK users

The provider-specific Python clients — AnthropicAWS(), AnthropicBedrockMantle(aws_region=...), AnthropicVertex(project_id=..., region=...), AnthropicFoundry(api_key=..., resource=...) — all expose the same client.messages.create(...) call and translate the request into the platform's wire shape for you, including moving the model into the Vertex URL and injecting version markers and extra headers. The differences resurface the moment you leave the SDK: raw curl, an API gateway that rewrites requests, a logging proxy, or a load test tool. Keep this table next to whatever component builds raw requests, and centralize model-ID translation in one place (see building a provider factory).

Where to go next

Pair this with the auth comparison — the other half of what differs between platforms — or start from the quickstart if you have not made a first call yet.

Sources