Docs

Two minutes to your first token.

Three values — base URL, API key, model id. Every client on this page wants them. Find yours below, paste them in, restart it.

POSTapi.ultracode.in/v1/messages—
base url
https://api.ultracode.in
api key
sk-uc-your-api-key
model id
claude-opus-5-5
the first two go everywherethe third, only where a client asks

choose a client

Find yours. Read one guide. Ignore the other eight.

The first five have a setup script — install, run, restart. The last four are a short form you fill in by hand.

two ways in

the command, or the file

The setup command writes the same configuration you would write yourself. Run it, or skip it and edit the file — the result on disk is identical either way.

the command

One command, every client it finds.

Open a terminal anywhere and run it.

It asks for your key, checks it, looks for clients installed on this machine, writes each one’s configuration and keeps a copy of whatever it replaced. Node.js is the only prerequisite.

PowerShell says running scripts is disabled? Run npx.cmd ultracode-live instead — the same command through cmd’s shim.

what it does

  • Checks the key against api.ultracode.in before writing anything
  • Writes ~/.claude/settings.json — the CLI and the VS Code extension both read it
  • Writes a Claude Desktop profile, if the app is installed
  • Clears stale model variables left behind by other setups
  • Backs up every file it touches before changing it
  • Installs the Claude Code CLI if it is missing

Add --only cli or --only desktop to configure a single surface, or --yes to take every default without being asked.

the same thing, in powershell

An alternative to the command above, if you would rather run a script.

powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
irm https://api.ultracode.in/setup.ps1 | iex

Or take the file: setup-ultracode.ps1

Safe to re-run. It merges rather than replacing, and backs up whatever it touches — so changing your key later is one more run.

Nothing is written until the key has answered. A refused key leaves the machine exactly as it found it.

the file

Or write the file yourself.

Two steps, and no tool between you and the configuration.

  1. Write the settings file

    Create or edit %USERPROFILE%\.claude\settings.json so it reads:

    settings.json
    {
      "env": {
        "ANTHROPIC_AUTH_TOKEN": "sk-uc-your-api-key",
        "ANTHROPIC_BASE_URL": "https://api.ultracode.in",
        "CLAUDE_CODE_OAUTH_TOKEN": "sk-uc-your-api-key",
        "CLAUDE_CODE_SUBSCRIPTION_TYPE": "max",
        "CLAUDE_CODE_REMOTE": "1"
      }
    }
  2. Restart

    Claude Code and any IDE holding it open read this file at startup, so a restart is what applies it.

Web search, image understanding, PDF reading and extended thinking come with every key. Point the client at the base URL and all four work — nothing further to switch on.

the command does it

install · run · restart

These five have a setup script. What differs is which script, and where each one keeps its configuration.

claude code cli

The official terminal client.

Two commands and you are coding.

  1. Install Claude Code

    Globally, from npm.

  2. Run the setup

    It asks for your key and writes the configuration for you.

  3. Start

    Run claude in any project directory.

The full account of what the setup writes is section 01. This guide only sequences it.

claude code · vs code

The extension reads the CLI's file.

If the setup has already run on this machine, step two is nothing.

  1. Install the extension

    Search for Claude Code in the Extensions panel (Ctrl+Shift+X) and install the one published by Anthropic.

  2. Point it here

    Skip this if you already ran it for the CLI — it writes the one file the two of them share.

  3. Reload VS Code

    The extension reads %USERPROFILE%\.claude\settings.json at startup. Open the Claude Code panel and start a session.

One file, both surfaces. Changing your key once is enough for either of them.

claude desktop

The app keeps its own profile.

This is a separate step even if Claude Code is already pointed here.

The desktop app supports third-party inference: you give it a gateway and it uses that instead. It keeps its own configuration, separate from the file the CLI and the VS Code extension share.

  1. Install Claude Desktop

    Download it from claude.ai/download and sign in once, so the app creates its configuration directory.

  2. Point it here

    The plain setup command detects the app and writes the desktop profile alongside everything else; --only desktop writes just this one.

  3. Quit, reopen, pick a model

    Quit the app completely rather than closing the window — the profile is read at launch. The model picker will then list the four models in section 13.

where the profile is written
%LOCALAPPDATA%\Claude-3p\configLibrary

