Integrations
Tool integrations
Warp accepts OpenAI Chat Completions, Anthropic Messages and OpenAI Responses, so an existing client works by changing a base URL and a key. All three run the same gateway, so routing, savings, guardrails and the audit trail apply identically.
Which endpoint
Most tools use the OpenAI format. Claude Code speaks only Anthropic Messages and Codex speaks only OpenAI Responses, so each gets a dedicated endpoint — no converter to install.
| Format | Endpoint | Auth header | Tools |
|---|---|---|---|
| OpenAI | https://api.warp.inc/v1 | Authorization: Bearer | Cursor, OpenClaw, Hermes, AI SDK, OpenAI SDK |
| Anthropic Messages | https://api.warp.inc | x-api-key | Claude Code, Anthropic SDK |
| OpenAI Responses | https://api.warp.inc/v1 | Authorization: Bearer | Codex CLI |
Setup
Pick the tool you use and its own setup appears. The format, the endpoint and the config path are filled in already.
This tool speaks Anthropic Messages and nothing else → https://api.warp.inc/v1/messages
Have the agent do it
Paste this into the tool itself — it applies the change and sends a real request to confirm.
Point Claude Code at Warp as its model provider.
- Base URL (not the full request path): https://api.warp.inc
← Claude Code appends /v1/messages itself — do not include it
- API key: sk-warp-... ← replace with my key
- Model: warp/code
- Config lives at: ~/.claude/settings.json
Put it in that config file rather than a shell export — an export lives only in
the tab it was typed in, which is a common way for this to silently not apply. When you're done run `claude -p "/status"` and confirm it took.Or set it up by hand
Install
npm install -g @anthropic-ai/claude-codeConfigure
{
"env": {
"ANTHROPIC_BASE_URL": "https://api.warp.inc",
"ANTHROPIC_API_KEY": "sk-warp-...",
"ANTHROPIC_MODEL": "warp/code",
"ANTHROPIC_SMALL_FAST_MODEL": "warp/auto"
}
}Verify
claude
# then, inside Claude Code:
/statusYou should see — Anthropic base URL: https://api.warp.inc · Model: warp/code
This tool speaks OpenAI Responses and nothing else → https://api.warp.inc/v1/responses (Codex has no other option)
Have the agent do it
Paste this into the tool itself — it applies the change and sends a real request to confirm.
Point Codex CLI at Warp as its model provider.
- Base URL (not the full request path): https://api.warp.inc/v1
← Codex CLI appends /responses itself — do not include it
- API key: sk-warp-... ← replace with my key
- Model: warp/code
- Config lives at: ~/.codex/config.toml
Put it in that config file rather than a shell export — an export lives only in
the tab it was typed in, which is a common way for this to silently not apply. When you're done run `codex exec "reply with OK"` and confirm it took.Or set it up by hand
Install
npm install -g @openai/codexConfigure
model_provider = "warp"
model = "warp/code"
[model_providers.warp]
name = "Warp"
base_url = "https://api.warp.inc/v1"
env_key = "WARP_API_KEY"
wire_api = "responses"Verify
export WARP_API_KEY="sk-warp-..."
codexYou should see — warp/code in the status line
This tool speaks the OpenAI format → https://api.warp.inc/v1/chat/completions
Have the agent do it
Paste this into the tool itself — it applies the change and sends a real request to confirm.
Point Cursor at Warp as its model provider.
- Base URL (not the full request path): https://api.warp.inc/v1
← Cursor appends /chat/completions itself — do not include it
- API key: sk-warp-... ← replace with my key
- Model: warp/code
- Config lives at: Settings → Models → OpenAI API Key → Override base URL
Put it in that config file rather than a shell export — an export lives only in
the tab it was typed in, which is a common way for this to silently not apply. When you're done, tell me what to check in the UI.Or set it up by hand
Configure
Base URL: https://api.warp.inc/v1
API Key: sk-warp-...
Model: warp/codeVerify
Settings → Models → VerifyYou should see — the key verifies and warp/code appears in the model list
This tool speaks the OpenAI format → https://api.warp.inc/v1/chat/completions
Have the agent do it
Paste this into the tool itself — it applies the change and sends a real request to confirm.
Point OpenCode at Warp as its model provider.
- Base URL (not the full request path): https://api.warp.inc/v1
← OpenCode appends /chat/completions itself — do not include it
- API key: sk-warp-... ← replace with my key
- Model: warp/code
- Config lives at: opencode.json
Put it in that config file rather than a shell export — an export lives only in
the tab it was typed in, which is a common way for this to silently not apply. When you're done run `opencode run "reply with OK"` and confirm it took.Or set it up by hand
Install
npm install -g opencode-aiConfigure
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"warp": {
"npm": "@ai-sdk/openai-compatible",
"name": "Warp",
"options": {
"baseURL": "https://api.warp.inc/v1",
"apiKey": "{env:WARP_API_KEY}"
},
"models": {
"warp/code": { "name": "Warp Code" },
"warp/auto": { "name": "Warp Auto" }
}
}
}
}Verify
opencode
# then, inside OpenCode:
/modelsYou should see — Warp listed as a provider, with warp/code selectable
This tool speaks the OpenAI format → https://api.warp.inc/v1/chat/completions
Have the agent do it
Paste this into the tool itself — it applies the change and sends a real request to confirm.
Point OpenClaw at Warp as its model provider.
- Base URL (not the full request path): https://api.warp.inc/v1
← OpenClaw appends /chat/completions itself — do not include it
- API key: sk-warp-... ← replace with my key
- Model: warp/code
- Config lives at: ~/.openclaw/openclaw.json
Put it in that config file rather than a shell export — an export lives only in
the tab it was typed in, which is a common way for this to silently not apply. When you're done, tell me what to check in the UI.Or set it up by hand
Configure
{
"models": {
"providers": {
"warp": {
"baseUrl": "https://api.warp.inc/v1",
"apiKey": "sk-warp-...",
"api": "openai-completions",
"models": [
{ "id": "warp/code", "name": "Warp Code", "contextWindow": 1000000, "maxTokens": 8192 }
]
}
}
},
"agents": { "defaults": { "models": ["warp/warp/code"] } }
}Verify
openclaw gateway restartYou should see — warp/code · warp at the bottom of the Control UI
This tool speaks the OpenAI format → https://api.warp.inc/v1/chat/completions
Have the agent do it
Paste this into the tool itself — it applies the change and sends a real request to confirm.
Point Hermes at Warp as its model provider.
- Base URL (not the full request path): https://api.warp.inc/v1
← Hermes appends /chat/completions itself — do not include it
- API key: sk-warp-... ← replace with my key
- Model: warp/code
- Config lives at: terminal
Put it in that config file rather than a shell export — an export lives only in
the tab it was typed in, which is a common way for this to silently not apply. When you're done, tell me what to check in the UI.Or set it up by hand
Configure
export OPENAI_BASE_URL="https://api.warp.inc/v1"
export OPENAI_API_KEY="sk-warp-..."
hermes model # pick warp/codeVerify
hermesYou should see — warp/code in the status bar
This tool speaks the OpenAI format → https://api.warp.inc/v1/chat/completions
Have the agent do it
Paste this into the tool itself — it applies the change and sends a real request to confirm.
Point Vercel AI SDK at Warp as its model provider.
- Base URL (not the full request path): https://api.warp.inc/v1
← Vercel AI SDK appends /chat/completions itself — do not include it
- API key: sk-warp-... ← replace with my key
- Model: warp/auto
- Config lives at: app/api/chat/route.ts
Put it in that config file rather than a shell export — an export lives only in
the tab it was typed in, which is a common way for this to silently not apply. When you're done, tell me what to check in the UI.Or set it up by hand
Configure
import { createOpenAI } from "@ai-sdk/openai";
import { generateText } from "ai";
const warp = createOpenAI({
baseURL: "https://api.warp.inc/v1",
apiKey: process.env.WARP_API_KEY,
});
export async function POST() {
const { text } = await generateText({
model: warp("warp/auto"),
prompt: "Summarize this quarter's metrics",
});
return Response.json({ text });
}Verify
node --run devYou should see — a completion, and the request on your Warp dashboard
This tool speaks the OpenAI format → https://api.warp.inc/v1/chat/completions
Have the agent do it
Paste this into the tool itself — it applies the change and sends a real request to confirm.
Point OpenAI SDK at Warp as its model provider.
- Base URL (not the full request path): https://api.warp.inc/v1
← OpenAI SDK appends /chat/completions itself — do not include it
- API key: sk-warp-... ← replace with my key
- Model: warp/auto
- Config lives at: client.mjs
Put it in that config file rather than a shell export — an export lives only in
the tab it was typed in, which is a common way for this to silently not apply. When you're done run `node client.mjs` and confirm it took.Or set it up by hand
Configure
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.warp.inc/v1",
apiKey: process.env.WARP_API_KEY,
});
const res = await client.chat.completions.create({
model: "warp/auto",
messages: [{ role: "user", content: "Hello" }],
});
console.log(res.choices[0].message.content);Verify
node client.mjsYou should see — a completion, and the request on your Warp dashboard
Not listed? Pick the tool with the same format, then change the tool name and config path in the prompt.
Routing
warp/auto and warp/code hand model choice over wholesale. The alternative is to anchor the model you already use as the quality ceiling and let only the easy requests route down — add :auto to the model name your config already had. A dial goes in the same place.
anthropic/claude-sonnet-5 # always this model, no routing
anthropic/claude-sonnet-5:auto # route; never above claude-sonnet-5
anthropic/claude-sonnet-5:balanced
anthropic/claude-sonnet-5:max-savings
warp/auto:balanced # a router; a dial needs an anchor, so this one is ignoredHard requests are then always answered by claude-sonnet-5, and only easy ones route down. The anchor is a ceiling, not a selection — nothing climbs above it. If a lower tier returns something unusable, it is automatically re-served once from the tier above (on by default).
Tools that cannot build a request body
A model name is something every tool lets you type, so tools that cannot build a custom request body — Claude Code, Cursor — use this exactly as everything else does. See Anchored routing.
Anthropic Messages directly
For clients implemented directly against the Messages format. Routing options are identical to the OpenAI endpoint — see Warp router.
curl https://api.warp.inc/v1/messages \
-H "x-api-key: $WARP_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "warp/auto",
"max_tokens": 1024,
"messages": [{ "role": "user", "content": "Hello" }]
}'Unsupported fields
These two fields are ignored when present. Accepting a value that is never applied would misrepresent what the endpoint does, so it is stated here instead.
| Field | Why |
|---|---|
thinking | The gateway's internal response shape has no field for reasoning content, so an upstream trace cannot be carried back even when the model produces one. Thinking blocks in your history are accepted and ignored. |
cache_control | There is no path to carry prompt-cache markers upstream, and a request may route to a model that is not Anthropic's. |
top_k is forwarded. This table claimed for a while that it had no counterpart, which was not true — the gateway was dropping a knob the target model would have taken.
POST /v1/messages/count_tokens returns an estimate. It is computed before the request resolves to a model, so there is no single tokenizer to be exact against.