Microsoft is the only major LLM stack with a South Africa inference region. For enterprises constrained by POPIA, FSR, or DPSA cloud policy to keep prompts and grounding data inside the country, that's a deciding factor — but only if you pick the right Copilot surface and pin the deployment yourself. Here's what each one actually keeps in country, and where the model gets thin.
southafricanorth is the engine.Microsoft Copilot is an umbrella over six distinct products — M365 Copilot in Word and Outlook, Copilot Studio for custom agents, GitHub Copilot in your IDE, Power Platform Copilot inside Power Apps and Automate, Sales/Service Copilot in Dynamics 365, and the standalone Copilot Chat. Each one ships with its own data residency story. Only some of them keep South African prompts in South Africa.
Underneath all of them sits Azure OpenAI — the Microsoft-managed deployment of GPT-4o and friends. Microsoft runs Azure OpenAI in roughly twenty regions worldwide. southafricanorth (Johannesburg) is one of them, and it's the only Azure region in country that hosts OpenAI models. southafricawest (Cape Town) doesn't.
The pattern this skill node describes: a regulated South African workload uses Copilot as the assistant surface, but the underlying inference is pinned to a customer-owned Azure OpenAI resource in southafricanorth. Prompts, completions, conversation history, and grounding data all sit at rest in country. Anthropic, Google, and OpenAI direct can't do this in 2026 — none of them have a SA inference region. That's why this node exists.
southafricanorth ⬩South Africa's regulatory posture has tightened faster than the cloud market has localised. POPIA enforcement, SARB Directive 6, and the National Cloud Strategy all pull in the same direction — and only one major LLM vendor has the regional footprint to answer.
There is no single "Copilot for South Africa" SKU. There are three patterns, each suited to a different shape of workload. The choice between them is the substantive architecture decision — everything else is plumbing.
The off-the-shelf path. Set the tenant's preferredDataLocation to ZAF and Microsoft commits to storing mailbox content, OneDrive files, SharePoint sites, Teams chat, and Copilot prompt history at rest in the SA Geo. Disable Bing grounding, audit your plugins, and the Copilot button in Outlook is residency-defensible for most POPIA conversations. The LLM compute still runs in the Microsoft-managed global pool — that's the asterisk for SARB-strict workloads.
# Verify the tenant Geo Connect-MgGraph -Scopes "Organization.Read.All" Get-MgOrganization | Format-List DisplayName, ` @{n="Geo";e={$_.AdditionalProperties.preferredDataLocation}} # Expect: Geo : ZAF
The custom-agent path. Build a low-code agent in Copilot Studio, then point its generative answers and orchestration at an Azure OpenAI resource that you deployed in southafricanorth, in your subscription. That single configuration moves LLM inference into country — prompts, completions, tool-call traces, and conversation history all sit on infrastructure you control. The Power Platform environment must also be in the SA region; Dataverse follows the env.
# Provision Azure OpenAI in country az cognitiveservices account create \ --name aoai-imbila-sa \ --resource-group rg-copilot-sa \ --kind OpenAI --sku S0 \ --location southafricanorth \ --custom-domain aoai-imbila-sa az cognitiveservices account deployment create \ --resource-group rg-copilot-sa \ --name aoai-imbila-sa \ --deployment-name gpt-4o-za \ --model-name gpt-4o \ --model-version "2024-11-20" \ --sku-name Standard --sku-capacity 50
The headless path. No Copilot UX layer at all — your own application calls Azure OpenAI directly. From a Cloudflare Worker in the JNB colo this is the lowest-latency option (~20 ms p50) and the simplest to audit. Use it when the workload doesn't need the Copilot UX (custom React app, customer-facing chatbot, document-processing pipeline) and you'd rather own the prompt loop end to end. → Full implementation patterns: streaming, throttle, OAuth, KV cache.
// src/aoai.ts — Worker → SA-North Azure OpenAI const url = `${env.AZURE_OPENAI_ENDPOINT}/openai/deployments/${env.AZURE_OPENAI_DEPLOYMENT}/chat/completions?api-version=2025-01-01-preview`; const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'api-key': env.AZURE_OPENAI_KEY, }, body: JSON.stringify({ messages, temperature: 0.3, max_tokens: 800 }), }); // 429 = throttle. SA quota is tighter than US — handle it. if (res.status === 429) throw new ThrottleError();
Everyone claims data residency. Few have an inference region in the country to back it up. This is the same comparison a regulated SA buyer is going to do — show your work first.
| Vendor / Stack | SA inference region | Frontier models | Customer controls deployment | Notes |
|---|---|---|---|---|
| Microsoft Copilot + Azure OpenAI (SA North) | Yes | gpt-4o, embeddings | Yes | Region-pinned via Azure Policy. Reasoning models (o3, o1) still out of region. |
| OpenAI direct (api.openai.com) | No | All | No | No regional hosting. Data residency by contract only — fails POPIA s.72 strict reading. |
| Anthropic Claude (api.anthropic.com) | No | All | No | US-hosted. Same posture as OpenAI direct. |
| Google Gemini / Vertex | No | All (in supported regions) | Partial | GCP region africa-south1 exists but Gemini API is not deployed there as of 2026. |
| AWS Bedrock (af-south-1) | Partial | Subset (Claude Haiku, Llama) | Yes | Cape Town has Bedrock with limited model catalog. Frontier Claude models route via cross-region inference — leaves SA. |
| Self-hosted (Llama / Mistral via Ollama) | Yes | Open-weight only | Yes | Runs on whatever metal you point it at. Capable but trails frontier closed models on quality. |
These are the workloads we see asking the in-country question. Pattern-matched across recent Imbila and 2nth.ai engagements — no theory.
Account history, transaction queries, dispute triage. SARB Directive 6 + Banks Act push for in-country processing; Copilot Studio + BYO Azure OpenAI is the cleanest defensible path. Audit pack ships with the engagement.
Home Affairs, SARS, municipal services. National Cloud Strategy prefers in-country processing for citizen data. Azure SA North + GovZA-tenant Copilot Studio works; the alternative is on-prem open-source.
Special personal information demands the strict residency reading. M365 Copilot's transient global compute is usually a no — Copilot Studio + BYO is the working pattern. Deidentify upstream where possible.
Privileged communications + client PI. Most firms accept M365 Copilot for internal drafting once Bing grounding is off and DLP is configured; client-facing tooling moves to BYO.
Disciplinary records, payroll data, B-BBEE reporting all sit under POPIA s.26. M365 Copilot grounded in SharePoint policy libraries works once the tenant Geo is correct.
FAIS data + client portfolios are cross-border sensitive by FSCA convention. Direct Azure OpenAI in SA North called from a regional trading platform is the typical shape — see fin/capital-markets/trading-platforms.
South Africa wasn't a Microsoft cloud market until 2019. Six years later it's the only viable answer to a regulatory question that has only sharpened. Here's how the pieces landed.
preferredDataLocation = ZAF available for new tenants. Existing tenants begin a multi-week migration path.southafricanorth. The first time a frontier-class model is callable from SA infrastructure.af-south-1 or southafricanorth. The window for "we'll route to EU just for now" closes.Microsoft Copilot in country wins a specific class of decision. Force-fitting it elsewhere is expensive: Azure tax on workloads that didn't need residency, or a non-frontier model on a workload that did need reasoning.
Copilot in SA is rarely the whole architecture — it's the LLM substrate underneath an ERP integration, a compliance posture, or a Cloudflare-fronted web application. These are the adjacent nodes an agent should pull when it loads this context.
A working decision tree for any "we need an LLM, but it has to stay in South Africa" prompt. Use the three patterns in section 03 to route the user — M365 Copilot for tenant-grounded assistance, Copilot Studio + BYO for custom regulated agents, direct Azure OpenAI for headless workloads — and the gotchas in the underlying SKILL.md to avoid the silent fallbacks (Bing grounding, BYO quota exhaustion, mismatched Power env region).
When the agent-context API ships, this node will also expose the audit evidence pack template and the Azure Policy snippets for region pinning.
Microsoft's own docs are authoritative on residency commitments — read them, don't trust summaries. South African legal sources for the regulatory side. Skills tree links for the implementation depth.
Structured context bundle with the three configuration patterns, region-pinning policy snippets, and the audit evidence pack template. Shipping with the know.2nth.ai Worker API.