Not ~/.claude/settings.json — that file belongs to Claude Code.

Not sure it took? npx ultracode-live doctor reads the profile back and reports what the app will actually use.

A per-user profile, so no administrator rights are involved, and npx ultracode-live reset removes it again.

openclaw

An open-source alternative CLI.

Install it, run its setup, start it.

  1. Install OpenClaw

    Globally, from npm.

  2. Run the setup

    A wizard: it asks for your key, then writes the provider, the models and the key into OpenClaw’s own configuration.

  3. Start

    Open a fresh terminal, move into any project and run it.

The script registers UltraCode as a custom provider carrying every Claude model. Type /model inside OpenClaw to move between tiers.

opencode

A terminal agent, same three moves.

Install it, run its setup, start it.

  1. Install OpenCode

    With the project’s own install script.

  2. Run the setup

    The same wizard shape: your key, then the provider, models and key written into OpenCode’s configuration.

  3. Start

    Open a fresh terminal, move into your project and run it.

The script registers UltraCode as the Anthropic provider in OpenCode. Type /models to move between tiers.

you fill it in

two values and a name

These four have no setup script. Each wants the same address and the same key; what changes is which provider slot the pair goes into, and what that client calls the fields.

cline · roo code

Two extensions, one set of values.

Both speak the Anthropic API, so both take the Anthropic provider.

  1. Install the extension

    Cline or Roo Code, from the VS Code Marketplace.

  2. Open its provider settings

    In Cline: the icon in the sidebar, then the gear at the top. In Roo Code: its own provider settings.

  3. Fill in four fields

    API Provider
    Anthropic
    Base URL
    https://api.ultracode.in
    API Key
    sk-uc-your-api-key
    Model ID
    claude-opus-5-5
  4. Save

    Click Save. That is the whole of it.

Roo Code takes the same four in the same order under slightly shorter names: Provider, Base URL, API Key and Model.

cursor

Cursor goes through its OpenAI override.

The override carries the pair; you name the model yourself.

  1. Open Cursor Settings

    Ctrl + ,, then go to Models → OpenAI and turn on Override OpenAI Base URL.

  2. Fill in the pair

    Base URL
    https://api.ultracode.in
    API Key
    sk-uc-your-api-key
  3. Add the model by name

    Scroll to Model Names, click + Add Model and type the id exactly.

    model id
    claude-opus-5-5

You can add more than one and switch between them — claude-opus-5-5 and claude-sonnet-5, for instance.

windsurf

Cascade, under its own setting names.

The same override, spelled the way Cascade spells it.

  1. Open settings

    Ctrl + ,, then search for openai.

  2. Fill in three settings

    Cascade: OpenAI Base URL
    https://api.ultracode.in
    Cascade: OpenAI API Key
    sk-uc-your-api-key
    Cascade: Model
    claude-opus-5-5

The Claude Code setup command also runs in Windsurf’s integrated terminal, if you would rather not type any of this.

sdks · anything else

An SDK, or any chat-completions client.

Nothing in your code has to change — only the two values it reads from the environment.

an anthropic sdk

.env
ANTHROPIC_BASE_URL=https://api.ultracode.in
ANTHROPIC_AUTH_TOKEN=sk-uc-your-api-key

a client that speaks the openai format

Four values and nothing else. The route it will call is /v1/chat/completions, which is section 14.

API Base URL
https://api.ultracode.in
API Key
sk-uc-your-api-key
Model Name
claude-opus-5-5
API Type
OpenAI Compatible

The Anthropic SDKs read the host and the credential from the environment, so the pair below is the whole edit. Every call you have already written keeps compiling and keeps streaming.

Continue, Aider, Open Interpreter, LiteLLM, LibreChat, OpenClaw — and anything else built on the same request format.

reference

what to ask for, and how

Three routes, four model ids, and the HTTP surface underneath every client above.

the wire

Three routes. You have already written against all of them.

Nothing here is a translation layer you have to learn.

POST/v1/messages

Anthropic Messages API format

POST/v1/chat/completions

Chat-completions format

GET/v1/models

the models this key may ask for

