EU-contained AI routing

EU GPU or no inference.

EUBound is an OpenAI-compatible API gateway that routes AI requests only to verified EU-located GPUs, blocks non-EU data paths and fallbacks, and returns signed proof for every inference.

Built for regulated European teams handling sensitive AI workloads. Start with a public tool, then switch one framework example to the EUBound base URL.

EUBound verified route A request passes through policy enforcement, routes to an EU GPU, and returns a signed receipt. OpenAI-compatible API app -> /v1/chat Policy gate EU_HARD_BOUNDARY FR verified GPU Fallback blocked outside EU Signed sovereignty receipt route + policy + GPU country + evidence hash

The problem

Your AI traffic can leave approved boundaries without anyone noticing.

Prompts, completions, embeddings, files, logs, traces, caches, and fallback requests can move across providers and regions. For regulated teams, "probably hosted in Europe" is not enough.

Unknown inference location

Teams cannot always prove which GPU processed a request.

Unsafe fallbacks

Reliability logic can silently route traffic outside approved regions.

Uncontrolled logs

Debug logs, traces, analytics, or support tooling can expose sensitive content.

No request-level proof

Compliance teams need evidence, not vendor marketing pages.

Inbound proof tools

Answer the buyer questions before the first call.

The public landing page is now a working proof hub: risk scoring, policy simulation, route status, receipt verification, implementation guides, and solution pages all use the same EU boundary language as the gateway.

AI sovereignty scorecard

Score whether a workload can prove EU-contained inference without asking for sensitive content.

Score a workload

Policy dry-run

Test synthetic route facts against EU_HARD_BOUNDARY and see exact block reasons.

Run the dry-run

Route status

Inspect public route eligibility, evidence status, GPU country, and policy decision.

Review route status

Receipt verifier

Verify a signed sovereignty receipt without exposing prompt or completion bodies.

Verify a receipt

OpenAI-compatible quickstart

Change the SDK base URL, send one request, and request a signed receipt.

Open the quickstart

Framework examples

Run LangGraph, Agents SDK, Mastra, Spring AI, Rig, Eino, and more against EUBound.

Browse examples

Public route API

Read /v1/public/routes, the same route-preview facts used by the route status page.

Open route JSON

Public policy API

Post synthetic route facts to /v1/public/policy-dry-run without sending customer content to a model.

Use policy API

Sovereignty guide

Explain why hosted in Europe is not enough for GPU location, fallbacks, logs, and support access.

Read the guide

Solution pages

Map the proof loop to KYC, legal, insurance, fintech, and internal knowledge workflows.

Pick a use case

The solution

Route. Block. Prove.

EUBound turns AI data residency from a policy document into runtime enforcement.

Route

Send requests to approved EU AI providers through one OpenAI-compatible API gateway.

Block

Deny any provider, model, fallback, or data path that violates your EU-boundary policy.

Prove

Return a signed sovereignty receipt showing where and how each inference was processed.

How it works

One API. Runtime policy. EU-contained route.

  1. Request arrives

    Your application sends an OpenAI-compatible API request to EUBound.

  2. Policy is checked

    EUBound verifies allowed GPU countries, provider status, logging rules, subprocessors, and fallback boundaries.

  3. Route is selected

    The request is sent only to a verified EU-located GPU route that satisfies the policy.

  4. Receipt is returned

    The response includes signed proof of the route, policy, provider, GPU country, fallback status, and logging status.

Developer experience

Change the base URL. Keep your OpenAI client.

EUBound is designed as a drop-in OpenAI-compatible API gateway for chat completions and embeddings.

from openai import OpenAI

client = OpenAI(
    api_key="eub_...",
    base_url="https://api.eubound.eu/v1"
)

response = client.chat.completions.create(
    model="eu:auto",
    messages=[
        {"role": "user", "content": "Summarize this KYC file."}
    ],
    extra_body={
        "policy": "EU_HARD_BOUNDARY",
        "receipt": True
    }
        )

Developer handbook

Everything a developer needs to go from evaluation to first signed receipt.

