Documentation
Setup and API reference
Point your editor at one base URL, paste the key your reseller issued, and pick a tier by name. Two minutes for a client; the rest of this page is the API underneath it.
On this page
Getting startedLink to this section
Serviqo is an API gateway. One endpoint answers both the OpenAI and the Anthropic request formats, and five model tiers sit behind it, selected by name.
You need two things.
- A key from your reseller. It starts with
sk-. Serviqo does not sell keys and has no accounts, so there is nothing on this site to sign in to and nothing to buy. If you do not have a key, ask whoever sold you access. The key is the entire credential — anyone holding it can spend its balance, so treat it like a password. - A client that speaks OpenAI or Anthropic. Claude Code, Cline or Roo Code in VS Code, Cursor, or any library built against the OpenAI chat-completions API. All four are covered below.
There is nothing to install from us
No SDK, no plugin, no CLI, no account. Every client on this page is configured with three values: a base URL, your key, and the id of the tier you want.The base URLLink to this section
There are two forms and they are not interchangeable. Getting this wrong is the most common setup failure by a wide margin.
https://api.serviqo.aiAnthropic-shaped clients. No /v1 — Claude Code appends its own path.
https://api.serviqo.ai/v1Cline, Roo Code, Cursor, the OpenAI SDKs, your own script. The /v1 is required.
Two rules, whichever form you are using
- No trailing slash.
https://api.serviqo.ai/v1/makes your client request/v1//chat/completions, which is a 404. - Do not append the path yourself. Your client adds
/chat/completions. A base URL that already ends in it gets the path twice, which is also a 404.
Check that your key worksLink to this section
One request, before you configure anything. It generates nothing, so it costs nothing.
curl -s https://api.serviqo.ai/v1/models \
-H "Authorization: Bearer YOUR_SERVIQO_KEY"A list means the key is live, and any problem you hit afterwards is in your client's settings rather than in the key. There is one object per tier the key is entitled to; one is shown here.
{
"data": [
{
"type": "model",
"id": "serviqo-t2",
"display_name": "Serviqo T2 · Coder",
"created_at": "2026-01-01T00:00:00Z",
"context_window": 262144,
"max_tokens": 16384,
"object": "model",
"created": 1767225600,
"owned_by": "serviqo"
}
],
"has_more": false,
"first_id": "serviqo-t1",
"last_id": "serviqo-t5",
"object": "list"
}- 401 — the key is wrong, expired or revoked. Check it on the key status page, which shows a key's live budget, entitlements and limits without storing anything.
- 404 — the path is mistyped. Copy the command rather than retyping it.
- No response at all — the gateway is unreachable from your network. The status page says whether that is us or you.
The tiersLink to this section
Five tiers behind one key. You select one by putting its id in your client's model field — the exact string, lowercase, one hyphen.
| Model id | What it is | Context | Max output | Credit use |
|---|---|---|---|---|
| serviqo-t1Flash | Cheap and quick. Good for small edits, questions and iteration. | 131,072 | 8,192 | Lowest |
| serviqo-t2Coder | Purpose-built for code. The sensible default for agent work. | 262,144 | 16,384 | Low |
| serviqo-t3Plus | Strong generalist with a very large context window. | 262,144 | 32,768 | Moderate |
| serviqo-t4Pro | High-capability coding and long-horizon agent work. | 262,144 | 32,768 | High |
| serviqo-t5Flagship | The heavy one. Reach for it when the others stall. | 262,144 | 65,536 | Highest |
- Start on
serviqo-t2. It is built for code and it is the right default for agent work. Drop a tier for throwaway questions; step up when a task visibly stalls. - Higher tiers spend credit considerably faster. Credit is consumed on the tokens actually used, not per message, and an agent resends the whole conversation on every turn — so a long agent run on a high tier is genuinely expensive. Exploring on a middle tier and switching up for the hard step is the cheap way to work.
- Your key may not include every tier.
GET /v1/modelsis the authoritative answer to what you can call. A tier missing from that list is an entitlement question for your reseller, not a bug. - Context is the whole conversation, not just your message. Agents resend everything each turn, so long sessions on a large codebase want a bigger window.
What serves a tier is not published
Tiers are described by capability, context and speed. Which model answers a given tier is an operational choice that may change; the tier id is the stable name and the thing your configuration should depend on. Support will not confirm what sits behind one.Client setupLink to this section
Four recipes. They differ only in where the three values go, and in one case in how much of the editor actually routes through us.
Claude CodeLink to this section
Claude Code speaks the Anthropic API and the gateway answers it, so this is three environment variables. No plugin, no config file, no patched install.
The base URL here has no /v1
Claude Code appends its own path. That is the opposite of every other client on this page, and it is the mistake people make when they set up two of them.Step 1: Check your version
You need 2.1.129 or newer. Older builds cannot discover models from a gateway, so the model picker comes up empty.
claude --versionclaude update
# or, if you installed it with npm:
npm install -g @anthropic-ai/claude-codeStep 2: Point it at the gateway
These apply to the current terminal only — nothing permanent, undone by closing the window. Replace YOUR_SERVIQO_KEY with your key.
export ANTHROPIC_BASE_URL=https://api.serviqo.ai
export ANTHROPIC_AUTH_TOKEN=YOUR_SERVIQO_KEY
export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1
claude- ANTHROPIC_BASE_URL
- Sends requests to Serviqo instead of Anthropic.
- ANTHROPIC_AUTH_TOKEN
- Your key. Sent as the Authorization header on every request.
- CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY
- Lets Claude Code ask the gateway which tiers your key includes instead of assuming a fixed built-in list. Without it the model picker is empty.
Step 3: Make it permanent
cat >> ~/.bashrc <<'SERVIQO'
# Serviqo
export ANTHROPIC_BASE_URL=https://api.serviqo.ai
export ANTHROPIC_AUTH_TOKEN=YOUR_SERVIQO_KEY
export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1
SERVIQO
source ~/.bashrcOther shells, and how to keep the key out of your shell profile
set -gx ANTHROPIC_BASE_URL https://api.serviqo.ai
set -gx ANTHROPIC_AUTH_TOKEN YOUR_SERVIQO_KEY
set -gx CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY 1[Environment]::SetEnvironmentVariable('ANTHROPIC_BASE_URL', 'https://api.serviqo.ai', 'User')
[Environment]::SetEnvironmentVariable('ANTHROPIC_AUTH_TOKEN', 'YOUR_SERVIQO_KEY', 'User')
[Environment]::SetEnvironmentVariable('CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY', '1', 'User'){
"env": {
"ANTHROPIC_BASE_URL": "https://api.serviqo.ai",
"ANTHROPIC_AUTH_TOKEN": "YOUR_SERVIQO_KEY",
"CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "1"
}
}Step 4: Choose a tier
Start Claude Code and type /model. It lists exactly the tiers your key is entitled to — no more, no fewer — each labelled From gateway, which only means the model came from us rather than being built into Claude Code.
You can switch tiers mid-session
No restart and no losing the conversation. Drop to a cheap tier for a batch of mechanical edits, jump up when you hit something hard, and go back.A 401 that looks like a bad key, but is not
If you have used Claude Code with Anthropic directly, you may still have ANTHROPIC_API_KEY set somewhere. It takes priority over ANTHROPIC_AUTH_TOKEN, so your old Anthropic key is sent to us and refused.
echo $ANTHROPIC_API_KEY # should print nothing
unset ANTHROPIC_API_KEY # and remove it from your shell profile tooCline and Roo CodeLink to this section
Two different VS Code extensions, configured identically — Roo Code began as a fork of Cline. Install whichever you prefer; the settings below are the same for both.
This is the setup we recommend
Everything routes through Serviqo: chat, full agent mode, reading and editing files, creating new ones, running terminal commands. Nothing is carved out and sent elsewhere.Step 1: Install the extension
In VS Code — or VSCodium, or Windsurf — open the Extensions view with Ctrl+Shift+X (Cmd+Shift+X on macOS), search for Cline or Roo Code, and install one of them. Then click its icon in the activity bar to open the panel.
Step 2: Enter the settings
Open Settings — the gear at the top of the extension panel — and enter exactly this.
OpenAI Compatiblehttps://api.serviqo.ai/v1Must end in /v1. No trailing slash, and do not add /chat/completions — the extension appends that itself.
YOUR_SERVIQO_KEYThe key on its own. No 'Bearer' in front of it.
serviqo-t2Free text, not a dropdown. Type a tier id exactly, all lowercase.
Then click Done. If your version shows an optional Model Configuration section — context window, max output tokens, image support — leaving it at the defaults is fine. If you would rather set it exactly, the numbers are in the tier table.
Step 3: Say hello
In the extension's chat box, type:
Read the files in this folder and tell me what this project does.If you get an answer, you are done.
The three things people get wrong
- The base URL must be exactly
https://api.serviqo.ai/v1. Nothing after the/v1, no trailing slash. A 404 or “Invalid URL” is almost always the URL and nothing else. - The model id is typed, not picked. It is a free-text field on the OpenAI Compatible provider, and it is case-sensitive and hyphenated.
- The key field takes the key alone. A pasted
Bearer sk-…gives a 401.
Agent mode works fully
On any tier the extension can:
- read your files and search the workspace;
- edit existing files and create new ones, with diffs you approve;
- run terminal commands and read their output;
- work through a multi-step task on its own.
That works because every tier supports tool calling, which is what agent mode actually depends on, and every tier is checked for it before release. A gateway that quietly drops tool calls is a gateway where agent mode appears to do nothing.
One habit worth keeping: leave auto-approve off until you trust a tier on your codebase. Approving the first few edits and commands by hand costs nothing and tells you a lot.
CursorLink to this section
Cursor's Chat and Agent can be pointed at the gateway. The rest of the editor cannot. Read the next paragraph before you configure anything.
Tab autocomplete and inline edit will NOT use Serviqo
Cursor only lets you redirect Chat and Agent. Tab autocomplete and inline edit (Cmd+K on macOS, Ctrl+K on Windows and Linux) keep running on Cursor's own servers no matter what you configure here. There is no setting, in Cursor or in Serviqo, that changes this. It is an architectural limitation of Cursor, not of Serviqo, and we cannot work around it.
- You still need a Cursor account, and Tab is still billed by Cursor under your Cursor plan.
- Your Serviqo credit is only ever spent by Chat and Agent.
- Code you type near the cursor is still sent to Cursor's servers for Tab suggestions.
- Even for Chat and Agent, requests travel Cursor → Serviqo. Cursor relays your key and your prompt through its own backend on every request. That is how the feature is built; it is not optional.
- Code indexing and semantic search also stay on Cursor's infrastructure.
If you want everything — completion, inline edit, chat and agent — routed through Serviqo and nowhere else, use Cline or Roo Code instead.
Cursor is still a reasonable choice if you mainly want the agent on Serviqo tiers and are content to keep paying Cursor for Tab. Go in knowing which half is which.
Step 1: Open Cursor's model settings
Cmd+Shift+J on macOS, Ctrl+Shift+J on Windows and Linux, then Models in the sidebar. This is Cursor's own settings window, not VS Code's. If the shortcut does nothing on your build, run Cursor Settings from the command palette. Scroll to API Keys.
Step 2: Enter the key and the base URL
YOUR_SERVIQO_KEYThe OpenAI field specifically — not Anthropic, Google, Azure or Bedrock. Those use different request formats and will not work.
onToggle it on. The URL field can hold text while the toggle is off, which looks configured but is not.
https://api.serviqo.ai/v1Cursor appends /chat/completions to whatever you type, so the /v1 is required and the trailing slash must not be there.
If Verify fails, do not stop
Verify only checks that Cursor can reach the URL and that the key is accepted. It reports failure on perfectly good configurations, and passing it does not mean a model id is valid. The real test is step 4.Step 3: Add the model ids by hand
Cursor does not ask us which models you may use. On the same Models page click + Add Model and add each tier as its own entry, spelled exactly — all lowercase, single hyphen, no spaces.
serviqo-t1
serviqo-t2
serviqo-t3
serviqo-t4
serviqo-t5Add only the tiers your key includes; one you are not entitled to produces an error the first time you select it. This lists exactly which those are:
curl -s https://api.serviqo.ai/v1/models \
-H "Authorization: Bearer YOUR_SERVIQO_KEY"Step 4: Verify it really is going through the gateway
Do not assume. Cursor's failure mode is to answer silently from one of its own models. Open Chat (Cmd/Ctrl+L), select a tier in the model picker, and send something trivial:
Reply with the single word: routed.Then open the key status page and look at the spend. Spend is recorded a moment after a request finishes, so give it up to a minute. If the reply arrives but spend does not move, the request did not go through us.
A check that takes Cursor out of the picture entirely:
curl -s https://api.serviqo.ai/v1/chat/completions \
-H "Authorization: Bearer YOUR_SERVIQO_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "serviqo-t2",
"messages": [
{"role": "user", "content": "Reply with the single word: routed."}
],
"max_tokens": 32
}'A reply here means the key and the gateway are fine and anything still wrong is in Cursor's settings. An error here names the actual problem.
Turning off Cursor's built-in models
With the override on, Cursor may send its own model names —gpt-4o, claude-*, composer — to your base URL as well. We do not serve those, so selecting one gives “model not found” rather than a silent fallback. If Cursor keeps drifting back to a built-in model, switch the built-ins off in the model list so that only the tier entries remain selectable. Some builds do not need this; do it only if you hit the problem.A note about the smallest tier in Agent mode
Cursor's Agent sends a lot of context on every turn: open files, retrieved snippets and the whole conversation. The lowest tier has the smallest window of the five and will hit context errors on a real agent task well before the others do. Keep it for short Chat questions and use a middle tier or above for Agent.
Any OpenAI-compatible clientLink to this section
Anything built against the OpenAI chat-completions API works unchanged: the official SDKs, LangChain, LlamaIndex, Aider, Continue, a self-hosted chat UI, your own script.
Three values, wherever that client keeps them.
https://api.serviqo.ai/v1With the /v1. No trailing slash.
YOUR_SERVIQO_KEYSent as Authorization: Bearer <key>.
serviqo-t2Any tier id your key is entitled to. GET /v1/models lists them.
from openai import OpenAI
client = OpenAI(
base_url="https://api.serviqo.ai/v1",
api_key="YOUR_SERVIQO_KEY",
)
response = client.chat.completions.create(
model="serviqo-t2",
messages=[{"role": "user", "content": "Reply with the single word: routed."}],
)
print(response.choices[0].message.content)import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://api.serviqo.ai/v1',
apiKey: 'YOUR_SERVIQO_KEY',
});
const response = await client.chat.completions.create({
model: 'serviqo-t2',
messages: [{ role: 'user', content: 'Reply with the single word: routed.' }],
});
console.log(response.choices[0].message.content);If a client asks for a provider
Choose “OpenAI” or “OpenAI Compatible” and override the base URL. Do not choose Anthropic, Azure, Google or Bedrock — those send a different request shape to a different path, and the key field in them is not the field you want.API referenceLink to this section
What the clients above are doing, in case you are writing the request yourself.
- Two vocabularies, one host.
https://api.serviqo.ai/v1/chat/completionsis the OpenAI chat API. Anthropic-format requests — what Claude Code sends — are served on the same host from the bare origin,https://api.serviqo.ai. You do not pick between them: you point a client at the base URL for the format it already speaks. - Authentication is one header.
Authorization: Bearer <your key>on every request. There is no other credential, no signing and no session. - A request may run for up to ten minutes. Agent turns on the larger tiers legitimately take minutes, so nothing shorter is imposed. Streaming responses are flushed as they arrive rather than buffered.
Unknown parameters are dropped, not rejected
Clients send fields that a given model does not accept — Cursor and Cline both do. A request carrying an unsupported parameter is served without it rather than answered with a 400, so an editor that sends something unusual still gets a reply.POST /v1/chat/completionsLink to this section
The endpoint that generates. Standard OpenAI request and response bodies; the model field takes a tier id.
https://api.serviqo.ai/v1/chat/completionsAuthenticated. Send Authorization: Bearer <your key>.
curl -s https://api.serviqo.ai/v1/chat/completions \
-H "Authorization: Bearer YOUR_SERVIQO_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "serviqo-t2",
"messages": [
{"role": "user", "content": "Reply with the single word: routed."}
],
"max_tokens": 32
}'{
"id": "chatcmpl-6f0c1b94a2",
"object": "chat.completion",
"created": 1767225600,
"model": "serviqo-t2",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "routed"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 16,
"completion_tokens": 2,
"total_tokens": 18
}
}Streaming
Set "stream": true. Chunks arrive as server-sent events, one data: line each, carrying choices[0].delta instead of choices[0].message, and the stream ends with a literal data: [DONE]. Nothing is buffered on our side, so tokens reach the editor as they are produced.
curl -N https://api.serviqo.ai/v1/chat/completions \
-H "Authorization: Bearer YOUR_SERVIQO_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "serviqo-t2",
"messages": [{"role": "user", "content": "Count to three."}],
"stream": true
}'data: {"id":"chatcmpl-6f0c1b94a2","object":"chat.completion.chunk","created":1767225600,"model":"serviqo-t2","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl-6f0c1b94a2","object":"chat.completion.chunk","created":1767225600,"model":"serviqo-t2","choices":[{"index":0,"delta":{"content":"One"},"finish_reason":null}]}
data: {"id":"chatcmpl-6f0c1b94a2","object":"chat.completion.chunk","created":1767225600,"model":"serviqo-t2","choices":[{"index":0,"delta":{"content":" two"},"finish_reason":null}]}
data: {"id":"chatcmpl-6f0c1b94a2","object":"chat.completion.chunk","created":1767225600,"model":"serviqo-t2","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]Tool calling
Supported on every tier, and checked on every tier before release. This is the mechanism agent mode is built on: it is how an extension gets the model to ask for a file read, an edit or a shell command. A gateway that drops tool calls is one where agent mode appears to do nothing at all, which is why it is verified rather than assumed.
curl -s https://api.serviqo.ai/v1/chat/completions \
-H "Authorization: Bearer YOUR_SERVIQO_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "serviqo-t2",
"messages": [{"role": "user", "content": "What is in the src directory?"}],
"tools": [{
"type": "function",
"function": {
"name": "list_files",
"description": "List the files in a directory.",
"parameters": {
"type": "object",
"properties": {"path": {"type": "string"}},
"required": ["path"]
}
}
}]
}'{
"id": "chatcmpl-6f0c1b94a2",
"object": "chat.completion",
"created": 1767225600,
"model": "serviqo-t2",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_ph39Ktz1",
"type": "function",
"function": {
"name": "list_files",
"arguments": "{\"path\":\"src\"}"
}
}
]
},
"finish_reason": "tool_calls"
}
],
"usage": {
"prompt_tokens": 96,
"completion_tokens": 21,
"total_tokens": 117
}
}Note finish_reason: "tool_calls", and that arguments is a JSON string rather than an object — parse it. Run the tool, append the result to the conversation as a role: "tool" message carrying the same tool_call_id, and call the endpoint again.
GET /v1/modelsLink to this section
The tiers this key may call. The authoritative answer to “which model ids can I type”.
https://api.serviqo.ai/v1/modelsAuthenticated. Send Authorization: Bearer <your key>.
Scoped to the key in the request. A tier absent from the list is not on your key — that is an entitlement, not a fault, and your reseller is the one who can change it. A key asking this question learns nothing about any other key.
The objects carry both the Anthropic and the OpenAI field vocabularies at once: type, display_name, created_at and context_window for Claude Code's gateway discovery; object, created and owned_by for OpenAI-shaped clients. Clients ignore the fields they do not recognise, so a single response satisfies all of them and nobody has to choose a mode.
curl -s https://api.serviqo.ai/v1/models \
-H "Authorization: Bearer YOUR_SERVIQO_KEY"{
"data": [
{
"type": "model",
"id": "serviqo-t2",
"display_name": "Serviqo T2 · Coder",
"created_at": "2026-01-01T00:00:00Z",
"context_window": 262144,
"max_tokens": 16384,
"object": "model",
"created": 1767225600,
"owned_by": "serviqo"
}
],
"has_more": false,
"first_id": "serviqo-t1",
"last_id": "serviqo-t5",
"object": "list"
}GET /key/infoLink to this section
A key reading its own record — no privileged credential involved. This is what the key status page calls.
https://api.serviqo.ai/key/infoAuthenticated. Send Authorization: Bearer <your key>.
Not reachable from the public internet
The gateway's key administration — minting, inspecting and revoking keys — lives under the same /key/ prefix, so the whole prefix is refused at the edge and this URL answers 404 from outside our network. It is documented because it is how the key status page works, and because that page's privacy claim only makes sense if you can see the call it makes.
Authenticate as a key and the gateway returns that key's own record. Authenticate as a key and ask about a different one and you are told it does not exist. That asymmetry is the whole reason this can be exposed to a web page at all: the key status page holds no administrative credential, and could not read anyone else's key if it wanted to.
curl -s https://api.serviqo.ai/key/info \
-H "Authorization: Bearer YOUR_SERVIQO_KEY"{
"key": "9c1e0f6b2a7d4e8f5b3a1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f",
"info": {
"key_name": "sk-...8Qd1",
"key_alias": "reseller-0142",
"spend": 3.4172,
"max_budget": 25,
"models": [
"serviqo-t1",
"serviqo-t2",
"serviqo-t3"
],
"rpm_limit": 60,
"tpm_limit": 200000,
"expires": "2026-12-31T23:59:59Z",
"budget_duration": "30d",
"budget_reset_at": "2026-09-29T00:00:00Z",
"blocked": false
}
}- key_alias
- A label set by whoever issued the key. Not a secret.
- spend / max_budget
- The gateway’s own budget accounting, in its internal units. The key status page renders your position in credits; nothing on this site asks you to read these two numbers directly.
- models
- The tier ids this key may call — the same list GET /v1/models returns.
- rpm_limit / tpm_limit
- Requests and tokens per minute. Null means unlimited.
- expires
- When the key stops working, ISO 8601. Null means it does not expire on its own.
- budget_duration / budget_reset_at
- A recurring budget window, if the key has one, and when the next reset happens. Absent on a key with a single fixed balance.
- blocked
- True when an operator has stopped the key. Requests are refused while it is set.
GET /health/livelinessLink to this section
Is the gateway process up and serving. No key, no body, cheap enough to poll.
https://api.serviqo.ai/health/livelinessNo authentication. Safe to poll from a monitor.
curl -s https://api.serviqo.ai/health/liveliness"I'm alive!"A response means the gateway is reachable from where you are, so any failure you are chasing is your key, your URL or your client. No response means the network between you and us, or us. /health/readiness answers the same question with a little more detail about the gateway's own dependencies.
The status page polls this for you and shows the tier list alongside it, which is usually quicker than opening a terminal.
TroubleshootingLink to this section
Almost everything is one of the first two rows.
| Symptom | Cause | Fix |
|---|---|---|
404, “Not Found”, “Invalid URL” | The base URL is not exactly …/v1. This is the single most common mistake. A trailing slash makes the client request /v1//chat/completions; /chat/completions pasted into the base URL gets appended a second time. Both are 404s. | Set it to exactly https://api.serviqo.ai/v1 and nothing more — no trailing slash, no path after it. Claude Code is the one exception: it wants the bare origin, https://api.serviqo.ai, with no /v1. |
401, “invalid API key”, “authentication error” | The key is mistyped, truncated, expired or revoked — or you pasted Bearer sk-… into a field that wants the key on its own. | Re-paste the key by itself, with no surrounding whitespace, and confirm it is live on the key status page. In Claude Code, a leftover ANTHROPIC_API_KEY takes priority over ANTHROPIC_AUTH_TOKEN and gets sent to us instead; unset it. |
| “Model not found”, “The model does not exist” | Either a typo — ids are lowercase with a single hyphen — or that tier is not on your key. Cursor also sends its own built-in names, which we do not serve. | GET /v1/models returns exactly the ids your key may call. Use one of those, spelled as returned. In Cursor, switch the built-in models off so only the tier entries remain selectable. |
| Requests refused, “budget exceeded”, “insufficient credit” | The credit on the key is spent, or its budget window has not reset yet. | Check the balance on the key status page, then ask your reseller to top the key up. Nothing needs reconfiguring — the same key resumes working the moment credit is added. |
| A long agent run stops part-way through an answer | A single request is capped at ten minutes. Individual steps rarely reach that, so a run that dies earlier is usually a proxy or VPN closing an idle connection. | Retry — agents resume from the last completed step rather than starting over. Then break the task into smaller steps, trim what is in context, or move to a tier with a larger window. Try the same prompt off the VPN to rule the network in or out. |
| Cursor's Tab autocomplete still works when the key has no credit left | Expected. Tab runs on Cursor's own servers and is billed under your Cursor plan. It never reached us in the first place. | Nothing to fix. The reverse also holds: if your Cursor completion quota runs out, Tab stops even with a full balance here. The two are entirely separate. |
| Cursor answers, but the key's spend never moves | Cursor answered from one of its own models and never called us. | Confirm Override OpenAI Base URL is toggled on and saved — the field can hold text while the toggle is off. Start a new chat, since Cursor remembers the model per conversation, select a tier model, and switch the built-ins off. Then quit and reopen Cursor. |
Claude Code's /model list is empty, or shows only built-in models | Claude Code is older than 2.1.129, or CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY is not set in the shell it is running in. | Run claude --version, then echo $CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY — it should print 1. Editing a shell profile does not change a terminal that is already open. |
429, “rate limit” | Your key carries a requests-per-minute or tokens-per-minute limit and you are over it. | Wait and retry; agents back off on their own. If it happens during ordinary use, the limit on the key is set too low — that is your reseller's to raise. |
| Output arrives in bursts, or the editor looks frozen | Something between you and the gateway is buffering the response stream, usually a corporate proxy or VPN. | Try the same prompt on another network. We stream tokens without buffering, so a stream that arrives in lumps is being reassembled somewhere in between. |
| An identical request comes back instantly | The gateway caches completions, so a byte-identical repeat can be served from that cache. | Not a fault, and not something to work around. Any change to the request produces a fresh generation, which is what happens naturally in an agent session. |
Still stuck
Have these four things ready and most problems resolve in one reply.
- The output of the
GET /v1/modelsrequest above. It contains no secrets — the key is in the request, not the response. - The exact model id you selected, copied rather than retyped.
- The exact error text your client showed, in full.
- Whether the plain
curlchat request succeeded.
Take them to the reseller who issued your key. They can see the sale, top the key up, raise its limits, change which tiers it includes, and reissue it if it has leaked. Serviqo operates the gateway and enforces whatever is attached to a key; it does not hold your account, because there is no account to hold. The terms and privacy page sets out where that line falls.