stream · text/event-streamunchanged
event:message_startthe envelope: id, model, role, usage so far
event:content_block_startone per block — text, tool use, thinking
event:content_block_delta×nthe tokens, as they are produced
event:content_block_stopthat block is closed
event:message_deltastop reason and the final usage count
event:message_stopthe turn is over
same names · same order · same terminatorsyour existing parser is the parser

and the stream comes back in the same order

message_startcontent_block_startcontent_block_deltacontent_block_stopmessage_deltamessage_stop

The paths, the shapes and the order of the events are the ones in the Anthropic reference, which means the parser you wrote for the official endpoint is the parser you keep.

the four tiers

Four models, one key.

Every tier answers on the same key.

Put the id into the client’s model field exactly as it is printed here. There is no second endpoint for the bigger model and no second key for the cheaper one — the tier is a string in the request body.

Opus 5.5

default1,000,000 tokens of context

Whole-repo work. Long refactors that touch forty files, and agentic runs that have to hold the plan from the first tool call to the last.

model id
claude-opus-5-5

Fable 5.1

thinks longest1,000,000 tokens of context

Thinks the longest of the four. Reach for it when being wrong is expensive — a migration plan, a race nobody can reproduce, a schema you pick once.

model id
claude-fable-5-1

Sonnet 5

everyday1,000,000 tokens of context

The middle you will actually live in. Reviews, edits, test scaffolding and the glue code that makes up a working day.

model id
claude-sonnet-5

Haiku 4.5

volume200,000 tokens of context

Built for the tight loop. Classification, extraction, routing and labelling — the calls you make ten thousand times and never read one by one.

model id
claude-haiku-4-5-20251001

on every plan, nothing to wire

  • Live web searchthe model looks things up mid-turn
  • Image understandingscreenshots and diagrams in the same content array
  • PDF and document readingthe file goes in the request
  • Extended thinkingask for more reasoning on the turns that deserve it

Server-side, on all four tiers, on every plan including the trial. No flag, no second vendor, no tool schema to hand-write.

Older Claude model names resolve to the nearest tier, so an integration written before you moved keeps working without an edit.

The settings file in section 02 pins Haiku by its dated name, claude-haiku-4-5-20251001. Same tier, written the long way.

http

When there is no client in the way.

Nothing here is a wrapper — it is the API your client was already calling.

base url
https://api.ultracode.in

authentication

Send one of the first two, not both — an SDK written for either convention needs no adapter here.

x-api-key
sk-uc-your-api-key
Authorization
Bearer sk-uc-your-api-key
anthropic-version
2023-06-01
content-type
application/json

Header names are case-insensitive. The values are not.

your first request

Put your key in and paste it into a terminal. A reply proves the address, the key and the model id are all correct — the whole of setup, checked in one line.

terminal
curl https://api.ultracode.in/v1/messages \
  -H "x-api-key: sk-uc-your-api-key" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-opus-5-5",
    "max_tokens": 256,
    "messages": [{ "role": "user", "content": "Say hello in five words." }]
  }'

what comes back

200 · application/json
{
  "id": "msg_01Xa7bK...",
  "type": "message",
  "role": "assistant",
  "model": "claude-opus-5-5",
  "content": [{ "type": "text", "text": "Hello there, good to meet you." }],
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": { "input_tokens": 14, "output_tokens": 9 }
}

It is the Anthropic Messages API. Anything already written against that runs here unchanged.

The response below is a shape, not a transcript. Add "stream": true to the body for server-sent events, in the format your client already parses.

if it did not take

read it back, or undo it

Two commands nobody needs until they do.

doctor · reset

What the machine actually has.

From the outside, a stale variable and a bad key look identical.

An old install, a leftover environment variable or a company policy pointing somewhere else all fail the same way a refused key does. The first command reads back what is actually configured and names whatever is fighting it. The second puts the machine back the way it was.

read it back
npx ultracode-live doctor
undo it
npx ultracode-live reset

Still stuck? Section 14 has a single curl that tells you whether the fault is the configuration or the key.

reset removes only what the setup wrote. Anything you set by hand is left exactly where you put it.

still not answering

Send the doctor output and we will read it.

Run the first command in section 15, copy what it prints, and mail it over. It names the file it read, the value it found and whatever else on the machine is overriding it — and shows only the start of your key.