This landing page is intentionally documentation-heavy. It gives engineers, security reviewers, DPOs, and founders one coherent path: understand the invariant, run the local gateway, call the OpenAI-compatible API, verify the receipt, dry-run policy behavior, then plug the gateway into the framework they already use.

1. Clone examples

Start from the public examples repository and copy the hosted runner commands.

Public examples repo

2. Run locally

Start the EU contract upstream and gateway with one wrapper script.

Local run command

3. Send a request

Use your existing OpenAI client, same chat-completions shape, EUBound base URL.

First request

4. Verify proof

Check the signed sovereignty receipt without revealing prompt or completion bodies.

Receipt verification

5. Test policy

Use public route previews and synthetic policy dry-runs before any provider call.

Policy tools

6. Pick a framework

LangGraph, Agents SDK, Mastra, Spring AI, Semantic Kernel, Rig, Eino, and more.

Framework commands

7. Review safety

Know what EUBound stores, what it never stores, and what to check before production.

Production checklist

Public examples repo

Clone the open-source examples first.

The public mirror packages the framework tutorials, Rust API examples, docs, hosted runner, license, contribution notes, and security boundary without the private gateway source tree. Use the Git clone command when you want runnable files, or open the repository page from the browser.

git clone https://git.eubound.eu/eubound/eubound-examples.git
cd eubound-examples
sed -n '1,120p' START_HERE.md
find examples/frameworks -path '*/node_modules' -prune -o -type f -print | sort
cp .env.example .env
$EDITOR .env
examples/frameworks/scripts/run-hosted-eubound.sh \
  uv run --script examples/frameworks/python/langgraph_eubound.py
examples/frameworks/scripts/run-hosted-eubound.sh \
  cargo run -p eubound-api-examples --bin chat_with_receipt

Hosted base URL

The hosted runner defaults to https://api.eubound.eu and exports compatible variables for framework examples and Rust API examples.

Real beta key

Set EUBOUND_API_KEY in your ignored .env. The hosted runner refuses the local development key.

Copy-paste path

Every command below is written so an external developer can copy it after cloning the public repo.

Quick start

Run the local EU contract gateway.

The framework runner starts a local contract upstream on 127.0.0.1:18099, starts the EUBound gateway on 127.0.0.1:18080, exports the shared example variables, runs your child command, and shuts everything down cleanly.

examples/frameworks/scripts/run-local-eubound.sh \
  uv run --script examples/frameworks/python/langgraph_eubound.py

EUBOUND_API_BASE_URL

Gateway root URL, for example http://127.0.0.1:18080. SDK clients usually append /v1.

EUBOUND_API_KEY

Bearer token for the gateway. Local examples use a fixed alpha key; production keys belong in environment variables or secrets.

EUBOUND_MODEL

Model route, defaulting to mistral-small-alpha in the local contract stack.

First request

Use the OpenAI-compatible chat endpoint.

The minimum migration is the base URL and API key. Request bodies must not include secrets in logs or tracing. EUBound accepts text messages and returns a normal chat-completion response plus a signed sovereignty receipt.

curl -sS "$EUBOUND_API_BASE_URL/v1/chat/completions" \
  -H "authorization: Bearer $EUBOUND_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "model": "mistral-small-alpha",
    "receipt": true,
    "messages": [
      { "role": "user", "content": "Summarize the policy boundary in one sentence." }
    ]
  }'

Use SDK base URLs

Python, TypeScript, Java, C#, Go, and Rust examples all use the same gateway contract.

Ask for receipts

Set receipt to true when your integration needs explicit proof in the response.

Fail closed

If no route satisfies EU_HARD_BOUNDARY, the request is blocked before provider execution.

Receipts

Verify the proof artifact separately from the sensitive payload.

A receipt contains route and policy metadata, not prompt bodies or completion bodies. Store the receipt ID and hash in your compliance evidence flow; keep customer content in your own approved system.

curl -sS "$EUBOUND_API_BASE_URL/v1/sovereignty/receipts/<receipt_id>/verify"

Receipt payload

