LLM Data Residency and Sovereignty: A Provider by Region Matrix

Quick answer: Residency means the inference ran in a named place. Sovereignty means the data sits outside a foreign government's legal reach. As of August 2026 you can pin inference on the Claude API (inference_geo, US only), Google Cloud (multi-region us and eu), Bedrock (geographic inference profiles), Microsoft Foundry (Data Zones) and OpenAI (US, Europe and UAE), usually for a 10 percent to 1.1x premium. Abuse logging, safety classifiers and operational telemetry still cross the boundary on most of them.

Last updated: August 2026

A client asked us to sign off that their EU deployment was sovereign. They had bought a European endpoint, paid the premium for it, and had a signed data processing agreement in the folder. The inference really did run in the EU. The operator was still a US company that a US court can compel, the abuse classifier ran outside the boundary they thought they had bought, and their gateway had a global fallback route that nobody on the compliance side had ever seen. Three of those four facts were sitting in public vendor documentation.


That gap is what this page exists to close. Residency is a claim about geography: the accelerators that produced those tokens were in a named place. Sovereignty is a claim about legal reach: no foreign court or agency can order the operator to produce the data. You can buy the first without getting the second, and most teams that buy a regional endpoint do exactly that.


Below is the matrix, what each row costs, and the part every vendor page leaves out. Every claim was checked against primary vendor documentation or the official legal text on 11 August 2026. Region lists and prices move every quarter, so treat the verification date as the most important column.


Residency Is Not Sovereignty, and the Difference Is Legal


The US CLOUD Act amended the Stored Communications Act with 18 U.S.C. 2713, effective 23 March 2018. It requires a provider of electronic communication or remote computing service to preserve, back up or disclose customer content and records in its "possession, custody, or control", and says explicitly that this applies regardless of whether the data sits inside or outside the United States. Storing prompts in Frankfurt does not remove them from that reach if the entity holding them is a US parent or its subsidiary. So there are three postures, not two, and they cost very different amounts:



The AWS European Sovereign Cloud, generally available since January 2026 with its first Region in Brandenburg, is the clearest hyperscaler example of the third posture. It is a separate cloud partition with its own billing and IAM systems, managed through dedicated European legal entities established under German law, with managing directors who are EU citizens resident in the EU. AWS says technical controls built into the infrastructure prevent access from outside the EU, and that logical and physical access to systems inside the partition is restricted to qualified staff located in the EU. Bedrock and SageMaker are among the initial AI services. You need new accounts: you create a new root account for the partition and new IAM identities inside it, so existing AWS credentials do not reach it.


The Matrix: How You Pin, and What It Costs


Two things surprise people. The same model on two clouds gives you different residency controls, because the control belongs to the platform and not the model. And the price mechanics differ: one vendor applies a multiplier to every token category including cache reads, another adds a flat surcharge to non-global endpoints.


