Short version: Claude data residency is two knobs, not one. inference_geo is a per-request API parameter that pins where the model runs — "us" keeps inference on US infrastructure, "global" (the default) runs it anywhere for availability. Workspace geo is a separate, create-time, currently-US-only setting that pins where your data is stored at rest and where endpoint processing happens. Flipping inference_geo to "us" costs you 1.1x on every token and satisfies the compute half of a residency requirement — but it does not, by itself, cover storage. If you set only the flag to pass an audit, you've paid the 10% and still left at-rest storage governed by your workspace default.
The one thing founders get wrong#
The pattern is common: a customer contract has a data-residency clause, an engineer finds inference_geo, sets it to "us", and marks the ticket done. That covers where inference runs — genuinely useful — but residency reviewers usually care about where data is stored and processed, and that is a different setting entirely.
Anthropic splits it deliberately into two independent controls:
inference_geo— controls where model inference runs, on a per-request basis. Set it on anyPOST /v1/messagescall, or configure a workspace default.- Workspace geo — controls where data is stored at rest and where endpoint processing (image transcoding, code execution) happens. It's chosen when you create a workspace, currently only supports
"us", and can't be changed afterward.
A complete US-only posture needs both. The flag alone moves the compute; the workspace setting moves the storage. Reach for one when you mean the other and you've either overpaid or under-delivered.
Setting inference_geo, in code#
It's one field. Pass inference_geo on the request and read usage.inference_geo on the response to confirm where it actually ran:
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
inference_geo="us", # or "global" (default)
messages=[{"role": "user", "content": "Summarize the key points of this document."}],
)
# Verify where inference ran — don't assume, check
print(response.usage.inference_geo) # -> "us"
const response = await client.messages.create({
model: "claude-opus-5",
max_tokens: 1024,
inference_geo: "us",
messages: [{ role: "user", content: "Summarize the key points of this document." }],
});
console.log(response.usage.inference_geo); // "us"
The response's usage.inference_geo is the receipt: it tells you where inference actually ran, which is what you want in your logs when someone asks you to prove it.
What it costs#
On Claude 4.6 and later, inference_geo: "us" is priced at 1.1x the standard rate across every token category — input, output, cache writes, and cache reads. "global" is standard price. So the cost isn't just on the tokens you generate; your prompt-cache reads get the 10% too, which matters for cache-heavy agent loops.
Two second-order effects worth knowing:
- Priority Tier burndown. If you hold a Priority Tier commitment, each token consumed with
inference_geo: "us"draws down 1.1 tokens against your committed TPM — the same way prompt-caching multipliers affect burndown. US-only inference eats your reserved throughput 10% faster, not just your dollar budget. - It stacks. The 1.1x is a multiplier on top of everything else, so it compounds with the model tier you picked. Before you flip it on globally, decide which requests actually need it — this is a per-request flag for a reason. Route only the regulated traffic through
"us"and leave the rest on"global", the same discipline you'd apply when routing across Opus, Sonnet, and Haiku or building a tiered model router.
The platform and model fine print#
Two constraints will bite if you don't check first:
- Model floor.
inference_geoworks on Claude 4.6 and later (Opus 5, Sonnet 5, and the current Haiku generation qualify). Send it to Opus 4.5, Sonnet 4.5, Haiku 4.5, or earlier and you get a 400 error — not a silent downgrade. If you route across a mix of old and new models, gate the parameter on model version. - Platform matrix. The flag is a first-party concept. It's supported on the Claude API and Claude Platform on AWS. On Amazon Bedrock and Google Cloud, the inference region comes from the endpoint URL or inference profile, so
inference_geodoesn't apply. On Microsoft Foundry, you use the US Data Zone Standard deployment type instead. And it's not available through the OpenAI SDK compatibility endpoint — if you're calling Claude through an OpenAI-shaped client to keep your code portable, you can't set it there.
For agent workloads there's one more: Claude Managed Agents don't support inference_geo, but they do respect the workspace geo. So for a Managed Agent, the residency lever is the workspace setting, not the per-request flag. If you run self-hosted sandboxes, tool execution and the sandbox filesystem stay on infrastructure you already control.
Enforcing it across a team#
Setting the flag per request is fine for one service; it doesn't scale to an org where any engineer can forget it. Two workspace-level controls close that gap, configurable in the Console or via the Admin API under data_residency:
allowed_inference_geos— the allowlist. A request asking for a geo that isn't on it errors out. This is how you make"us"mandatory rather than optional.default_inference_geo— the fallback used when a request omitsinference_geo. Individual calls can still override it.
If your organization opted out of global routing in the past, this already happened to you: your workspace was auto-migrated to allowed_inference_geos: ["us"] and default_inference_geo: "us", and every request keeps running on US infrastructure with no code change. Want the availability of global routing back? Add "global" to the allowed geos and set the default. Just remember the current limits: rate limits are shared across geos, only "us" and "global" exist, and workspace geo is US-only and permanent once set.
The founder read#
Treat inference_geo as what it is: a per-request switch for where the model runs, priced at a flat 10% on Claude 4.6+. Use it to route the specific traffic a contract requires onto US infrastructure — and log usage.inference_geo so you can prove it. But don't mistake it for a data-residency solution. Where your data lives at rest is workspace geo, a separate knob you pick once at workspace creation and can't change later. Get both right, pay the 10% only on the requests that need it, and you have a residency story that survives a compliance review — which, in the post–August 2 EU-transparency world, more of your enterprise customers are going to ask for.