Includes policy, decision, provider route, GPU country, evidence hash, fallback status, no-body-logging facts, and signature metadata.

Verifier page

Use /receipts/verify to let reviewers verify a receipt ID without seeing customer content.

Audit boundary

Audit stores metadata only. Prompt and completion text must not appear in receipt verification, audit logs, or tracing spans.

Policy and route tools

Debug route eligibility before sending sensitive content.

Public tools let engineers and reviewers inspect policy behavior without provider credentials and without a real prompt. Unknown GPU country, non-EU GPU country, customer content leaving the EU, missing evidence, stale evidence, or non-EU subprocessors all block.

curl -sS "$EUBOUND_API_BASE_URL/v1/public/routes"
curl -sS "$EUBOUND_API_BASE_URL/v1/public/policy-dry-run" \
  -H "content-type: application/json" \
  -d '{
    "policy": "EU_HARD_BOUNDARY",
    "gpu_country": "FR",
    "content_boundary": "inside_eu",
    "operational_boundary": "inside_eu",
    "support_access": "eu_only",
    "subprocessor_boundary": "eu_only",
    "training_use": "prohibited",
    "evidence_status": "current"
  }'

Allowed smoke

FR plus current evidence and EU-only boundaries should return allowed.

Blocked smoke

US, GB, CH, or unknown GPU country must return blocked reasons.

Framework tutorials

Run the framework your product already depends on.

Each example points a real framework client at the same OpenAI-compatible EUBound contract. Start with the highest-signal stack for your team, then copy the base URL, model, and receipt verification pattern into your product. Full copy-paste source lives on the framework examples page.