SurfaceHow you pinCost of pinningThe catch
Claude API (first party)inference_geo per request, plus allowed_inference_geos and default_inference_geo at workspace level1.1x across every token pricing category: input, output, cache writes and cache reads alikeOnly us and global exist. There is no EU or UAE geo. Workspace geo (storage, image transcoding, code execution) is US only and cannot be changed after creation
Claude in Amazon BedrockGlobal endpoint, a geography via a cross-Region inference profile (US, EU, JP, AU on the current surface; us., eu., apac. prefixes on the older InvokeModel one), or a single-Region callRegional endpoints carry a 10 percent premium over global. AWS states the same gap the other way round on the older surface: global profiles save roughly 10 percent against geographic onesCross-Region inference routes to Regions you never manually enabled on your account. And Bedrock's "EU" geography includes London and Zurich, so it is not a list of EU member states
Claude on Google Cloudregion set to global, a multi-region (us or eu), or a specific region10 percent premium on regional and multi-region, for Sonnet 4.5 and later; older models keep their previous pricingGlobal and multi-region only support pay as you go. Provisioned Throughput requires a regional endpoint. Single-region endpoints support Sonnet 4.6 and earlier; newer models are global or multi-region only
Claude in Microsoft FoundryUS Data Zone Standard deployment typeSame 1.1x multiplier as first-party US inferenceAnthropic HIPAA readiness is not available on this surface at all
Gemini on Google CloudGlobal, multi-region (us, eu) or regional endpointSeparate non-global rates took effect 1 July 2026 for generally available Gemini 3 and later. Gemini 3.5 Flash Standard on the Google Cloud pricing page, checked 11 Aug 2026: 1.50 USD per 1M input global against 1.65 USD non-global, 9.00 against 9.90 output. The same 1.1x ratio holds on cached inputGoogle positions the global endpoint as the option for workloads where residency is flexible; it carries no residency commitment. The EU multi-region covers EU member states and excludes the UK and Switzerland
OpenAI APIRegion selected on the project or organizationNo published per-token premium as of 11 Aug 2026Only the US, Europe (EEA plus Switzerland) and the UAE support regional processing of inference. In the other residency regions, content may be processed and temporarily stored outside the region. UAE selection needs additional approval
Azure and Microsoft FoundryDeployment type: GlobalStandard, DataZoneStandard, or Standard (single region)Priced per deployment type; provisioned variants exist for eachMicrosoft can add regions to a data zone "without prior notice". New deployment types launch Global first, then Data Zone, then single region, and single region has "no guaranteed availability date"
AWS European Sovereign CloudSeparate partition, separate accounts, Brandenburg RegionSeparate contract and pricing; not a flag on an existing accountOperational data such as internal system metrics may still leave the EU, by AWS's own disclosure

The Cost of Pinning Is Not Mostly Money


A 10 percent surcharge is a rounding error next to a compliance finding. The expensive part is the availability tax and the model lag.



Trying to get this past a proof of concept? Enterprise AI work rarely stalls on the model. It stalls on what sits underneath: retrieval that returns the wrong chunk, permissions that leak across tenants, and no agreed way to tell a good answer from a bad one. We build the pipeline, the access rules and the evaluation harness so the thing can actually go live.

Book an AI readiness call AI and ML services

What Still Leaves the Region When Inference Does Not


This is the section no vendor writes, because it undermines the thing they just sold you. None of it is secret. All of it is in the docs, several clicks past the marketing page.


What crosses the boundaryWhere it goesDocumented where
Inputs and outputs on named Bedrock modelsBedrock is zero retention and zero operator access by default, but named models are carved out. On Claude Fable 5 all inputs and outputs are retained up to 30 days, and using the model at all requires opting in to sharing that retained traffic with Anthropic for abuse detection and potential human review. On the named OpenAI models it is classifier-flagged traffic only, also up to 30 daysAmazon Bedrock abuse detection page
Whatever Bedrock does retain, under cross-Region inferenceStored in the destination Region, meaning wherever the request was actually processed, not your source Region. And cross-Region inference routes to Regions you never manually enabled on the accountAmazon Bedrock abuse detection page; cross-Region inference page
Content flagged by trust and safety automationRetained up to 2 years even under a zero data retention or HIPAA arrangementAnthropic API and data retention page
Abuse monitoring logsRetained up to 30 days by default, unless longer retention is required by law or is reasonably necessary to prevent harm. Under Safety Retention, classifier-flagged content can be retained and human-reviewed where OpenAI judges that necessary to investigate or prevent severe-risk activityOpenAI data controls guide
Content in storage-only residency regionsMay be processed and temporarily stored outside the region; only the US, Europe and UAE support regional inference processingOpenAI data residency documentation
Operational telemetry and system metricsMay leave the EU even from the AWS European Sovereign Cloud, to support capacity and security functionsAWS European Sovereign Cloud overview whitepaper

