Documentation
Point any LLM client at the AI Firewall. Two settings change — base_url and api_key — and nothing else about your code does.
Every client on this page is configured the same way. You change two settings:
base_url — point it at the gateway instead of the provider.api_key — send your Vulnetix API key (VULNETIX_API_KEY), not a provider
key. The provider key stays in the BYOK vault, where
the gateway decrypts it just-in-time and injects it on the way upstream.Nothing else changes. Your model strings, your messages, your tools, your streaming
loop, your response parsing — all identical. The gateway speaks the same wire
protocol your SDK already speaks, so the SDK cannot tell the difference. The one
genuinely new thing you should add is a catch for a 403, which is how a
guardrail refusal arrives. Every page below has a section on it.
/v1. They append /v1 themselves.
Every other client expects /v1 in the base URL. This is the single most common
misconfiguration.| Your client | Base URL |
|---|---|
| OpenAI SDKs, LangChain, LlamaIndex, curl, everything else | https://guardrails.vulnetix.com/{providerSlug}/{orgUuid}/v1 |
| Anthropic SDKs | https://guardrails.vulnetix.com/anthropic/{orgUuid} — no /v1 |
{orgUuid} is your organisation UUID, from the
dashboard. {providerSlug} is one of
openai, anthropic, openrouter, groq, mistral, deepseek, xai,
together, fireworks, alibaba, moonshot, minimax.
Model names pass through verbatim. gpt-4o-mini on openai,
openai/gpt-4o-mini on openrouter, claude-sonnet-5 on anthropic — use
whatever the provider itself calls the model.
Rather than copying a base URL by hand, have the CLI print a working snippet with your organisation UUID and provider already substituted in:
vulnetix ai-firewall snippet --lang python --sdk openai --provider openai
Templates exist for these pairs, and only these:
--lang | --sdk |
|---|---|
python | openai, anthropic, langchain, llamaindex |
ts | openai, anthropic, vercel-ai |
go | openai |
sh | curl |
For every other language on this page, the pattern is the same — copy it from the page.
OPENAI_BASE_URL entirely. For those clients, setting base_url in code is not a
convenience — it is the only mechanism that routes traffic through the firewall.openai SDK.openai SDK.openai-go SDK.openai-java SDK.OpenAI NuGet package.openai gem.openai-php/client (community).async-openai (community).openai-java, or openai-kotlin (community).OpenAI (community), or URLSession.openai_dart (community).openai_ex (community).| Provider | Surfaces |
|---|---|
openai | Chat Completions, Responses |
anthropic | Messages |
| everything else | Chat Completions |
Pointing a client at a surface a provider does not serve returns 404 with code
unsupported_api, and the message tells you which base URL to use instead. See
base URLs & request surfaces.