RankFrameworkLanguageExample fileRun hosted beta
1 LangGraphAgent graph Python examples/frameworks/python/langgraph_eubound.py examples/frameworks/scripts/run-hosted-eubound.sh uv run --script examples/frameworks/python/langgraph_eubound.py
2 OpenAI Agents SDKAgent SDK Python examples/frameworks/python/openai_agents_sdk_eubound.py examples/frameworks/scripts/run-hosted-eubound.sh uv run --script examples/frameworks/python/openai_agents_sdk_eubound.py
3 Microsoft Agent FrameworkEnterprise agent SDK Python and C# examples/frameworks/python/microsoft_agent_framework_eubound.py examples/frameworks/scripts/run-hosted-eubound.sh uv run --script examples/frameworks/python/microsoft_agent_framework_eubound.py
3 Microsoft Agent FrameworkEnterprise agent SDK C# examples/frameworks/csharp/microsoft-agent-framework/Program.cs cd examples/frameworks/csharp/microsoft-agent-framework && ../../scripts/run-hosted-eubound.sh dotnet run
4 Google ADKAgent SDK Python examples/frameworks/python/google_adk_eubound.py examples/frameworks/scripts/run-hosted-eubound.sh uv run --script examples/frameworks/python/google_adk_eubound.py
5 MastraAgent app framework TypeScript examples/frameworks/typescript/src/mastra.ts cd examples/frameworks/typescript && ../scripts/run-hosted-eubound.sh npm run mastra
6 Spring AIEnterprise app framework Java examples/frameworks/java/src/main/java/eubound/examples/SpringAiExample.java cd examples/frameworks/java && ../scripts/run-hosted-eubound.sh mvn -q spring-boot:run -Dspring-boot.run.main-class=eubound.examples.SpringAiExample
7 LangChain / LangChain.jsLLM app framework Python examples/frameworks/python/langchain_eubound.py examples/frameworks/scripts/run-hosted-eubound.sh uv run --script examples/frameworks/python/langchain_eubound.py
8 LlamaIndexRAG framework Python examples/frameworks/python/llamaindex_eubound.py examples/frameworks/scripts/run-hosted-eubound.sh uv run --script examples/frameworks/python/llamaindex_eubound.py
9 CrewAIMulti-agent framework Python examples/frameworks/python/crewai_eubound.py examples/frameworks/scripts/run-hosted-eubound.sh uv run --script examples/frameworks/python/crewai_eubound.py
10 Semantic KernelEnterprise orchestration Python and C# examples/frameworks/python/semantic_kernel_eubound.py examples/frameworks/scripts/run-hosted-eubound.sh uv run --script examples/frameworks/python/semantic_kernel_eubound.py
10 Semantic KernelEnterprise orchestration C# examples/frameworks/csharp/semantic-kernel/Program.cs cd examples/frameworks/csharp/semantic-kernel && ../../scripts/run-hosted-eubound.sh dotnet run
11 LangChain4jJVM LLM framework Java examples/frameworks/java/src/main/java/eubound/examples/LangChain4jExample.java cd examples/frameworks/java && ../scripts/run-hosted-eubound.sh mvn -q compile exec:java -Dexec.mainClass=eubound.examples.LangChain4jExample
12 RigRust agent framework Rust examples/frameworks/rust/rig-example/src/main.rs cd examples/frameworks/rust/rig-example && ../../scripts/run-hosted-eubound.sh cargo run
13 Eino / Eino ADKGo agent framework Go examples/frameworks/go/eino-eubound/main.go cd examples/frameworks/go/eino-eubound && ../../scripts/run-hosted-eubound.sh go run .
14 Vercel AI SDKFrontend/server AI SDK TypeScript examples/frameworks/typescript/src/vercel_ai_sdk.ts cd examples/frameworks/typescript && ../scripts/run-hosted-eubound.sh npm run vercel-ai-sdk
15 AutoGenMulti-agent framework Python examples/frameworks/python/autogen_eubound.py examples/frameworks/scripts/run-hosted-eubound.sh uv run --script examples/frameworks/python/autogen_eubound.py
RankFrameworkLanguageExample fileRun locally
1 LangGraphAgent graph Python examples/frameworks/python/langgraph_eubound.py examples/frameworks/scripts/run-local-eubound.sh uv run --script examples/frameworks/python/langgraph_eubound.py
2 OpenAI Agents SDKAgent SDK Python examples/frameworks/python/openai_agents_sdk_eubound.py examples/frameworks/scripts/run-local-eubound.sh uv run --script examples/frameworks/python/openai_agents_sdk_eubound.py
3 Microsoft Agent FrameworkEnterprise agent SDK Python and C# examples/frameworks/python/microsoft_agent_framework_eubound.py examples/frameworks/scripts/run-local-eubound.sh uv run --script examples/frameworks/python/microsoft_agent_framework_eubound.py
3 Microsoft Agent FrameworkEnterprise agent SDK C# examples/frameworks/csharp/microsoft-agent-framework/Program.cs cd examples/frameworks/csharp/microsoft-agent-framework && ../../scripts/run-local-eubound.sh dotnet run
4 Google ADKAgent SDK Python examples/frameworks/python/google_adk_eubound.py examples/frameworks/scripts/run-local-eubound.sh uv run --script examples/frameworks/python/google_adk_eubound.py
5 MastraAgent app framework TypeScript examples/frameworks/typescript/src/mastra.ts cd examples/frameworks/typescript && ../scripts/run-local-eubound.sh npm run mastra
6 Spring AIEnterprise app framework Java examples/frameworks/java/src/main/java/eubound/examples/SpringAiExample.java cd examples/frameworks/java && ../scripts/run-local-eubound.sh mvn -q spring-boot:run -Dspring-boot.run.main-class=eubound.examples.SpringAiExample
7 LangChain / LangChain.jsLLM app framework Python examples/frameworks/python/langchain_eubound.py examples/frameworks/scripts/run-local-eubound.sh uv run --script examples/frameworks/python/langchain_eubound.py
8 LlamaIndexRAG framework Python examples/frameworks/python/llamaindex_eubound.py examples/frameworks/scripts/run-local-eubound.sh uv run --script examples/frameworks/python/llamaindex_eubound.py
9 CrewAIMulti-agent framework Python examples/frameworks/python/crewai_eubound.py examples/frameworks/scripts/run-local-eubound.sh uv run --script examples/frameworks/python/crewai_eubound.py
10 Semantic KernelEnterprise orchestration Python and C# examples/frameworks/python/semantic_kernel_eubound.py examples/frameworks/scripts/run-local-eubound.sh uv run --script examples/frameworks/python/semantic_kernel_eubound.py
10 Semantic KernelEnterprise orchestration C# examples/frameworks/csharp/semantic-kernel/Program.cs cd examples/frameworks/csharp/semantic-kernel && ../../scripts/run-local-eubound.sh dotnet run
11 LangChain4jJVM LLM framework Java examples/frameworks/java/src/main/java/eubound/examples/LangChain4jExample.java cd examples/frameworks/java && ../scripts/run-local-eubound.sh mvn -q compile exec:java -Dexec.mainClass=eubound.examples.LangChain4jExample
12 RigRust agent framework Rust examples/frameworks/rust/rig-example/src/main.rs cd examples/frameworks/rust/rig-example && ../../scripts/run-local-eubound.sh cargo run
13 Eino / Eino ADKGo agent framework Go examples/frameworks/go/eino-eubound/main.go cd examples/frameworks/go/eino-eubound && ../../scripts/run-local-eubound.sh go run .
14 Vercel AI SDKFrontend/server AI SDK TypeScript examples/frameworks/typescript/src/vercel_ai_sdk.ts cd examples/frameworks/typescript && ../scripts/run-local-eubound.sh npm run vercel-ai-sdk
15 AutoGenMulti-agent framework Python examples/frameworks/python/autogen_eubound.py examples/frameworks/scripts/run-local-eubound.sh uv run --script examples/frameworks/python/autogen_eubound.py

