REDROUTE
developer console

$api docs

OpenAI-compatible usage for RedRoute (beta) keys, models, streaming, errors, and account flow.
Get a keyinvite-only · via Discord

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.

  1. Join the Discord: https://discord.gg/your-invite
  2. Ask the operator for a token in #access. You'll get a string like rr_tkn_xxxxxxxx.
  3. Sign in at https://redroute.pro/login with your email.
  4. Paste the token at https://redroute.pro/redeem.
  5. 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.

Quickstarthttps://redroute.pro/v1
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
  }'
OpenAI SDKNode.js
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);
Authenticationbearer key
Base URLhttps://redroute.pro/v1
HeaderAuthorization: Bearer rr_live_...
Get a keySee Get a key — tokens are handed out in Discord.
Key storageOnly a SHA-256 hash is stored server-side. Full keys cannot be viewed later.
Modelslaunch list
modeluse
claude-fable-5Claude Fable 5 — Anthropic's top tier above Opus, 1M context, multimodal.
gpt-5.5OpenAI-compatible frontier coding and agentic work.
claude-opus-4-8Claude Opus path through the same OpenAI-compatible endpoint.
gpt-4o-audio-previewGPT-4o with audio input/output through chat completions.
gpt-realtime-2025-08-28Realtime speech-to-speech over the /v1/realtime WebSocket.
deepseek-v4-flashDeepSeek V4 Flash — 1M context, tools, JSON, and low-cost thinking mode.
deepseek-v4-proDeepSeek V4 Pro — 1M context, 384K max output, tools, and JSON.
MiniMax-M3MiniMax M3 — agentic tool use, coding, reasoning, and long context. Top-up credits only.
glm-5.1GLM-5.1 — long-horizon autonomous coding and engineering tasks. Top-up credits only.
qwen3.7-maxQwen3.7 Max — Alibaba flagship reasoning model with 1M-token context. Top-up credits only.
gemini-3.1-pro-previewGoogle Gemini 3.1 Pro Preview — advanced reasoning, autonomous coding, and multimodal tasks.
gpt-image-2Image generation — high quality, dall-e-3 format.
gpt-image-1-miniImage generation — lightweight, fast, low cost.
gpt-4o-mini-ttsText-to-speech with OpenAI-style voices.
gemini-2.5-flash-preview-ttsLower-cost Gemini flash text-to-speech preview.
whisper-1Whisper speech-to-text via /v1/audio/transcriptions.
Endpointsv1
GET /v1/modelsList allowed models.
POST /v1/chat/completionsOpenAI-compatible chat completions. Streaming supported.
POST /v1/messagesAnthropic-compatible alias for clients that expect Messages-style requests.
POST /v1/images/generationsImage generation. Returns base64 or URL.
POST /v1/audio/speechText-to-speech. Returns an audio file response.
POST /v1/audio/transcriptionsSpeech-to-text (Whisper). Multipart upload, billed per audio minute.
WS /v1/realtimeRealtime speech-to-speech WebSocket (gpt-realtime). Pass ?model= and your key.
POST /v1/videosSubmit 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}/contentStream the stored MP4 for a completed owned job. Range requests supported.
GET /meAccount JSON for dashboard data. Accepts session cookie or Bearer key.
StreamingSSE passthrough

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
  }'
Image inputvision

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.

Image generation/v1/images/generations

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.

Audio speech/v1/audio/speech

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.

Audio transcription/v1/audio/transcriptions

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"
Realtime speechWS /v1/realtime

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." }
  }));
});
Video generation/v1/videos

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.

OpenCodecustom provider config

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.

Limitsv1 defaults
Duo2 concurrent requests, max 4096 output tokens per request.
Builder6 concurrent requests, max 16384 output tokens per request.
Rate limit60 requests/min per RedRoute (beta) key.
Session budgetRolling 1h spend cap protects accounts from runaway agents.
ContentCoding and agentic workloads only. NSFW, roleplay/Tavern-shaped traffic, and jailbreaks are blocked.
Errorscommon responses
400 content_policyBlocked locally before upstream. No debit.
400 upstream_content_policyBlocked by upstream moderation. No debit.
402Plan expired, balance too low, or worst-case reservation exceeds balance.
403 suspendedAccount suspended after repeated policy blocks. Contact Discord support.
429Concurrency, rate limit, or session budget exceeded.
503 upstream_unavailableUpstream closed or degraded. No debit for failed calls.