Read those rows together and a pattern falls out. The residency guarantee covers the happy path. The exceptions are all on the unhappy path: something got flagged, something failed over, something needed a human. Those are precisely the events a regulator will ask about.


Your Gateway Is the Real Compliance Boundary


Every serious deployment has a gateway in front of the models, and that gateway usually has retry and fallback logic written by someone optimizing for uptime. That logic is now a compliance control, whether or not anyone has told the compliance team. Two rules: check where the request actually ran rather than where you asked it to run, and fail closed instead of falling back across the boundary.


Python - pin the geo, verify the response, refuse to fall back across the boundary
# residency_gateway.py
# Requires: pip install anthropic
import os
import anthropic

BOUNDARY = os.environ.get("LLM_BOUNDARY", "us")   # "us" or "global"
ALLOWED = {
    "restricted": {"us"},          # PHI, PII, contract text
    "general": {"us", "global"},   # everything else
}

client = anthropic.Anthropic()   # reads ANTHROPIC_API_KEY


class ResidencyViolation(RuntimeError):
    pass


def ask(prompt, classification="restricted", model="claude-opus-5"):
    if BOUNDARY not in ALLOWED[classification]:
        raise ResidencyViolation(
            f"{classification} traffic may not run in {BOUNDARY}"
        )

    resp = client.messages.create(
        model=model,
        max_tokens=4096,                 # thinking is on by default on Opus 5
        inference_geo=BOUNDARY,          # Claude 4.6 and later; older models 400
        messages=[{"role": "user", "content": prompt}],
    )

    # Do not trust the request. Check where it actually ran.
    served_in = resp.usage.inference_geo
    if served_in not in ALLOWED[classification]:
        raise ResidencyViolation(
            f"asked for {BOUNDARY}, served from {served_in}, id={resp.id}"
        )

    # This log is your evidence. The vendor's marketing page is not.
    print(f"{resp.id}\t{classification}\t{BOUNDARY}\t{served_in}")
    return resp


if __name__ == "__main__":
    ask("Summarize the attached discharge note.", classification="restricted")

The resp.usage.inference_geo field exists precisely so you can audit this. On Bedrock or Google Cloud the equivalent is the inference profile ID or the endpoint hostname you called, and both belong in the log on every request, not sampled. But application-level checks are a good tripwire and a bad control, because someone will eventually ship a service that calls the SDK directly. Put the real boundary where a developer cannot route around it.


JSON (annotated) - AWS Service Control Policy and Azure Policy, both denying out-of-boundary inference
// Annotated for reading. Strip the // comments before you apply either document:
// neither AWS SCPs nor Azure Policy accept comments in JSON.

// AWS SCP: attach at the OU level. Two separate mechanics make this work.
// 1. A geographic (eu.) profile fails outright if ANY of its destination Regions
//    is denied here, even when your source Region is still allowed.
// 2. Global cross-Region inference does not report a real Region at all. AWS sets
//    aws:RequestedRegion to the literal string "unspecified", so leaving that
//    string out of the list below is exactly what blocks worldwide routing.
//    Adding it back, as plenty of teams do to stop the errors, silently re-opens it.
{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "DenyBedrockOutsideEU",
    "Effect": "Deny",
    "Action": [
      "bedrock:InvokeModel",
      "bedrock:InvokeModelWithResponseStream",
      "bedrock:CreateModelInvocationJob"
    ],
    "Resource": "*",
    "Condition": {
      "StringNotEquals": {
        "aws:RequestedRegion": [
          "eu-central-1", "eu-west-1", "eu-west-3", "eu-north-1"
        ]
      }
    }
  }]
}