Production tips

Keep the sovereignty boundary intact when you move beyond the demo.

Do not log bodies

Do not log request bodies, provider response bodies, prompt text, completion text, uploaded files, or retrieved documents.

Pin policy per key

Associate API keys with the intended policy such as EU_HARD_BOUNDARY so fallback behavior cannot bypass review.

Store receipts separately

Persist receipt IDs and hashes as compliance evidence; do not duplicate sensitive prompts into audit tables.

Monitor blocked reasons

Blocked requests are useful signals: missing evidence, stale provider facts, non-EU fallback risk, or unsupported content shapes.

Verify framework adapters

Frameworks differ in content-part shape, base URL handling, and response parsing. Run the real example before wiring production traffic.

Use EU infrastructure

Run production gateway, observability, logs, caches, backups, and support artifacts on approved EU infrastructure.

Troubleshooting

Fast checks when something does not work.

401 or 403

Check the bearer token and make sure your framework is reading EUBOUND_API_KEY, not a provider-specific variable.

404 from SDK

Use gateway root for EUBOUND_API_BASE_URL and let the SDK append /v1, or set the SDK base URL directly to .../v1 depending on the client.

Blocked route

Open policy dry-run and reproduce the route facts. Unknown means blocked by design.

No receipt

Confirm your request asks for receipt: true and that the route was allowed.

Framework parse error

Run the repository example first. Frameworks can send text content parts instead of plain strings.

Reviewer needs proof

Send the route-status page, policy dry-run result, and receipt verifier link instead of exposing customer content.

Framework examples

Use the stack your team already ships.

Every current framework example points a real client at EUBound's OpenAI-compatible gateway contract. The examples run against the local EU contract gateway so developers can test receipts and policy behavior before production credentials exist.

#1Python

LangGraph

Agent graph

examples/frameworks/python/langgraph_eubound.py
#2Python

OpenAI Agents SDK

Agent SDK

examples/frameworks/python/openai_agents_sdk_eubound.py
#3Python and C#

Microsoft Agent Framework

Enterprise agent SDK

examples/frameworks/python/microsoft_agent_framework_eubound.py
#3C#

Microsoft Agent Framework

Enterprise agent SDK

examples/frameworks/csharp/microsoft-agent-framework/Program.cs
#4Python

Google ADK

Agent SDK

examples/frameworks/python/google_adk_eubound.py
#5TypeScript

Mastra

Agent app framework

examples/frameworks/typescript/src/mastra.ts
#6Java

Spring AI

