Serviqo— home

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.

  1. 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.
  2. 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.
Note:

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.

Claude Codehttps://api.serviqo.ai

Anthropic-shaped clients. No /v1 — Claude Code appends its own path.

Everything elsehttps://api.serviqo.ai/v1

Cline, Roo Code, Cursor, the OpenAI SDKs, your own script. The /v1 is required.

Warning:

Two rules, whichever form you are using

  1. No trailing slash. https://api.serviqo.ai/v1/ makes your client request /v1//chat/completions, which is a 404.
  2. 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.

Ask the gateway which models this key may call
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.

Expected response, abridged to a single entry
{
  "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 idPicker nameUse it for
claude-haiku-5Claude Haiku 4.5Fastest for quick answers.
claude-sonnet-5defaultClaude Sonnet 5Efficient for routine tasks.
claude-opus-5Claude Opus 5Best for everyday, complex tasks. 1M context.
claude-fable-5-1Claude Fable 5.1Most capable for your hardest and longest-running tasks.
  • Ask the gateway what you can use. GET /v1/models is 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/models is an entitlement question for your reseller, not a bug.
Note:

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.

Warning:

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 --version
If it is older
claude update
# or, if you installed it with npm:
npm install -g @anthropic-ai/claude-code

Step 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.

Try it right now
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.

VS Code User settings.json (~/.config/Code/User/settings.json on Linux)
{
  "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.

~/.claude/settings.json — use this OR shell exports for the key, not both in conflicting ways
{
  "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"
      }
    ]
  }
}
Note:

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)

bash — the same with ~/.zshrc on macOS, where zsh is the default
cat >> ~/.bashrc <<'SERVIQO'

# Serviqo
export ANTHROPIC_BASE_URL=https://api.serviqo.ai
export ANTHROPIC_AUTH_TOKEN=YOUR_SERVIQO_KEY
SERVIQO

source ~/.bashrc

Skip 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
fish — ~/.config/fish/config.fish
set -gx ANTHROPIC_BASE_URL https://api.serviqo.ai
set -gx ANTHROPIC_AUTH_TOKEN YOUR_SERVIQO_KEY
Windows PowerShell, set for your user account. Then open a NEW window — existing ones will not see the change.
[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.

Note:

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.
Warning:

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).

Warning:

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 too

Cline 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.

Confirmed:

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.

API ProviderOpenAI Compatible
Base URLhttps://api.serviqo.ai/v1

Must end in /v1. No trailing slash, and do not add /chat/completions — the extension appends that itself.

API KeyYOUR_SERVIQO_KEY

The key on its own. No 'Bearer' in front of it.

Model IDclaude-sonnet-5

Free 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.

Warning:

The three things people get wrong

  1. 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.
  2. 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.
  3. 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.

Important:

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

OpenAI API KeyYOUR_SERVIQO_KEY

The OpenAI field specifically — not Anthropic, Google, Azure or Bedrock. Those use different request formats and will not work.

Override OpenAI Base URLon

Toggle it on. The URL field can hold text while the toggle is off, which looks configured but is not.

Base URLhttps://api.serviqo.ai/v1

Cursor appends /chat/completions to whatever you type, so the /v1 is required and the trailing slash must not be there.

Note:

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.

Model names, one entry each
claude-haiku-5
claude-sonnet-5
claude-opus-5
claude-fable-5-1

Add 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:

The ids your key may call, straight from the gateway
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:

The same request, sent by hand
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.

Warning:

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.

Base URLhttps://api.serviqo.ai/v1

With the /v1. No trailing slash.

API keyYOUR_SERVIQO_KEY

Sent as Authorization: Bearer <key>.

Modelclaude-sonnet-5

Any model id your key is entitled to. GET /v1/models lists them.

Python — the openai package, unmodified
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)
Node — the openai package, unmodified
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);
Note:

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/completions is 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.
Note:

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.

POSThttps://api.serviqo.ai/v1/chat/completions

Authenticated. Send Authorization: Bearer <your key>.

Request
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
  }'
Response
{
  "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.

Request
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
  }'
Response — server-sent events, abridged
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.

Request
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"]
        }
      }
    }]
  }'
Response
{
  "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”.

GEThttps://api.serviqo.ai/v1/models

Authenticated. 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.

Request
curl -s https://api.serviqo.ai/v1/models \
  -H "Authorization: Bearer YOUR_SERVIQO_KEY"
Response — one object per entitled model, one shown
{
  "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.

GEThttps://api.serviqo.ai/key/info

Authenticated. Send Authorization: Bearer <your key>.

Warning:

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.

The request the key status page makes, server-side
curl -s https://api.serviqo.ai/key/info \
  -H "Authorization: Bearer YOUR_SERVIQO_KEY"
Response
{
  "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.

GEThttps://api.serviqo.ai/health/liveliness

No authentication. Safe to poll from a monitor.

Request
curl -s https://api.serviqo.ai/health/liveliness
Response
"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.

Common symptoms, what causes them, and what to do about each.
SymptomCauseFix
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 answerA 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 leftExpected. 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 movesCursor 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 sessionClaude 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 frozenSomething 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 instantlyThe 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.

  1. The output of the GET /v1/models request above. It contains no secrets — the key is in the request, not the response.
  2. The exact model id you selected, copied rather than retyped.
  3. The exact error text your client showed, in full.
  4. Whether the plain curl chat 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.