// Azure Policy: block the Global deployment SKU in a regulated subscription.
// Repeat per SKU you want to forbid: GlobalStandard, GlobalProvisionedManaged,
// GlobalBatch, DeveloperTier.
{
  "mode": "All",
  "policyRule": {
    "if": {
      "allOf": [
        { "field": "type",
          "equals": "Microsoft.CognitiveServices/accounts/deployments" },
        { "field": "Microsoft.CognitiveServices/accounts/deployments/sku.name",
          "equals": "GlobalStandard" }
      ]
    },
    "then": { "effect": "deny" }
  }
}

The SCP behavior is worth dwelling on. AWS documents that if any destination Region in a cross-Region inference profile is blocked by your SCPs, the request fails even though other Regions are still allowed. Teams read that as a bug and add the Regions back. It is not a bug. It is the only way you find out that your "EU" traffic was riding a global profile.


Retention, Zero Retention and BAAs


The question that decides your timeline is not whether zero data retention exists. It is whether you can turn it on yourself or whether it needs a signature and a sales cycle.


SurfaceDefault retentionZero retention pathBAA path
Claude API (first party)Prompts and outputs not retained by default. Covered Models (Fable 5, Mythos 5) force 30-day retention and are not available under ZDR at allContract only, arranged through sales, enabled per organization. Not self-serve, and does not extend to new organizations automatically. A ZDR org can flip one workspace to 30-day retention to get at the Covered Models and leave every other workspace at zeroSelf-serve standard BAA in the Console for eligible orgs, or a negotiated BAA via sales. Once enabled it is permanent and org-wide
Amazon BedrockZero data retention and zero operator access by default, with named model exceptions retaining up to 30 daysDefault for most models; full ZDR on the exception models via your AWS account teamBedrock is a HIPAA eligible service under an executed AWS BAA
Claude on Bedrock or Google CloudGoverned by the cloud provider, who is the data processorGoverned by the cloud providerAnthropic's own HIPAA readiness does not apply here. You rely on the cloud provider's BAA
Claude Platform on AWS and Microsoft FoundryFollows first-party Claude API policy; Anthropic is the data processor on bothAvailable on request on Claude Platform on AWS through your Anthropic account rep. Anthropic publishes no equivalent path for FoundryAnthropic HIPAA readiness is not available on either
OpenAI APIAbuse monitoring logs up to 30 days by default, unless longer is required by law or reasonably necessary to prevent harmRequires prior approval by OpenAI. Once granted, set at organization or project level; it excludes content from abuse monitoring logs and forces the store parameter to false on the relevant endpointsBAA available for the API Platform without an enterprise agreement, covering the BAA-eligible endpoints
Azure and Microsoft FoundryGoverned by Azure per deployment type; data at rest stays in the designated Azure geographyManaged through Azure's own controlsCovered by the Microsoft BAA

One trap worth naming. On the Claude API, HIPAA readiness and ZDR are alternatives, not a stack. HIPAA readiness applies encryption, access control and audit logging across the PHI lifecycle instead of deleting immediately, and it blocks non-eligible features with a 400 rather than letting you drift. ZDR does not block anything: calling a non-eligible feature under ZDR just steps outside the arrangement for that data, silently. If you have PHI, take the BAA, not ZDR.


The Gulf and APAC Rows the EU-Centric Pages Skip


We deploy into the US, UK, Philippines and UAE, and the Gulf rows are where the aggregator posts fall apart, because they are copied from EU-first vendor pages.



One more legal wrinkle for the Gulf. The UAE PDPL, Federal Decree-Law No. 45 of 2021, in force since 2 January 2022, restricts cross-border transfer to jurisdictions the UAE Data Office has deemed adequate, or to a narrow set of other bases. It does not apply inside the DIFC or ADGM, which run their own regimes (DIFC Data Protection Law No. 5 of 2020 and the ADGM Data Protection Regulations 2021). A Dubai entity and a DIFC entity in the same group can be under different rules for the same prompt.


The Law You Are Buying Against