Enterprise app framework

examples/frameworks/java/src/main/java/eubound/examples/SpringAiExample.java
#7Python

LangChain / LangChain.js

LLM app framework

examples/frameworks/python/langchain_eubound.py
#8Python

LlamaIndex

RAG framework

examples/frameworks/python/llamaindex_eubound.py
#9Python

CrewAI

Multi-agent framework

examples/frameworks/python/crewai_eubound.py
#10Python and C#

Semantic Kernel

Enterprise orchestration

examples/frameworks/python/semantic_kernel_eubound.py
#10C#

Semantic Kernel

Enterprise orchestration

examples/frameworks/csharp/semantic-kernel/Program.cs
#11Java

LangChain4j

JVM LLM framework

examples/frameworks/java/src/main/java/eubound/examples/LangChain4jExample.java
#12Rust

Rig

Rust agent framework

examples/frameworks/rust/rig-example/src/main.rs
#13Go

Eino / Eino ADK

Go agent framework

examples/frameworks/go/eino-eubound/main.go
#14TypeScript

Vercel AI SDK

Frontend/server AI SDK

examples/frameworks/typescript/src/vercel_ai_sdk.ts
#15Python

AutoGen

Multi-agent framework

examples/frameworks/python/autogen_eubound.py

Request-level proof

Every inference returns a signed sovereignty receipt.

Each successful request includes evidence of the selected route, policy decision, GPU location, fallback status, logging status, and provider route.

sovereignty_receipt.json signature verified
{
  "receipt_id": "rct_01JZ...",
  "policy": "EU_HARD_BOUNDARY",
  "decision": "allowed",
  "provider": "scaleway",
  "model": "eu:auto",
  "gpu_country": "FR",
  "customer_content_left_eu": false,
  "fallback_used": false,
  "prompt_body_logged": false,
  "completion_body_logged": false,
  "non_eu_content_subprocessor_used": false,
  "evidence_hash": "sha256:...",
  "signature": "ed25519:..."
}

Runtime policy

Your AI policy should run in production, not live in a PDF.

EUBound evaluates every request against strict routing and data-boundary rules before inference.

EU_HARD_BOUNDARY

GPU must be inside an EU member state. Customer content must not leave the EU.

FR_ONLY

Inference is allowed only on verified GPUs physically located in France.

DE_ONLY

Inference is allowed only on verified GPUs physically located in Germany.

NO_BODY_LOGGING

Prompt and completion bodies are never stored by default.

Provider routing

Built to route across verified EU AI providers.

EUBound integrates with EU AI providers route by route. A provider is not automatically approved; each route must satisfy policy evidence before it can handle traffic.

  • OVHcloud AI Endpoints
  • Scaleway Generative APIs
  • IONOS AI Model Hub
  • Mistral routes with verified EU-contained processing
  • Customer-hosted OpenAI-compatible endpoints

Use cases

For AI workflows that cannot leak across borders.

KYC and KYB

Summarize cases, extract missing information, and prepare analyst-ready files without uncontrolled AI data paths.

Fintech AI

Ship AI features while giving security, DPO, and procurement teams request-level residency proof.

Legal and contracts

Route contract review and document analysis through verified EU-contained inference.

Insurance claims

Classify and summarize claim documents while enforcing EU-only processing.

Internal knowledge

Use AI over sensitive internal text while controlling provider routes and audit evidence.

Trust model

Built for legal, security, and engineering review.

EUBound does not claim to make your organization compliant by itself. It provides runtime controls and request-level evidence to support your internal GDPR, AI Act, vendor-risk, and security governance workflows.

No prompt-body logging by default

Audit metadata can be stored without storing customer content.

Fail-closed routing

If no approved EU route exists, the request is blocked.

Route-level evidence

Providers are evaluated per route, not blindly approved as a whole.

Signed receipts

Each inference can be tied to a policy version and evidence bundle.

Early access

Need AI inference that stays inside the EU?

We are opening design-partner conversations with fintech, regtech, legaltech, insurance, and European B2B SaaS teams handling sensitive AI workflows.