Anthropic has suspended access to Fable 5 to comply with a US government export-control directive, so we've disabled claude-fable-5 on RedRoute. Requests to it now time out and are not billed — you won't be charged for any failed call. All other models are unaffected. We'll re-enable routing as soon as access is restored.
$api docs
RedRoute (beta) keys aren't self-serve. The operator hands out a one-time Discord token in our server, and you redeem it for an API key on your account.
- Join the Discord: https://discord.gg/your-invite
- Ask the operator for a token in
#access. You'll get a string likerr_tkn_xxxxxxxx. - Sign in at https://redroute.pro/login with your email.
- Paste the token at https://redroute.pro/redeem.
- Copy the API key shown once — that's your
rr_live_....
Lost the key? You can revoke and mint a new one from the dashboard after sign-in. Tokens are single-use and permanently bound to the account that redeems them.
curl https://redroute.pro/v1/chat/completions \
-H "Authorization: Bearer rr_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.5",
"messages": [
{ "role": "user", "content": "Reply with exactly: redroute-ok" }
],
"temperature": 0,
"max_tokens": 32
}'
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "rr_live_YOUR_KEY",
baseURL: "https://redroute.pro/v1"
});
const res = await client.chat.completions.create({
model: "gpt-5.5",
messages: [{ role: "user", content: "Reply with redroute-ok" }],
temperature: 0,
max_tokens: 32
});
console.log(res.choices[0]?.message?.content);
| Base URL | https://redroute.pro/v1 |
| Header | Authorization: Bearer rr_live_... |
| Get a key | See Get a key — tokens are handed out in Discord. |
| Key storage | Only a SHA-256 hash is stored server-side. Full keys cannot be viewed later. |
| model | use |
|---|---|
claude-fable-5 | Claude Fable 5 — Anthropic's top tier above Opus, 1M context, multimodal. |
gpt-5.5 | OpenAI-compatible frontier coding and agentic work. |
claude-opus-4-8 | Claude Opus path through the same OpenAI-compatible endpoint. |
gpt-4o-audio-preview | GPT-4o with audio input/output through chat completions. |
gpt-realtime-2025-08-28 | Realtime speech-to-speech over the /v1/realtime WebSocket. |
deepseek-v4-flash | DeepSeek V4 Flash — 1M context, tools, JSON, and low-cost thinking mode. |
deepseek-v4-pro | DeepSeek V4 Pro — 1M context, 384K max output, tools, and JSON. |
MiniMax-M3 | MiniMax M3 — agentic tool use, coding, reasoning, and long context. Top-up credits only. |
glm-5.1 | GLM-5.1 — long-horizon autonomous coding and engineering tasks. Top-up credits only. |
qwen3.7-max | Qwen3.7 Max — Alibaba flagship reasoning model with 1M-token context. Top-up credits only. |
gemini-3.1-pro-preview | Google Gemini 3.1 Pro Preview — advanced reasoning, autonomous coding, and multimodal tasks. |
gpt-image-2 | Image generation — high quality, dall-e-3 format. |
gpt-image-1-mini | Image generation — lightweight, fast, low cost. |
gpt-4o-mini-tts | Text-to-speech with OpenAI-style voices. |
gemini-2.5-flash-preview-tts | Lower-cost Gemini flash text-to-speech preview. |
whisper-1 | Whisper speech-to-text via /v1/audio/transcriptions. |
| GET /v1/models | List allowed models. |
| POST /v1/chat/completions | OpenAI-compatible chat completions. Streaming supported. |
| POST /v1/messages | Anthropic-compatible alias for clients that expect Messages-style requests. |
| POST /v1/images/generations | Image generation. Returns base64 or URL. |
| POST /v1/audio/speech | Text-to-speech. Returns an audio file response. |
| POST /v1/audio/transcriptions | Speech-to-text (Whisper). Multipart upload, billed per audio minute. |
| WS /v1/realtime | Realtime speech-to-speech WebSocket (gpt-realtime). Pass ?model= and your key. |
| POST /v1/videos | Submit an async PixVerse video render. Returns a RedRoute job id. |
| GET /v1/videos/{id} | Poll RedRoute job state: queued, processing, completed, failed, or moderation_blocked. |
| GET /v1/videos/{id}/content | Stream the stored MP4 for a completed owned job. Range requests supported. |
| GET /me | Account JSON for dashboard data. Accepts session cookie or Bearer key. |
Set stream: true. For usage accounting, include stream_options.include_usage: true when your client supports it.
curl https://redroute.pro/v1/chat/completions \
-H "Authorization: Bearer rr_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-opus-4-8",
"stream": true,
"stream_options": { "include_usage": true },
"messages": [
{ "role": "user", "content": "Say hello in one sentence." }
],
"max_tokens": 128
}'
Send images as image_url content parts in the messages array. Both base64 data URLs and remote URLs are supported. Max request body size is 12 MB.
Supported formats: image/png, image/jpeg, image/webp, image/gif.
{
"model": "gpt-5.5",
"messages": [{
"role": "user",
"content": [
{ "type": "text", "text": "What is in this screenshot?" },
{ "type": "image_url", "image_url": { "url": "data:image/png;base64,..." } }
]
}],
"max_tokens": 256
}
Anthropic-style image blocks on /v1/messages are automatically converted to image_url before forwarding upstream.
Generate images with gpt-image-2 or gpt-image-1-mini. Billing is per image, not per token.
{
"model": "gpt-image-2",
"prompt": "A red panda in a space suit, digital art",
"size": "1024x1024",
"n": 1
}
Or try it interactively at /images.
Generate speech with gpt-4o-mini-tts or gemini-2.5-flash-preview-tts. Billing is either flat per request or token-estimated depending on the model.
curl https://redroute.pro/v1/audio/speech \
-H "Authorization: Bearer rr_live_YOUR_KEY" \
-H "Content-Type: application/json" \
--output speech.mp3 \
-d '{
"model": "gpt-4o-mini-tts",
"voice": "nova",
"input": "RedRoute can generate speech through the audio route."
}'
Or try it interactively at /Audio.
Transcribe audio with whisper-1. Send a multipart form with a file field (up to 25 MB) and optional language, prompt, temperature, and response_format (json, text, verbose_json, srt, vtt). Billing is per audio minute.
curl https://redroute.pro/v1/audio/transcriptions \ -H "Authorization: Bearer rr_live_YOUR_KEY" \ -F model="whisper-1" \ -F file="@meeting.mp3" \ -F response_format="json"
Connect a WebSocket for live speech-to-speech with gpt-realtime-2025-08-28. Authenticate with Authorization: Bearer rr_live_... or the browser-style openai-insecure-api-key.<key> subprotocol. Text tokens bill at the listed rate; audio tokens at $32/$64 per 1M. Each session reserves $1.00 of credit, refunds the unused part on disconnect, and closes automatically at the budget or after 30 minutes.
import WebSocket from "ws";
const ws = new WebSocket(
"wss://redroute.pro/v1/realtime?model=gpt-realtime-2025-08-28",
{ headers: { Authorization: "Bearer rr_live_YOUR_KEY" } }
);
ws.on("message", (data) => console.log(JSON.parse(data)));
ws.on("open", () => {
ws.send(JSON.stringify({
type: "response.create",
response: { modalities: ["audio", "text"], instructions: "Say hello." }
}));
});
Submit PixVerse video renders asynchronously, then poll the RedRoute job id and stream the stored MP4 when completed.
POST /v1/videos
GET /v1/videos/{id}
GET /v1/videos/{id}/content
Or try it interactively at /studio.
Drop this into ~/.config/opencode/opencode.json (or your project's opencode.json) to use RedRoute as a custom provider. The modalities field is the important bit — without it OpenCode silently strips images and tells the model "this model does not support image input."
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"redroute": {
"npm": "@ai-sdk/openai-compatible",
"name": "RedRoute",
"options": {
"baseURL": "https://redroute.pro/v1",
"apiKey": "{env:REDROUTE_API_KEY}"
},
"models": {
"gpt-5.5": {
"name": "GPT-5.5",
"attachment": true,
"reasoning": true,
"modalities": { "input": ["text", "image"], "output": ["text"] },
"limit": { "context": 400000, "output": 16384 },
"options": { "reasoningEffort": "medium", "reasoningSummary": "auto" }
},
"claude-fable-5": {
"name": "Claude Fable 5",
"attachment": true,
"modalities": { "input": ["text", "image"], "output": ["text"] },
"limit": { "context": 1000000, "output": 16384 }
},
"claude-opus-4-8": {
"name": "Claude Opus 4.8",
"attachment": true,
"modalities": { "input": ["text", "image"], "output": ["text"] },
"limit": { "context": 200000, "output": 16384 }
},
"deepseek-v4-flash": {
"name": "DeepSeek V4 Flash",
"attachment": false,
"reasoning": true,
"modalities": { "input": ["text"], "output": ["text"] },
"limit": { "context": 1000000, "output": 384000 },
"options": { "reasoningEffort": "medium" }
},
"deepseek-v4-pro": {
"name": "DeepSeek V4 Pro",
"attachment": false,
"reasoning": true,
"modalities": { "input": ["text"], "output": ["text"] },
"limit": { "context": 1000000, "output": 384000 },
"options": { "reasoningEffort": "medium" }
},
"MiniMax-M3": {
"name": "MiniMax M3",
"attachment": false,
"reasoning": true,
"modalities": { "input": ["text"], "output": ["text"] },
"limit": { "context": 1000000, "output": 32768 },
"options": { "reasoningEffort": "medium" }
},
"glm-5.1": {
"name": "GLM-5.1",
"attachment": false,
"reasoning": true,
"modalities": { "input": ["text"], "output": ["text"] },
"limit": { "context": 198000, "output": 128000 },
"options": { "reasoningEffort": "medium" }
},
"qwen3.7-max": {
"name": "Qwen3.7 Max",
"attachment": false,
"reasoning": true,
"modalities": { "input": ["text"], "output": ["text"] },
"limit": { "context": 1000000, "output": 64000 },
"options": { "reasoningEffort": "medium" }
}
}
}
}
}
Then export your key and run opencode:
export REDROUTE_API_KEY=rr_live_YOUR_KEY opencode
Pick a RedRoute model with /models. Drag images into the terminal — with modalities.input including "image", OpenCode forwards them as image_url parts and RedRoute passes them through to the upstream model.
| Duo | 2 concurrent requests, max 4096 output tokens per request. |
| Builder | 6 concurrent requests, max 16384 output tokens per request. |
| Rate limit | 60 requests/min per RedRoute (beta) key. |
| Session budget | Rolling 1h spend cap protects accounts from runaway agents. |
| Content | Coding and agentic workloads only. NSFW, roleplay/Tavern-shaped traffic, and jailbreaks are blocked. |
400 content_policy | Blocked locally before upstream. No debit. |
400 upstream_content_policy | Blocked by upstream moderation. No debit. |
402 | Plan expired, balance too low, or worst-case reservation exceeds balance. |
403 suspended | Account suspended after repeated policy blocks. Contact Discord support. |
429 | Concurrency, rate limit, or session budget exceeded. |
503 upstream_unavailable | Upstream closed or degraded. No debit for failed calls. |