Numbers first, since they set the budget for the whole exercise. Under GDPR Article 83, the two fine tiers are up to 10 million EUR or 2 percent of total worldwide annual turnover, and up to 20 million EUR or 4 percent, whichever is higher in each case. Under EU AI Act Article 99, prohibited practices under Article 5 carry up to 35 million EUR or 7 percent of total worldwide annual turnover, other operator obligations up to 15 million EUR or 3 percent, and supplying incorrect or misleading information up to 7.5 million EUR or 1 percent.


On timing, Article 113 sets general application from 2 August 2026, with Chapters I and II applying from 2 February 2025 and the general-purpose AI, governance and penalties chapters from 2 August 2025. High-risk always ran on two tracks: Annex III stand-alone systems from 2 August 2026, and Annex I systems embedded in products already covered by EU product-safety law from 2 August 2027. The Digital Omnibus on AI moved both. Political agreement landed on 6 May 2026, the Parliament adopted it on 16 June, and it entered into force on 27 July 2026. The replacement deadlines are fixed calendar dates rather than the conditional trigger the Commission first proposed: 2 December 2027 for Annex III stand-alone high-risk systems, 2 August 2028 for the Annex I embedded ones.


Note what none of this says. Neither the GDPR nor the AI Act requires that inference run inside the EU. What the GDPR regulates is international transfer and the safeguards around it. Teams routinely conflate "we must comply with GDPR" with "we must pin to Frankfurt", buy the premium endpoint, and still have an unmapped transfer sitting in their abuse-logging path. Residency is one control among several, not the whole answer.


What Residency Does Not Give You



The Architecture I Would Actually Build


Two planes, split by data classification, not by team or by application. It is the recommendation I give on every engagement where this comes up, and it holds because it matches how the cost curve actually behaves.



The failure mode I see most often is the opposite: a team buys the strictest posture for 100 percent of traffic to make the policy simple, discovers six weeks later that the strict posture cannot do batch, or code execution, or the model the product team wanted, and quietly exempts those workloads one ticket at a time. Twelve months on they are paying the premium on the boring traffic and running the interesting traffic on default routing. That is worse than never having pinned anything, because the org now believes it is covered.


If you would not defend the exemption in front of a regulator, do not grant it. And if you would, then the strict tier was scoped wrong to begin with. Redo the classification, not the exemption list.


Verify It Yourself, Then Put It on a Calendar


Do not take this table into a design review without re-checking the rows you depend on. The two-minute version:


bash - enumerate what your endpoints actually do, per platform
#!/usr/bin/env bash
set -euo pipefail

# 1. Bedrock: find out which destination Regions a profile can actually route to.
#    List first. Do not hardcode a profile ID copied from a blog post: the
#    identifiers are dated and differ per model and per geography.
aws bedrock list-inference-profiles \
  --type-equals SYSTEM_DEFINED \
  --region eu-west-1 \
  --query 'inferenceProfileSummaries[].inferenceProfileId' --output text

#    Then read the destination Regions off the one you depend on. Each model ARN
#    carries the Region it lives in, so this is the real blast radius.
PROFILE_ID="eu.anthropic.example-profile-id"   # from the list above
aws bedrock get-inference-profile \
  --inference-profile-identifier "${PROFILE_ID}" \
  --region eu-west-1 \
  --query 'models[].modelArn' --output text

# 2. Google Cloud: call the EU multi-region host explicitly.
#    aiplatform.eu.rep.googleapis.com is the residency boundary,
#    aiplatform.googleapis.com/locations/global is not.
curl -sS -o /tmp/body.json -w '%{http_code} %{url_effective}\n' \
  "https://aiplatform.eu.rep.googleapis.com/v1/projects/${PROJECT_ID}/locations/eu/publishers/anthropic/models/claude-opus-5:rawPredict" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  -d '{"anthropic_version":"vertex-2023-10-16","max_tokens":64,
       "messages":[{"role":"user","content":"ping"}]}'

