Documentation
Setup and API reference
Point your editor at one base URL, paste the key your reseller issued, and pick a model 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 a range of models sits 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 model 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 model the key is entitled to; one is shown here.
{
"data": [
{
"type": "model",
"id": "claude-sonnet-5",
"display_name": "Claude Sonnet 5",
"created_at": "2026-01-01T00:00:00Z",
"object": "model",
"created": 1767225600,
"owned_by": "anthropic"
}
],
"has_more": false,
"first_id": "claude-sonnet-5",
"last_id": "claude-sonnet-5",
"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 modelsLink to this section
Four Claude ids. Put one in your client's model field — exact string, lowercase, hyphens as shown.
| Model id | Picker name | Use it for |
|---|---|---|
| claude-haiku-5 | Claude Haiku 4.5 | Fastest for quick answers. |
| claude-sonnet-5default | Claude Sonnet 5 | Efficient for routine tasks. |
| claude-opus-5 | Claude Opus 5 | Best for everyday, complex tasks. 1M context. |
| claude-fable-5-1 | Claude Fable 5.1 | Most capable for your hardest and longest-running tasks. |
- Ask the gateway what you can use.
GET /v1/modelsis the authoritative answer, and it is specific to your key. In Claude Code the built-in picker rows are mapped onto these ids by the setup below; other clients need the id typed in. - Start on the default and move up only when a job stalls. The heavier models are more capable and use a key’s balance faster.
- Balance is spent on tokens, not messages. An agent resends the whole conversation each turn, so a long run costs more than it looks.
- Your key may not reach every model. One missing from
/v1/modelsis an entitlement question for your reseller, not a bug.
What serves a model name is not published
Which model answers a given name is an operational choice that may change. The name is the stable thing and what your configuration should depend on. Support will not confirm what sits behind one.Client setupLink to this section
One recipe per client. 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. Put the URL and key in VS Code User settings JSON; put the Max-style /model picker in ~/.claude/settings.json.
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. The CLI and the VS Code extension share ~/.claude/settings.json.
claude --versionclaude update
# or, if you installed it with npm:
npm install -g @anthropic-ai/claude-codeStep 2: Point it at the gateway (terminal / CLI)
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
claude- ANTHROPIC_BASE_URL
- Sends requests to Serviqo instead of Anthropic. No /v1 on the end.
- ANTHROPIC_AUTH_TOKEN
- Your key. Sent as the Authorization header on every request.
Step 3: VS Code extension — User settings.json
The Claude Code extension does not read your shell profile. Open Ctrl+Shift+P → Preferences: Open User Settings (JSON), merge this in, replace the key, save, then Developer: Reload Window. It must be an array of name/value objects — a plain object crashes the extension.
Only these two variables. Do not add ANTHROPIC_DEFAULT_OPUS_MODEL (or Sonnet / Haiku / Fable) and do not set CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY — those make /model say “Custom Opus model” instead of the Max labels.
{
"claudeCode.preferredLocation": "panel",
"claudeCode.environmentVariables": [
{
"name": "ANTHROPIC_BASE_URL",
"value": "https://api.serviqo.ai"
},
{
"name": "ANTHROPIC_AUTH_TOKEN",
"value": "YOUR_SERVIQO_KEY"
}
]
}Step 4: Max-style /model picker — ~/.claude/settings.json
This is the file Claude Code uses for the picker. It keeps the key off your bashrc, and modelPicker copies the official Max rows: Default, Opus (1M context), Fable, Sonnet, Haiku.
{
"env": {
"ANTHROPIC_BASE_URL": "https://api.serviqo.ai",
"ANTHROPIC_AUTH_TOKEN": "YOUR_SERVIQO_KEY"
},
"model": "opus[1m]",
"modelPicker": {
"replaceBuiltInOptions": true,
"options": [
{
"model": "opus[1m]",
"label": "Opus (1M context)",
"description": "Opus 5 with 1M context · Best for everyday, complex tasks"
},
{
"model": "fable",
"label": "Fable",
"description": "Fable 5.1 · Most capable for your hardest and longest-running tasks · $10/$50 per Mtok"
},
{
"model": "sonnet",
"label": "Sonnet",
"description": "Sonnet 5 · Efficient for routine tasks"
},
{
"model": "haiku",
"label": "Haiku",
"description": "Haiku 4.5 · Fastest for quick answers"
}
]
}
}Set your default once
The"model" line is the row Claude Code opens on. Keep it as opus[1m], fable, sonnet or haiku. Switch mid-session with /model. After editing, reload the VS Code window.Step 5: Optional: shell profile (CLI only)
cat >> ~/.bashrc <<'SERVIQO'
# Serviqo
export ANTHROPIC_BASE_URL=https://api.serviqo.ai
export ANTHROPIC_AUTH_TOKEN=YOUR_SERVIQO_KEY
SERVIQO
source ~/.bashrcSkip this if you use the VS Code extension and want to keep a Max login as the default on this machine. Shell exports override Max for every Claude Code process started from that shell.
Other shells
set -gx ANTHROPIC_BASE_URL https://api.serviqo.ai
set -gx ANTHROPIC_AUTH_TOKEN YOUR_SERVIQO_KEY[Environment]::SetEnvironmentVariable('ANTHROPIC_BASE_URL', 'https://api.serviqo.ai', 'User')
[Environment]::SetEnvironmentVariable('ANTHROPIC_AUTH_TOKEN', 'YOUR_SERVIQO_KEY', 'User')Step 6: Choose a model
Start Claude Code and type /model. You should see the same rows as Max: Default (recommended), Opus (1M context), Fable, Sonnet, Haiku. The pill shows Opus 5 (1M) when that row is selected. Pick a row; do not type a model id by hand. The gateway accepts the official Anthropic names those rows send.
You can switch models mid-session
No restart and no losing the conversation. Drop to Haiku for a batch of mechanical edits, jump to Fable when you hit something hard, and go back.If /model says “Custom Opus model”
You still have ANTHROPIC_DEFAULT_*_MODEL or gateway discovery in VS Code claudeCode.environmentVariables. Remove those keys, keep only ANTHROPIC_BASE_URL and ANTHROPIC_AUTH_TOKEN, then Developer: Reload Window (or File → Exit and reopen).
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.
claude-sonnet-5Free text, not a dropdown. Type claude-haiku-5, claude-sonnet-5, claude-opus-5 or claude-fable-5-1 exactly.
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 models section.
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 model 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 model supports tool calling, which is what agent mode actually depends on, and every model 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 model 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 models 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 model as its own entry, spelled exactly — all lowercase, single hyphen, no spaces.
claude-haiku-5
claude-sonnet-5
claude-opus-5
claude-fable-5-1Add only the models 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 model 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": "claude-sonnet-5",
"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 non-Claude models
With the override on, Cursor may send its own names —gpt-*, composer, Gemini, Grok — to your base URL. Those are not served here. Built-in Claude rows (including 4.5 / 4 family names) are mapped to the four ids above. Add those ids, turn off Composer and GPT, then pick a Claude model in a new chat.A note about the lightest model in Agent mode
Cursor's Agent sends a lot of context on every turn: open files, retrieved snippets and the whole conversation. The lightest model has the smallest context window and will hit context errors on a real agent task well before the others do. Keep it for short Chat questions and use a heavier one 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>.
claude-sonnet-5Any model 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="claude-sonnet-5",
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: 'claude-sonnet-5',
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 models 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 model 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": "claude-sonnet-5",
"messages": [
{"role": "user", "content": "Reply with the single word: routed."}
],
"max_tokens": 32
}'{
"id": "chatcmpl-6f0c1b94a2",
"object": "chat.completion",
"created": 1767225600,
"model": "claude-sonnet-5",
"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": "claude-sonnet-5",
"messages": [{"role": "user", "content": "Count to three."}],
"stream": true
}'data: {"id":"chatcmpl-6f0c1b94a2","object":"chat.completion.chunk","created":1767225600,"model":"claude-sonnet-5","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl-6f0c1b94a2","object":"chat.completion.chunk","created":1767225600,"model":"claude-sonnet-5","choices":[{"index":0,"delta":{"content":"One"},"finish_reason":null}]}
data: {"id":"chatcmpl-6f0c1b94a2","object":"chat.completion.chunk","created":1767225600,"model":"claude-sonnet-5","choices":[{"index":0,"delta":{"content":" two"},"finish_reason":null}]}
data: {"id":"chatcmpl-6f0c1b94a2","object":"chat.completion.chunk","created":1767225600,"model":"claude-sonnet-5","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]Tool calling
Supported on every model, and checked on every model 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": "claude-sonnet-5",
"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": "claude-sonnet-5",
"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 models 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 model 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.
Each object also carries that model's context_window and max_tokens. Those are left out of the example below on purpose: they differ per model, they can change, and the live response your client already reads is the only correct source for them. Read them from here rather than hardcoding a number.
curl -s https://api.serviqo.ai/v1/models \
-H "Authorization: Bearer YOUR_SERVIQO_KEY"{
"data": [
{
"type": "model",
"id": "claude-sonnet-5",
"display_name": "Claude Sonnet 5",
"created_at": "2026-01-01T00:00:00Z",
"object": "model",
"created": 1767225600,
"owned_by": "anthropic"
}
],
"has_more": false,
"first_id": "claude-sonnet-5",
"last_id": "claude-sonnet-5",
"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": [
"claude-haiku-5",
"claude-sonnet-5",
"claude-opus-5"
],
"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 model 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 model 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 hyphens, e.g. claude-sonnet-5 — or that model is not on your key. Cursor also sends Composer and GPT names, which we do not serve. Built-in Claude rows are mapped. | GET /v1/models returns exactly the ids your key may call. Use one of those, spelled as returned. In Cursor, add the four claude-* ids, turn Composer and GPT off, and start a new chat. |
| 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 Claude model (claude-sonnet-5 or a built-in Claude row), and switch Composer and GPT off. Then quit and reopen Cursor. |
Claude Code /model shows “Custom Opus model” or “Custom Fable model” | VS Code User settings.json still has ANTHROPIC_DEFAULT_*_MODEL or CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY under claudeCode.environmentVariables. Those override ~/.claude/settings.json and relabel the Max picker rows. | Keep only ANTHROPIC_BASE_URL and ANTHROPIC_AUTH_TOKEN in that array. Put the picker in ~/.claude/settings.json (modelPicker), then Developer: Reload Window. Do not set the DEFAULT_* variables in bashrc either if you also use a Max login on this machine. |
Claude Code: 403, “key not allowed to access model … Tried to access claude-…”, and it then drops you out of the session | Claude Code sent a model name this key cannot call — a typo, a leftover "model" in ~/.claude/settings.json, or a name typed into /model by hand. Claude Code treats the refusal as an authentication failure. | Do not set ANTHROPIC_DEFAULT_*_MODEL. Pick a Max row in /model (Opus 1M, Fable, Sonnet, Haiku). The gateway accepts Anthropic's own names for those rows. If you still see this, tell your reseller which name it tried. |
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 models 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.