Provider errors (503, 401, 400, 404)
Diagnose provider_unavailable, no_upstream_credential, upstream_provider_header_invalid, bedrock_credential_missing, and embeddings_not_supported_for_provider.
Five errors tell you something about the provider behind your request. They look similar and mean very different things, so start here.
| Response | What it means |
|---|---|
503 provider_unavailable | Sentisec does not carry traffic for that provider. |
401 / 402 no_upstream_credential | The provider is available; this workspace has no key for it. |
400 upstream_provider_header_invalid | The provider name you sent is not one Sentisec knows. |
400 bedrock_credential_missing | The model id is an Amazon Bedrock id and no stored key can serve it. |
404 embeddings_not_supported_for_provider | That vendor has no OpenAI-shaped embeddings endpoint. |
None of these is an authentication failure on your Sentisec key β
that is a plain 401 unauthorized before any provider is chosen.
503 provider_unavailable
{
"error": "provider_unavailable",
"provider": "azure"
}Sentisec resolved your request to a provider it does not carry. Adding a credential will not change this β there is no upstream to send it to.
Sentisec carries Anthropic, OpenAI, Amazon Bedrock, Google Gemini, Google Vertex AI, and Kimi (Moonshot K2). Azure OpenAI is not available yet.
Fix: switch to one of the six, or tell us what you need. Full list and setup: Providers.
401 / 402 no_upstream_credential
{
"error": "no_upstream_credential",
"provider": "gemini"
}Sentisec carries this provider, but your workspace has no usable key
stored for it. (The status is 401 on the OpenAI-shaped routes and
402 on the Anthropic Messages route β same meaning.)
Fix: open the failed request under Requests in the
dashboard. Its row shows No provider key
with an Add β¦ key action that opens Settings β Providers with
that provider selected under Provider keys; add the key and retry. It takes effect on the
next request; nothing restarts. The direct link is
/w/<workspace-id>/settings/upstreams?provider=<provider>.
Read the provider status
The Provider keys section of Settings β Providers shows a status per provider:
| Status | Meaning | What to do |
|---|---|---|
active | A credential resolves and the provider is carried. Requests should dispatch. | Nothing. |
missing_key | The provider is carried but no credential resolves for this workspace. | Paste a key. |
not_configured | Nothing stored, nothing carried. | Paste a key if the provider is one of the six above. |
configured | A credential is stored for a provider Sentisec does not carry yet. | Use an available provider. |
If a credential you just saved shows missing_key, the stored value
could not be read back β re-paste it. If it shows active but requests
still fail with the vendor's own 401, the key was revoked or is out
of quota at the vendor; rotate it there and re-paste.
400 upstream_provider_header_invalid
{
"error": "upstream_provider_header_invalid",
"value": "gemeni"
}The X-Sentisec-Upstream-Provider header value is not a provider name
Sentisec recognises. It is almost always a typo.
Valid values for the providers that carry traffic: anthropic,
openai, bedrock, gemini, vertex, kimi.
404 embeddings_not_supported_for_provider
{
"error": "embeddings_not_supported_for_provider",
"provider": "anthropic"
}POST .../v1/embeddings is served by OpenAI and Google Gemini
(gemini-embedding-001). Every other provider β including Amazon
Bedrock and Vertex β returns this 404, because the vendor does not
expose an OpenAI-shaped embeddings endpoint on this path. No
configuration changes that.
Fix: send embeddings to OpenAI or Gemini, either by using one of
their embedding model ids or by pinning
X-Sentisec-Upstream-Provider: openai.
400 bedrock_credential_missing
{
"error": "bedrock_credential_missing",
"provider": "bedrock",
"model": "openai.gpt-oss-120b"
}The model id is an Amazon Bedrock id, and this workspace holds no
Bedrock credential and no other key that could serve the request. It is
a 400 rather than the usual 401 because the actionable fact is in
the body you sent: the model id names exactly which credential is
missing.
Fix: add a Bedrock API key and its region under Settings β Providers, in Provider keys, or send a model id one of your existing keys serves. Setup: Amazon Bedrock.
My request went to the wrong provider
Sentisec picks a provider per request from three inputs. The header always wins; the workspace default and the model-id prefix apply when it is absent.
- The
X-Sentisec-Upstream-Providerheader. - Your workspace's default provider, if one is configured for you. It applies only to providers that serve the wire format the request arrived on.
- The model id, by prefix:
claude-β Anthropic,gpt-/o1/o3β OpenAI, a Bedrock vendor prefix such asanthropic./openai./qwen.β Amazon Bedrock when the workspace holds a Bedrock credential,gemini-β Gemini,kimi-/moonshot-β Kimi.
Rules 2 and 3 are weighed in a different order on the two wire formats: an OpenAI-shaped request consults the workspace default first, an Anthropic-shaped request consults the prefix table first. The header outranks both on every route.
Three consequences worth knowing:
-
Vertex is never inferred from a model id. Its ids are publisher-prefixed (
google/gemini-2.5-flash), a shape that overlaps other providers' naming, so Sentisec will not guess. Always sendX-Sentisec-Upstream-Provider: vertex. -
A Bedrock Claude id is not the same as an Anthropic one.
anthropic.claude-sonnet-5goes to Bedrock; the bareclaude-sonnet-4form goes to Anthropic direct and needs an Anthropic key. -
An unfamiliar model id may land somewhere unexpected, or fail to resolve a provider at all. Pin it:
curl ... -H "X-Sentisec-Upstream-Provider: kimi" ...
The header is consumed by Sentisec and stripped before the request is forwarded, so the provider never sees it.
Everything looks connected but nothing is enforced
First check your workspace's Protection β Overview: it says whether the workspace blocks right now. New workspaces start in shadow: requests are evaluated and verdicts recorded, but actions are not blocked. A successful request or a connected status does not mean enforcement is enabled. Review the recorded verdicts, then choose Turn on enforcement on Protection β Enforce when you are ready. Existing enforcing workspaces keep their mode. See enforcement mode.
Next, check that your base URL carries your workspace id:
https://api.sentisec.ch/ws/<your-workspace-id> # Anthropic-shaped clients
https://api.sentisec.ch/ws/<your-workspace-id>/v1 # OpenAI-shaped clientsThe workspace-scoped form is what guarantees your workspace's own policy travels with every request, on every transport. Your workspace id is on the dashboard next to your API key.
See also
- Providers β what Sentisec carries and how to connect it
- Google Vertex AI β the provider that must be pinned
- Keys management β how credentials are stored
- Auth β per-request routing
Updates / contradictions
2026-09-09 β Added the missing first check for βnothing is enforcedβ: a new workspace deliberately starts in shadow. The workspace URL alone does not enable blocking.
2026-10-16 β The dashboard's Posture page is now Protection β Overview, and the blocking switch is on Protection β Enforce. Provider keys are under Settings β Providers, formerly Upstreams.