# 3. Claude API: confirm the served geo, not the requested one.
curl -sS https://api.anthropic.com/v1/messages \
  -H "x-api-key: ${ANTHROPIC_API_KEY}" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"claude-opus-5","max_tokens":64,"inference_geo":"us",
       "messages":[{"role":"user","content":"ping"}]}' \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['usage']['inference_geo'])"

# 4. Azure: prove no Global SKUs exist in the regulated subscription.
az cognitiveservices account deployment list \
  --name "${FOUNDRY_ACCOUNT}" --resource-group "${RG}" \
  --query "[].{name:name, sku:sku.name}" -o table

Then set a quarterly reminder against four pages: the provider's pricing page, its data residency page, its abuse and retention page, and its subprocessor list. Those four move independently. If nobody owns that reminder, delete the price column from your internal matrix and keep only the decision framework, because a stale price is worse than no price. That is the honest reason most published comparisons are wrong within a quarter, and it is why every row above carries a verification date.


Pranay Vatsal, Founder & CEO

Pranay Vatsal is the Founder & CEO of CelestInfo with deep expertise in Snowflake, data architecture, and building production-grade data systems for global enterprises.

Related Articles

Frequently Asked Questions

Q: Does EU data residency mean my data is outside US legal reach?

No. Under 18 U.S.C. 2713, added by the CLOUD Act in March 2018, a US provider must disclose customer content in its possession, custody or control regardless of whether that data sits inside or outside the United States. Running inference in Frankfurt satisfies a location requirement. It does not remove the provider from US jurisdiction. Only a separately incorporated local operator or self-hosting changes that.

Q: Where does OpenAI actually run inference for a regional deployment?

As of August 2026, OpenAI supports regional processing of inference in only three places: the United States, Europe (the EEA plus Switzerland) and the United Arab Emirates. Its other data residency regions, including the UK, Japan, India, Singapore, South Korea, Canada and Australia, are storage residency only, which means content may be processed and temporarily stored outside the region. Selecting the UAE requires additional approval from OpenAI.

Q: What does it cost to pin an LLM to a specific region?

Two different mechanics. On the Claude API, inference_geo set to us applies a 1.1x multiplier across base input, output, cache writes and cache reads, and burns 1.1 Priority Tier tokens per token of committed capacity. On Amazon Bedrock and Google Cloud, regional and multi-region endpoints carry a 10 percent premium over global. On Bedrock's older InvokeModel surface AWS frames the same gap in reverse, as global profiles saving roughly 10 percent against geographic ones. Checked against vendor documentation on 11 August 2026.

Q: Is zero data retention self-serve or does it need an enterprise agreement?

It depends on the provider. Anthropic ZDR is contract-gated: you arrange it through sales and it is enabled per organization, not automatically across your account. OpenAI ZDR requires prior approval before you can set it at organization or project level. Amazon Bedrock is zero retention and zero operator access by default, with named model exceptions: Claude Fable 5 retains all inputs and outputs for up to 30 days and requires you to opt in to sharing that traffic with Anthropic, while the named OpenAI models retain classifier-flagged traffic only.

Q: Which LLM providers will sign a HIPAA BAA?

Anthropic offers a standard BAA that eligible organizations can execute self-serve in the Console for the first-party Claude API, though not on Bedrock, Google Cloud, Claude Platform on AWS or Microsoft Foundry. OpenAI signs a BAA for the API Platform without requiring an enterprise agreement. Amazon Bedrock and Azure are covered under the respective cloud provider BAA as HIPAA eligible services.

Q: Can a regional LLM endpoint fall back to a global one under load?

Not on a properly pinned endpoint, but the risk sits one layer up. Bedrock global inference profiles route worldwide across supported commercial Regions, including ones you never manually enabled, and whatever Bedrock retains for abuse detection on the named models is stored in the destination Region rather than your source Region. Google Cloud's global endpoint carries no residency commitment. The realistic failure is your own gateway retrying a pinned call against a default endpoint.