Unknown inference location
Teams cannot always prove which GPU processed a request.
EU-contained AI routing
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.
The problem
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.
Teams cannot always prove which GPU processed a request.
Reliability logic can silently route traffic outside approved regions.
Debug logs, traces, analytics, or support tooling can expose sensitive content.
Compliance teams need evidence, not vendor marketing pages.
Inbound proof tools
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.
Score whether a workload can prove EU-contained inference without asking for sensitive content.
Score a workloadTest synthetic route facts against EU_HARD_BOUNDARY and see exact block reasons.
Inspect public route eligibility, evidence status, GPU country, and policy decision.
Review route statusVerify a signed sovereignty receipt without exposing prompt or completion bodies.
Verify a receiptChange the SDK base URL, send one request, and request a signed receipt.
Open the quickstartRun LangGraph, Agents SDK, Mastra, Spring AI, Rig, Eino, and more against EUBound.
Browse examplesRead /v1/public/routes, the same route-preview facts used by the route status page.
Post synthetic route facts to /v1/public/policy-dry-run without sending customer content to a model.
Explain why hosted in Europe is not enough for GPU location, fallbacks, logs, and support access.
Read the guideMap the proof loop to KYC, legal, insurance, fintech, and internal knowledge workflows.
Pick a use caseThe solution
EUBound turns AI data residency from a policy document into runtime enforcement.
Send requests to approved EU AI providers through one OpenAI-compatible API gateway.
Deny any provider, model, fallback, or data path that violates your EU-boundary policy.
Return a signed sovereignty receipt showing where and how each inference was processed.
How it works
Your application sends an OpenAI-compatible API request to EUBound.
EUBound verifies allowed GPU countries, provider status, logging rules, subprocessors, and fallback boundaries.
The request is sent only to a verified EU-located GPU route that satisfies the policy.
The response includes signed proof of the route, policy, provider, GPU country, fallback status, and logging status.
Developer experience
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
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.
Start from the public examples repository and copy the hosted runner commands.
Public examples repoStart the EU contract upstream and gateway with one wrapper script.
Local run commandUse your existing OpenAI client, same chat-completions shape, EUBound base URL.
First requestCheck the signed sovereignty receipt without revealing prompt or completion bodies.
Receipt verificationUse public route previews and synthetic policy dry-runs before any provider call.
Policy toolsLangGraph, Agents SDK, Mastra, Spring AI, Semantic Kernel, Rig, Eino, and more.
Framework commandsKnow what EUBound stores, what it never stores, and what to check before production.
Production checklistPublic examples repo
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
The hosted runner defaults to https://api.eubound.eu and exports compatible variables for framework examples and Rust API examples.
Set EUBOUND_API_KEY in your ignored .env. The hosted runner refuses the local development key.
Every command below is written so an external developer can copy it after cloning the public repo.
Quick start
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
Gateway root URL, for example http://127.0.0.1:18080. SDK clients usually append /v1.
Bearer token for the gateway. Local examples use a fixed alpha key; production keys belong in environment variables or secrets.
Model route, defaulting to mistral-small-alpha in the local contract stack.
First request
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." }
]
}'
Python, TypeScript, Java, C#, Go, and Rust examples all use the same gateway contract.
Set receipt to true when your integration needs explicit proof in the response.
If no route satisfies EU_HARD_BOUNDARY, the request is blocked before provider execution.
Receipts
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"
Includes policy, decision, provider route, GPU country, evidence hash, fallback status, no-body-logging facts, and signature metadata.
Use /receipts/verify to let reviewers verify a receipt ID without seeing customer content.
Audit stores metadata only. Prompt and completion text must not appear in receipt verification, audit logs, or tracing spans.
Policy and route tools
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"
}'
FR plus current evidence and EU-only boundaries should return allowed.
US, GB, CH, or unknown GPU country must return blocked reasons.
Use route status and policy dry-run for non-CLI reviewers.
Framework tutorials
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.
| Rank | Framework | Language | Example file | Run 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 |
| Rank | Framework | Language | Example file | Run 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
Do not log request bodies, provider response bodies, prompt text, completion text, uploaded files, or retrieved documents.
Associate API keys with the intended policy such as EU_HARD_BOUNDARY so fallback behavior cannot bypass review.
Persist receipt IDs and hashes as compliance evidence; do not duplicate sensitive prompts into audit tables.
Blocked requests are useful signals: missing evidence, stale provider facts, non-EU fallback risk, or unsupported content shapes.
Frameworks differ in content-part shape, base URL handling, and response parsing. Run the real example before wiring production traffic.
Run production gateway, observability, logs, caches, backups, and support artifacts on approved EU infrastructure.
Troubleshooting
Check the bearer token and make sure your framework is reading EUBOUND_API_KEY, not a provider-specific variable.
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.
Open policy dry-run and reproduce the route facts. Unknown means blocked by design.
Confirm your request asks for receipt: true and that the route was allowed.
Run the repository example first. Frameworks can send text content parts instead of plain strings.
Send the route-status page, policy dry-run result, and receipt verifier link instead of exposing customer content.
Framework examples
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.
Agent graph
examples/frameworks/python/langgraph_eubound.py
Agent SDK
examples/frameworks/python/openai_agents_sdk_eubound.py
Enterprise agent SDK
examples/frameworks/python/microsoft_agent_framework_eubound.py
Enterprise agent SDK
examples/frameworks/csharp/microsoft-agent-framework/Program.cs
Agent SDK
examples/frameworks/python/google_adk_eubound.py
Agent app framework
examples/frameworks/typescript/src/mastra.ts
Enterprise app framework
examples/frameworks/java/src/main/java/eubound/examples/SpringAiExample.java
LLM app framework
examples/frameworks/python/langchain_eubound.py
RAG framework
examples/frameworks/python/llamaindex_eubound.py
Multi-agent framework
examples/frameworks/python/crewai_eubound.py
Enterprise orchestration
examples/frameworks/python/semantic_kernel_eubound.py
Enterprise orchestration
examples/frameworks/csharp/semantic-kernel/Program.cs
JVM LLM framework
examples/frameworks/java/src/main/java/eubound/examples/LangChain4jExample.java
Rust agent framework
examples/frameworks/rust/rig-example/src/main.rs
Go agent framework
examples/frameworks/go/eino-eubound/main.go
Frontend/server AI SDK
examples/frameworks/typescript/src/vercel_ai_sdk.ts
Multi-agent framework
examples/frameworks/python/autogen_eubound.py
Request-level proof
Each successful request includes evidence of the selected route, policy decision, GPU location, fallback status, logging status, and provider route.
{
"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
EUBound evaluates every request against strict routing and data-boundary rules before inference.
GPU must be inside an EU member state. Customer content must not leave the EU.
Inference is allowed only on verified GPUs physically located in France.
Inference is allowed only on verified GPUs physically located in Germany.
Prompt and completion bodies are never stored by default.
Provider routing
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.
Use cases
Summarize cases, extract missing information, and prepare analyst-ready files without uncontrolled AI data paths.
Ship AI features while giving security, DPO, and procurement teams request-level residency proof.
Route contract review and document analysis through verified EU-contained inference.
Classify and summarize claim documents while enforcing EU-only processing.
Use AI over sensitive internal text while controlling provider routes and audit evidence.
Trust model
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.
Audit metadata can be stored without storing customer content.
If no approved EU route exists, the request is blocked.
Providers are evaluated per route, not blindly approved as a whole.
Each inference can be tied to a policy version and evidence bundle.
Early access
We are opening design-partner conversations with fintech, regtech, legaltech, insurance, and European B2B SaaS teams handling sensitive AI workflows.