EU-only inference
Keeping a request on providers in the EU is one field on llm.buzz, and it holds when a provider fails. Here are the EU providers and models live right now, the request to send, and what happens when no EU provider can answer.

Every number on this page comes from llm.buzz’s public catalog, read 27 October 2026, 05:52 UTC.
Many teams in Europe can use a hosted model only if the prompt stays in the EU. On llm.buzz that is one field in the request, provider.only, on every plan. It holds on failover too: a request kept on EU providers is never sent anywhere else.
EU providers right now
Each provider on llm.buzz serves from the EU or from outside it. These serve from the EU:
- Scaleway: 10 live models
- Simpleminds EU: 1 live model
- Surogate Spark: 1 live model
From the public providers list, read 27 October 2026, 05:52 UTC.
Models you can keep in the EU
Right now 11 models on llm.buzz have a live EU provider.
And 1 more model on the EU page.
From the public models list, read 27 October 2026, 05:52 UTC.
Your code can ask the same question. GET https://api.llm.buzz/api/v1/models?region=eu lists only the models with an EU provider, priced over those providers. It changes the listing, never how a call routes.
Find the EU tags
An EU provider’s tag ends in /eu. The endpoints route lists a model’s providers, each with its tag:
curl https://api.llm.buzz/api/v1/models/surogate/surogate3.7-flash/endpoints \
-H "Authorization: Bearer $LLM_BUZZ_KEY"Keep a request on EU providers
List the EU tags in provider.only. With the OpenAI SDK, the provider object goes in extra_body:
response = client.chat.completions.create(
model="surogate/surogate3.7-flash",
messages=[{"role": "user", "content": "Hello"}],
extra_body={"provider": {"only": ["simpleminds-eu/eu", "surogate-spark/eu"]}},
)Use the full tag, with /eu. A name matches a provider’s display name, its tag or the first part of its tag, ignoring case. So a name without /eu could also match a provider of the same name outside the EU, should one join, while the full tag matches only the EU one.
It fails closed
only is a filter, not a first choice. Failover moves within your list and never past it. If every provider you listed fails, you get the usual retryable 502 or 503, and the request is not sent anywhere else. Retry with backoff, and the retry is held to the same list.
If none of the names you list serves the model, the answer is 404 no_allowed_providers, its message names the providers that do serve the model, and nothing is sent to a provider. For a model without an EU provider, it looks like this:
{
"error": {
"code": 404,
"message": "No allowed providers are available for the selected model. Providers serving moonshotai/kimi-k3: llm.buzz, DeepInfra, Moonshot AI, Prime Intellect, Novita, Alibaba. Adjust provider.only, provider.ignore or provider.order, or remove them.",
"metadata": {
"error_type": "not_found",
"gateway_code": "no_allowed_providers",
"param": "provider"
}
}
}Send it from the first request
A request that continues an earlier one, a Responses previous_response_id or a reasoning continuation, can stay on the provider that served the first, whatever only says. Send only from the first request of a conversation, so the provider the conversation is tied to is already an EU one.
Ask for providers that keep nothing
Residency says where a prompt is processed. Each provider also declares whether it trains on prompts and how many days it keeps them. Two fields keep a request away from every provider whose declaration does not qualify, and they combine with only:
| Field | Providers that qualify |
|---|---|
provider.zdr: true | Declare that they keep prompts for 0 days. |
provider.data_collection: "deny" | Declare that they do not train on prompts and keep them for 0 days. |
A provider that has not declared a policy never qualifies. When no provider of the model qualifies, the answer is 404 model_not_available_under_data_policy, and nothing is sent to a provider.
An organization’s admin can set the same for every key on the console’s Prompt logs page: no training and no retention. It applies from the next request, and a request can tighten it but never loosen it.
Web search
llm.buzz runs no web search of its own today, so a web search never sends your prompt to a search service. What a request that asks for one gets, with :online, web_search_options or the web plugin, depends on how it is kept in the EU:
- A request you keep on EU providers with
provider.onlyis served without the search, and nothing is billed for it (Suffixes). - Every request of an organization llm.buzz keeps in the EU is refused with 400
web_search_unavailable_in_regionbefore any provider is called. Remove the search from the request.