Documentation
One key, two formats. OpenAI base URL https://helioroute.com/v1 · Anthropic base URL https://helioroute.com. Change two values in your existing SDK and you are done.
Which setup is yours?
You only need one of these. Jump to the one that matches how you work.
- 💬 I just want to chat — nothing to install, open the chat.
- 🧩 I code in VS Code — install Cline, then follow the Cline steps (about 2 minutes, all clicking).
- ⌨️ I live in the terminal — copy one block of text from Pi or Claude Code.
- 🖱️ I use Cursor — Cursor settings, three boxes to fill.
- 🐍 I write code — any language, see OpenAI format (Python, Node) or Anthropic format.
Every option uses the same key and the same address — once one works, they all do.
Quickstart
Step 1. Open your API keys and copy the key that starts with sk-. No card, no approval — it is already there.
Step 2. Paste this into a terminal. Replace the key on the first line with yours, then press Enter:
# 1. Get a key: https://helioroute.com/console/keys
# 2. Call any model (OpenAI-compatible)
curl https://helioroute.com/v1/chat/completions \
-H "Authorization: Bearer $HELIOROUTE_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"ping"}]}'Step 3. You should see a reply. That is the whole setup — the same key works with every tool on this page.
Not a coder? You can skip all of this.
Open the chat and just type. No key, no install, no terminal — everything below is only for people wiring Helioroute into their own software.
Authentication
Every request carries your virtual key. Both surfaces accept two header styles, so any client just works:
Authorization: Bearer sk-…— OpenAI SDKs and Anthropic-style clientsx-api-key: sk-…— the Anthropic SDK and Claude Code
Keys are metered per token and spend is deducted from your prepaid credit in real time. Rotate or revoke any time from /console/keys.
OpenAI format
Drop-in for the official SDKs at https://helioroute.com/v1. Only base_url and the key change.
from openai import OpenAI
client = OpenAI(base_url="https://helioroute.com/v1", api_key="sk-hr-...")
resp = client.chat.completions.create(
model="claude-sonnet-5",
messages=[{"role": "user", "content": "Explain vector databases in 2 lines."}],
)
print(resp.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://helioroute.com/v1",
apiKey: process.env.HELIOROUTE_KEY,
});
const res = await client.chat.completions.create({
model: "claude-sonnet-5",
messages: [{ role: "user", content: "hello" }],
});
console.log(res.choices[0].message.content);List everything your key can reach with GET https://helioroute.com/v1/models — the response is the standard OpenAI { data: [...] } shape, so SDK model pickers and routers work without special-casing.
# Every model your key can reach (standard OpenAI shape):
curl https://helioroute.com/v1/models \
-H "Authorization: Bearer $HELIOROUTE_KEY"
# -> {"data":[{"id":"claude-sonnet-5","object":"model"}, ...]} (212 models)Anthropic format
The Messages API at https://helioroute.com/v1/messages is served natively by HELIOROUTE — Claude SDK clients, Claude Code and Anthropic-shaped tools talk to it unchanged.
curl https://helioroute.com/v1/messages \
-H "x-api-key: $HELIOROUTE_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{"model":"claude-sonnet-5","max_tokens":256,"messages":[{"role":"user","content":"hi"}]}'import anthropic
client = anthropic.Anthropic(
api_key="sk-hr-...",
base_url="https://helioroute.com",
)
msg = client.messages.create(
model="claude-sonnet-5",
max_tokens=512,
messages=[{"role": "user", "content": "hi"}],
)
print(msg.content[0].text)Claude Code
Already use Claude Code in your terminal? You can keep it — just point it here and it will use any model on the gateway. Three lines, paste and go:
# First time only — install it:
npm install -g @anthropic-ai/claude-code
# Then paste these three lines into your terminal. Put your own key on the
# middle line. Press Enter on the last one to start.
export ANTHROPIC_BASE_URL="https://helioroute.com"
export ANTHROPIC_AUTH_TOKEN="PASTE-YOUR-sk-KEY-HERE"
claude
# That is it. Inside, use /model to pick whichever model you want.
#
# NOTE: these two export lines only last for that terminal window. Close it and
# you paste them again. To make them permanent, add them to your shell profile.Cursor
The base URL is where almost everybody trips up. The exact value is below — copy it.
1. Open Cursor. Press Ctrl+, (Cmd+, on a Mac) to open Settings.
On the left, choose "Models". Scroll to the "OpenAI API Key" section.
2. Fill in these two boxes:
Override OpenAI Base URL -> https://helioroute.com/v1
API Key -> your sk-... key
(click Verify / Save)
3. In the same section, click "+ Add model" (or "Add custom model")
-> type a name: claude-sonnet-5
-> Add.
4. In the chat, open the model dropdown and pick "claude-sonnet-5". Done.
⛔ The Base URL must end with "/v1" — exactly "https://helioroute.com/v1".
If you enter only "https://helioroute.com" you will get a 404 error.Cline
Cline is an agentic VS Code extension, so it needs tool calling and streaming — both of which the gateway speaks natively. Point it at the OpenAI-compatible surface:
1. Open VS Code. Click the Extensions icon on the left (the four-squares icon).
Search for "Cline". Click Install.
2. Open Cline from the sidebar. Click the gear icon (top right) to open Settings.
3. Find the "API Provider" dropdown and choose "OpenAI Compatible".
4. Three boxes will appear. Copy these in:
Base URL -> https://helioroute.com/v1
API Key -> your sk-... key
Model ID -> claude-sonnet-5
5. Click Verify (or Done). Cline is now connected.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⛔ ONE MORE STEP — the checkbox almost everybody misses
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Click the gear icon again -> "Model Configuration" -> next to claude-sonnet-5 set:
Supports Images : ON
Supports Computer Use : ON <-- ⛔ THIS ONE IS REQUIRED
Context Window : 200000
Max Output Tokens : 8192
Input Price : 0.4
Output Price : 2
If "Supports Computer Use" is OFF, Cline will still chat with you — but it will
never open a file or write code. It only works as an agent with this ON.The Supports Computer Use toggle is the one people miss. Leave it off and Cline still chats, but it will not read or edit files — that checkbox is what turns on function calling.
Pi
Pi is a minimal CLI agent harness. It reads custom providers from a JSON file, so no extension is needed:
# STEP 1 — install Pi. Copy this line, press Enter.
npm install -g --ignore-scripts @earendil-works/pi-coding-agent
# STEP 2 — copy everything below and paste it all at once.
# Change ONE thing only: put your own key where it says PASTE-YOUR-sk-KEY-HERE.
# You do not need to create any file by hand — this does it for you.
mkdir -p ~/.pi/agent
cat > ~/.pi/agent/models.json <<'JSON'
{
"providers": {
"helioroute": {
"baseUrl": "https://helioroute.com/v1",
"api": "openai-completions",
"apiKey": "PASTE-YOUR-sk-KEY-HERE",
"models": [
{ "id": "claude-sonnet-5", "name": "Claude Sonnet 5 (Helioroute)" },
{ "id": "claude-opus-5", "name": "Claude Opus 5 (Helioroute)" }
]
}
}
}
JSON
# STEP 3 — start Pi, then pick your model.
pi
# inside Pi, type: /model and choose "Claude Sonnet 5 (Helioroute)"
# ── What the settings mean (in plain words) ──────────────────────────
# baseUrl = the Helioroute address. Leave it exactly as it is.
# api = just tells Pi what request format to use. Do not change it.
# apiKey = your key from the console. THIS is the only line you edit.
# models = which models show up in Pi's menu. To add more, copy one of
# the lines and give it another model id.The apiKey also accepts $HELIOROUTE_KEY to read the value from your environment instead of storing it in the file.
LangChain
Any OpenAI-compatible LangChain integration works unchanged:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-4o",
base_url="https://helioroute.com/v1",
api_key="sk-hr-...",
)
print(llm.invoke("Summarise transformers in one sentence.").content)Streaming
Server-sent events on both surfaces, identical to the native formats:
stream = client.chat.completions.create(
model="claude-sonnet-5",
messages=[{"role": "user", "content": "Write a haiku about latency."}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")Tool calling
Function/tool calling is supported for all tool-capable models:
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather for a city",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
},
}]
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "weather in Mumbai?"}],
tools=tools,
)Vision
Send images as part of message content for multimodal models:
resp = client.chat.completions.create(
model="gemini-3-pro-preview",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "What is in this image?"},
{"type": "image_url", "image_url": {"url": "https://example.com/chart.png"}},
],
}],
)Image generation
Image generation uses the standard OpenAI shape:
# Text-to-image (OpenAI-compatible)
client.images.generate(model="cogview-4", prompt="isometric server room, neon")Video generation
Video is long-running — a clip takes roughly 40 to 60 seconds, and the request blocks until the render is finished. You get the file back as a plain URL.
Set your client timeout above 60 seconds; a default 30-second timeout will abandon renders that were about to succeed. If your own UI has to stay responsive, submit from a background worker rather than holding a request open.
# A render takes ~40-60s. The POST blocks and returns the finished clip.
import requests
BASE = "https://helioroute.com/v1"
H = {"Authorization": "Bearer sk-your-key"}
job = requests.post(f"{BASE}/videos", headers=H, json={
"model": "ws-seedance-2.5",
"prompt": "a slow drone shot over misty mountains at sunrise",
}).json()
# job["status"] is "completed" and job["url"] is the finished MP4.
print(job["url"])Music & speech
Speech and music both use the OpenAI audio shape. Voice synthesis is the fastest and cheapest way to put a spoken line in front of a customer; the music models return a full track.
# Speech and music both use the OpenAI audio shape.
from openai import OpenAI
client = OpenAI(base_url="https://helioroute.com/v1", api_key="sk-your-key")
speech = client.audio.speech.create(
model="voice-synthesis-v2",
voice="alloy",
input="Welcome aboard — here is how it works.",
)
speech.stream_to_file("welcome.mp3")Private & Uncensored
Two families sit outside the standard catalogue. Uncensored is a set of open-weight models with no refusals, available on every plan including the free trial. Private is our own family: every tier runs on backends we picked for how rarely they decline, each with a second backend behind it, and a self-healing engine that moves a request along before a refusal ever reaches you. Every tier carries a 1M-token context.
The Uncensored family is six open-weight models, callable on every plan including the free trial:
- unc-hermes-3-405b
- unc-hermes-4-405b
- unc-hermes-3-70b
- unc-wizardlm-2-8x22b
- unc-dolphin-mistral-24b
- unc-mythomax-l2-13b
Pick by level. The price is per 1M tokens and there is no per-seat fee.
| Tier | Level | Best for | In / Out per 1M |
|---|---|---|---|
| pvt-001 | Level 1 · Fast | High-volume, low-latency work | $0.12 / $0.36 |
| pvt-002 | Level 2 · Frontier | Hard reasoning, long agentic runs | $0.60 / $1.80 |
| pvt-003 | Level 3 · Flagship | The heaviest loads and hardest questions | $1.20 / $3.60 |
Which plan opens which tier:
trial_free/starter_10— Uncensored only (unc-*)pro_50— opensPVT-001scale_200— addsPVT-002reseller_1000— the full family, addingPVT-003
Call them exactly like any other model — the only thing that changes between tiers is the model id. The response always names the model you asked for, never the backend that served it.
# The Private family — same key, same base URL, same shape.
from openai import OpenAI
client = OpenAI(base_url="https://helioroute.com/v1", api_key="sk-your-key")
# Only the model id changes between tiers.
reply = client.chat.completions.create(
model="pvt-002",
messages=[{"role": "user", "content": "Your question here"}],
)
print(reply.choices[0].message.content)Access is enforced at the gateway, not merely hidden in the interface: a key that does not carry a tier is refused with 403 when it asks for a model outside it.
Every tier carries a 1M-token context. Live per-model rates for the whole catalogue are on the pricing page.
Errors
Errors follow the OpenAI envelope. Common codes:
401— invalid or revoked key422— credit exhausted; top up in the console429— rate limited; retry with backoff5xx— temporary server error; retries are automatic
{
"error": {
"message": "Your credit has run out, so this request was blocked. Top up to continue - every model, including Claude Opus and GPT-5.4 Pro, unlocks the moment you add credit. Top up here: https://helioroute.com/console/billing",
"type": "budget_exceeded",
"code": "422"
}
}Rate limits
Limits scale with the credit pack you buy, and are enforced per account:
| Plan | Credit | Requests / minute |
|---|---|---|
| trial_free | $2 trial | 20 |
| starter_10 | $10 | 30 |
| pro_50 | $50 | 120 |
| scale_200 | $200 | 500 |
| reseller_1000 | $1000 | 1000 |
Use exponential backoff with jitter on 429 and 5xx.
Something not working?
These are the problems people run into most. If yours is here, it is usually a one-line fix.
| What you see | What it means | What to do |
|---|---|---|
401 / "Invalid API key" | The key was copied wrong or only partly | Copy the key again from the console — make sure there is no space before or after |
404 / "not found" | The Base URL is wrong | The Base URL must contain /v1 — and only once (not /v1/v1) |
403 "is not included in your current plan" | That model is not part of your plan | See pricing — a bigger plan unlocks it |
422 "Your credit has run out" | Your credit ran out | Top up in the console — your balance is the key’s limit |
| Cline chats but will not open or edit files | Tool calling is switched off | Gear ⚙ → Model Configuration → turn Supports Computer Use: ON |
| Replies come back cut short or incomplete | The context window is set wrong | Set the context window to 200000 in your tool |
| Anything else | — | Tell us and we will take a look |
Check these two things first: is the key correct? and does the base URL contain exactly one /v1? Those two mistakes cause almost every problem we see.