Provider catalog
The provider is the first path segment of your base URL:
https://guardrails.vulnetix.com/{slug}/{orgUuid}/v1.
| Slug | Provider | Surfaces |
|---|---|---|
openai | OpenAI | chat, responses |
anthropic | Anthropic | messages |
openrouter | OpenRouter | chat |
groq | Groq | chat |
mistral | Mistral | chat |
deepseek | DeepSeek | chat |
xai | xAI | chat |
together | Together AI | chat |
fireworks | Fireworks AI | chat |
alibaba | Alibaba Cloud | chat |
moonshot | Moonshot AI | chat |
minimax | MiniMax | chat |
kiro | Kiro | kiro |
Every provider requires a stored key before it will
proxy anything. For kiro that key is a Kiro login rather than an API key (see
Kiro below). Every provider is subject to your
provider policy and
model policy.
Custom providers
An organisation can register its own OpenAI-compatible, OpenAI Responses or Anthropic
Messages endpoint. It is addressed exactly like a built-in, by its slug
(https://guardrails.vulnetix.com/{slug}/{orgUuid}/v1), and is subject to the same
authentication, provider policy, model policy
and guardrails. What differs is trust, because the base URL is text an organisation typed:
- Private to its organisation. Another organisation requesting the same slug gets
the ordinary
404 unknown_provider. - A built-in always wins. A custom provider cannot take the slug of a built-in provider, and if a row ever existed with one the built-in is what is served.
- Public
httpsendpoints only. The gateway refuses to connect to loopback, link-local (including the cloud metadata address), private (RFC 1918), CGNAT, unique-local or multicast addresses. The check is made when the connection is opened, on the address the host name resolves to at that moment, so it holds against DNS rebinding. Such a request is a502with codeupstream_blocked. - Redirects are never followed, and are not passed on to your client either. The request carries your provider key, so it only ever goes to the URL that was registered.
- No Kiro. Custom providers cannot serve the
kirosurface (400 unsupported_api). - Authentication to the endpoint uses the credential template stored on the provider,
such as
Authorization: Bearer {apiKey},x-api-key: {apiKey}orcf-aig-authorization: Bearer {apiKey}; the key itself comes from your stored key.
Surfaces, and why they matter
chat—POST /v1/chat/completions. What almost everything speaks.responses—POST /v1/responses. Onlyopenaiserves it. This is what Codex CLI requires, which is why Codex can only be wired to theopenaiprovider.messages—POST /v1/messages. Onlyanthropicserves it. This is what Claude Code and Claude Desktop speak.kiro—POST /v1/generateAssistantResponse. Onlykiroserves it. This is the AWS CodeWhisperer / Q Developer API that Kiro and belai’skiroprovider speak. The response is a binary AWS event stream.
Asking a provider for a surface it does not serve is a 404 telling you what to use
instead. See base URLs & request surfaces.
The Anthropic base URL has no /v1. The Anthropic SDK appends it itself, so the
base URL stops at the organisation:
https://guardrails.vulnetix.com/anthropic/{orgUuid}
Every other provider takes the /v1 form. This asymmetry is the most common
misconfiguration there is.
Kiro
Kiro has no API key. Instead you sign in once, and the gateway mints a short-lived Kiro access token from that sign-in for every request:
vulnetix ai-firewall kiro login # AWS Builder ID
vulnetix ai-firewall kiro login --start-url https://my-org.awsapps.com/start --region eu-central-1
vulnetix ai-firewall kiro login --import # reuse the Kiro IDE / kiro-cli sign-in
The sign-in is saved to the secrets vault
as the kiro provider’s key, granted to the AI Firewall. Your client then sends
only its Vulnetix API key:
- base URL:
https://guardrails.vulnetix.com/kiro/{orgUuid}/v1 - inference:
POST …/generateAssistantResponse - models:
GET …/ListAvailableModels
Things to know:
- GitHub and Google Kiro sign-ins cannot be used. They have no AWS SSO-OIDC refresh path. Sign in with an AWS Builder ID or IAM Identity Center.
- When AWS stops accepting the sign-in, requests are refused with
403 vault_kiro_relogin. Runvulnetix ai-firewall kiro loginagain to fix it. - The profile is fixed by the sign-in. For an Identity Center sign-in, the
gateway sets the vault’s
profileArnon every request, replacing any the client sent.
Model names are the provider’s own
The gateway passes the model string through verbatim — it does not rewrite,
prefix, or normalise it. Use exactly the name the provider uses:
| Provider | Example |
|---|---|
openai | gpt-4o-mini |
anthropic | claude-sonnet-5 |
kiro | claude-sonnet-4.5 — the modelId on the current user message |
openrouter | openai/gpt-4o-mini — OpenRouter namespaces by vendor |
groq | llama-3.3-70b-versatile |
mistral | mistral-large-latest |
Get the name wrong and you get the provider’s own “unknown model” error, relayed verbatim — not one of ours. That is usually the fastest way to tell the two apart.
OpenRouter is a router, not a vendor
OpenRouter fronts models from many underlying vendors. To the firewall’s
provider policy it is a single provider — so allowing
openrouter grants reach to a large set of vendors you have not individually
approved.
If you are using provider policy to hold a procurement or jurisdictional boundary,
either deny openrouter or constrain it with
model policy, which can see the individual model IDs.
The model catalog
The list of models at each provider is synced hourly. It is what
GET /v1/models serves, and what the dashboard’s model
pickers are populated from.
A model that is not in the catalog still works — unless the provider is in allowlist mode. This is deliberate: a model released this morning should not be an outage while the sync catches up.
The consequence is worth stating: a deny list cannot block a model that does not exist yet. If you need that guarantee, you need an allowlist.
Adding a provider
Providers are data, not code. If you need one that is not on this list — a
self-hosted endpoint, Bedrock, Vertex, an OpenAI-compatible gateway of your own —
get in touch. Anything that speaks one of the
chat, responses or messages surfaces and authenticates with a static header
can be added without a code change.
Related
- Base URLs & request surfaces
- BYOK — storing a key for a provider.
- Jurisdictional control — choosing vendors deliberately.