// documentation
Setup guide
Everything you need to point a client at Kodex AI: install, configure your IDE, and call the API. If you already have a key, it takes about a minute.
Drop-in compatible
No SDK changes
Per-key budgets
5-hour rolling window
Built-in tools
Server-side web search
One base URL
Anthropic + OpenAI formats
Prerequisites
- Node.js 18 or newer (for Claude Code) — nodejs.org
- A Kodex API key (
sk-kodex-…) — issued by your admin or reseller - A supported client — Claude Code, VS Code, Cursor, Windsurf, Cline, Roo Code or Continue
Base URLs & endpoints
https://softsave.tech/api/publichttps://softsave.tech/api/public/v1POST https://softsave.tech/api/public/v1/messages Anthropic Messages (stream / non-stream)
POST https://softsave.tech/api/public/v1/chat/completions OpenAI Chat Completions (stream / non-stream)
GET https://softsave.tech/api/public/v1/models List models (public)
GET https://softsave.tech/check-key Check a key's status & usage
GET https://softsave.tech/setup.ps1 Windows installer
GET https://softsave.tech/setup.sh macOS / Linux installerQuick install
The installer asks for your key, checks it with the server, writes Claude Code settings (backing up any old file) and sets environment variables.
- Asks for your API key
- Verifies the key with the server
- Writes
~/.claude/settings.json - Saves
ANTHROPIC_*andOPENAI_*environment variables
Windows — PowerShell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
irm https://softsave.tech/setup.ps1 | iex$env:KODEX_API_KEY = "sk-kodex-xxx"; irm https://softsave.tech/setup.ps1 | iexInvoke-WebRequest https://softsave.tech/setup.ps1 -OutFile setup.ps1
.\setup.ps1macOS and Linux
curl -fsSL https://softsave.tech/setup.sh | bashKODEX_API_KEY=sk-kodex-xxx bash -c "$(curl -fsSL https://softsave.tech/setup.sh)"curl -fsSL https://softsave.tech/setup.sh -o setup.sh
bash setup.shClaude Code CLI
Automatic: run the installer above. Manual: create or edit ~/.claude/settings.json:
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY",
"ANTHROPIC_BASE_URL": "https://softsave.tech/api/public",
"ANTHROPIC_MODEL": "anthropic/claude-sonnet-4.5",
"ANTHROPIC_SMALL_FAST_MODEL": "google/gemini-2.5-flash",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "anthropic/claude-sonnet-4.5",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "anthropic/claude-sonnet-4.5",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "google/gemini-2.5-flash",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
},
"hasCompletedOnboarding": true
}Or set it only for the current terminal:
export ANTHROPIC_BASE_URL=https://softsave.tech/api/public
export ANTHROPIC_AUTH_TOKEN=YOUR_API_KEY
claude$env:ANTHROPIC_BASE_URL = "https://softsave.tech/api/public"
$env:ANTHROPIC_AUTH_TOKEN = "YOUR_API_KEY"
claudeVS Code
The Claude Code VS Code extension reads the same ~/.claude/settings.json. Restart VS Code after saving.
Cursor
Settings → Models → add an OpenAI-compatible model:
Base URL: https://softsave.tech/api/public/v1
API key: YOUR_API_KEY
Model: anthropic/claude-sonnet-4.5Windsurf
Settings → AI Provider → OpenAI-compatible:
Base URL: https://softsave.tech/api/public/v1
API key: YOUR_API_KEYCline
{
"cline.apiProvider": "anthropic",
"cline.anthropicBaseUrl": "https://softsave.tech/api/public",
"cline.apiKey": "YOUR_API_KEY"
}Roo Code
{
"roo-cline.apiProvider": "anthropic",
"roo-cline.anthropicBaseUrl": "https://softsave.tech/api/public",
"roo-cline.apiKey": "YOUR_API_KEY"
}Or choose the "OpenAI Compatible" provider with base URL https://softsave.tech/api/public/v1.
Continue
models:
- name: Kodex
provider: openai
model: anthropic/claude-sonnet-4.5
apiBase: https://softsave.tech/api/public/v1
apiKey: YOUR_API_KEYAuthentication
Every API endpoint accepts your key in either header:
x-api-key: YOUR_API_KEY
# or
Authorization: Bearer YOUR_API_KEYMessages (Anthropic format)
{
"model": "anthropic/claude-sonnet-4.5",
"max_tokens": 1024,
"messages": [{ "role": "user", "content": "Hello!" }],
"stream": false
}{
"id": "msg_...",
"type": "message",
"role": "assistant",
"model": "anthropic/claude-sonnet-4.5",
"content": [{ "type": "text", "text": "Hello! How can I help you today?" }],
"stop_reason": "end_turn",
"usage": { "input_tokens": 12, "output_tokens": 15 }
}curl https://softsave.tech/api/public/v1/messages \
-H "x-api-key: YOUR_API_KEY" \
-H "content-type: application/json" \
-d '{"model":"anthropic/claude-sonnet-4.5","max_tokens":1024,"messages":[{"role":"user","content":"Hello"}]}'$body = @{ model = "anthropic/claude-sonnet-4.5"; max_tokens = 1024; messages = @(@{ role = "user"; content = "Hello" }) } | ConvertTo-Json -Depth 5
Invoke-RestMethod -Method Post -Uri "https://softsave.tech/api/public/v1/messages" -Headers @{ "x-api-key" = "YOUR_API_KEY" } -ContentType "application/json" -Body $bodyimport anthropic
client = anthropic.Anthropic(base_url="https://softsave.tech/api/public", api_key="YOUR_API_KEY")
msg = client.messages.create(model="anthropic/claude-sonnet-4.5", max_tokens=1024, messages=[{"role":"user","content":"Hi"}])
print(msg.content[0].text)With "stream": true you get server-sent events — message_start, content_block_delta, message_stop.
Chat completions (OpenAI format)
curl https://softsave.tech/api/public/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"anthropic/claude-sonnet-4.5","messages":[{"role":"user","content":"Write a Python hello world"}]}'$body = @{ model = "anthropic/claude-sonnet-4.5"; messages = @(@{ role = "user"; content = "Write a Python hello world" }) } | ConvertTo-Json -Depth 5
Invoke-RestMethod -Method Post -Uri "https://softsave.tech/api/public/v1/chat/completions" -Headers @{ Authorization = "Bearer YOUR_API_KEY" } -ContentType "application/json" -Body $bodyfrom openai import OpenAI
client = OpenAI(base_url="https://softsave.tech/api/public/v1", api_key="YOUR_API_KEY")
r = client.chat.completions.create(model="anthropic/claude-sonnet-4.5", messages=[{"role":"user","content":"Hi"}])
print(r.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://softsave.tech/api/public/v1", apiKey: "YOUR_API_KEY" });
const r = await client.chat.completions.create({ model: "anthropic/claude-sonnet-4.5", messages: [{ role: "user", content: "Hi" }] });
console.log(r.choices[0].message.content);Models
curl https://softsave.tech/api/public/v1/modelsInvoke-RestMethod -Uri "https://softsave.tech/api/public/v1/models"Every model id works on the same key and base URL, e.g. anthropic/claude-sonnet-4.5, anthropic/claude-opus-4.1, openai/gpt-5, google/gemini-2.5-pro, google/gemini-2.5-flash.
Key status
Open https://softsave.tech/check-key and paste your key to see plan, expiry, 5-hour and monthly usage.
Web search & web fetch
Built in and run on the server — nothing to install, no MCP server. Ask the model about current information or give it a link, and it searches / reads the page itself.
Plans & limits
Plan 5-hour window Monthly Tokens/min Requests/min
Pro 300,000 30,000,000 5,000 5
Max 5x 1,100,000 100,000,000 10,000 —
Max 20x 2,000,000 200,000,000 10,000 —
Demo 100,000 — 5,000 5The 5-hour window rolls from your oldest request. Repeated (cached) context counts only 10% toward limits.
Errors
400 invalid request body
401 missing, invalid, revoked or expired API key
429 limit reached (5-hour, monthly, per-minute, request cap or quota)
502 upstream model unreachable — retry
503 upstream provider temporarily unavailableTroubleshooting
- 401 / connection errors: check the key is active and not expired on the Check a key page.
- PowerShell "running scripts is disabled": run the
Set-ExecutionPolicyline first. - Claude Code still uses old settings: close all terminals / VS Code and open again.
- 429: you've hit a limit — wait for the window to reset or upgrade your plan.
Full installer scripts
# Kodex AI setup for Windows PowerShell
# Usage: irm https://softsave.tech/setup.ps1 | iex
# or: $env:KODEX_API_KEY = "sk-kodex-xxx"; irm https://softsave.tech/setup.ps1 | iex
& {
$ErrorActionPreference = "Stop"
$Base = "https://softsave.tech/api/public"
$Model = "anthropic/claude-sonnet-4.5"
$Fast = "google/gemini-2.5-flash"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Write-Host "== Kodex AI setup ==" -ForegroundColor Cyan
$Key = $env:KODEX_API_KEY
if (-not $Key) { $Key = Read-Host "Enter your Kodex API key (sk-kodex-...)" }
$Key = "$Key".Trim()
if (-not ($Key.StartsWith("sk-") -or $Key.StartsWith("kx-"))) {
Write-Host "Error: invalid key (must start with sk-kodex-)" -ForegroundColor Red; return
}
Write-Host "Checking key..."
$status = 0
try {
Invoke-WebRequest -UseBasicParsing -Method Post -Uri "$Base/v1/messages" -Headers @{ "x-api-key" = $Key } -ContentType "application/json" -Body "{}" | Out-Null
$status = 200
} catch {
if ($_.Exception.Response) { $status = [int]$_.Exception.Response.StatusCode } else { $status = 0 }
}
if ($status -eq 401) { Write-Host "Error: key rejected (invalid, revoked or expired)." -ForegroundColor Red; return }
if ($status -eq 0) { Write-Host "Error: cannot reach $Base" -ForegroundColor Red; return }
Write-Host "Key OK." -ForegroundColor Green
$Dir = Join-Path $HOME ".claude"
$File = Join-Path $Dir "settings.json"
New-Item -ItemType Directory -Force -Path $Dir | Out-Null
if (Test-Path $File) {
Copy-Item $File "$File.bak.$([DateTimeOffset]::Now.ToUnixTimeSeconds())"
Write-Host "Backed up existing settings.json"
}
$Settings = [ordered]@{
env = [ordered]@{
ANTHROPIC_AUTH_TOKEN = $Key
ANTHROPIC_BASE_URL = $Base
ANTHROPIC_MODEL = $Model
ANTHROPIC_SMALL_FAST_MODEL = $Fast
ANTHROPIC_DEFAULT_SONNET_MODEL = $Model
ANTHROPIC_DEFAULT_OPUS_MODEL = $Model
ANTHROPIC_DEFAULT_HAIKU_MODEL = $Fast
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC = "1"
}
hasCompletedOnboarding = $true
} | ConvertTo-Json -Depth 5
# UTF-8 without BOM (a BOM breaks Claude Code's JSON parser)
[IO.File]::WriteAllText($File, $Settings, (New-Object System.Text.UTF8Encoding($false)))
Write-Host "Wrote $File"
$vars = @{
KODEX_API_KEY = $Key
ANTHROPIC_BASE_URL = $Base
ANTHROPIC_AUTH_TOKEN = $Key
OPENAI_BASE_URL = "$Base/v1"
OPENAI_API_KEY = $Key
}
foreach ($k in $vars.Keys) {
[Environment]::SetEnvironmentVariable($k, $vars[$k], "User")
Set-Item -Path "Env:$k" -Value $vars[$k]
}
Write-Host "Saved environment variables for your user."
Write-Host ""
Write-Host "Done. Run: claude (VS Code users: restart VS Code)" -ForegroundColor Green
}
#!/usr/bin/env bash
# Kodex AI setup for macOS / Linux
# Usage: curl -fsSL https://softsave.tech/setup.sh | bash
# or: KODEX_API_KEY=sk-kodex-xxx bash -c "$(curl -fsSL https://softsave.tech/setup.sh)"
set -eu
BASE="https://softsave.tech/api/public"
MODEL="anthropic/claude-sonnet-4.5"
FAST="google/gemini-2.5-flash"
echo "== Kodex AI setup =="
command -v curl >/dev/null 2>&1 || { echo "Error: curl is required."; exit 1; }
KEY="${KODEX_API_KEY:-}"
if [ -z "$KEY" ]; then
if [ -r /dev/tty ]; then
printf "Enter your Kodex API key (sk-kodex-...): "
read -r KEY < /dev/tty
else
echo "Error: no terminal. Run with KODEX_API_KEY=sk-kodex-xxx"; exit 1
fi
fi
KEY="$(printf '%s' "$KEY" | tr -d '[:space:]')"
case "$KEY" in
sk-*|kx-*) ;;
*) echo "Error: invalid key (must start with sk-kodex-)"; exit 1 ;;
esac
echo "Checking key..."
code=$(curl -s -o /dev/null -w "%{http_code}" -X POST "$BASE/v1/messages" \
-H "x-api-key: $KEY" -H "content-type: application/json" -d '{}' || echo "000")
if [ "$code" = "401" ]; then echo "Error: key rejected (invalid, revoked or expired)."; exit 1; fi
if [ "$code" = "000" ]; then echo "Error: cannot reach $BASE"; exit 1; fi
echo "Key OK."
DIR="$HOME/.claude"
FILE="$DIR/settings.json"
mkdir -p "$DIR"
if [ -f "$FILE" ]; then
cp "$FILE" "$FILE.bak.$(date +%s)"
echo "Backed up existing settings.json"
fi
cat > "$FILE" <<EOF
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "$KEY",
"ANTHROPIC_BASE_URL": "$BASE",
"ANTHROPIC_MODEL": "$MODEL",
"ANTHROPIC_SMALL_FAST_MODEL": "$FAST",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "$MODEL",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "$MODEL",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "$FAST",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
},
"hasCompletedOnboarding": true
}
EOF
chmod 600 "$FILE"
echo "Wrote $FILE"
for f in "$HOME/.bashrc" "$HOME/.zshrc" "$HOME/.profile"; do
[ -f "$f" ] || continue
# remove old Kodex block, then append fresh one
tmp="$(mktemp)"
sed '/# >>> Kodex AI >>>/,/# <<< Kodex AI <<</d' "$f" > "$tmp" && cat "$tmp" > "$f" && rm -f "$tmp"
cat >> "$f" <<EOF
# >>> Kodex AI >>>
export KODEX_API_KEY="$KEY"
export ANTHROPIC_BASE_URL="$BASE"
export ANTHROPIC_AUTH_TOKEN="$KEY"
export OPENAI_BASE_URL="$BASE/v1"
export OPENAI_API_KEY="$KEY"
# <<< Kodex AI <<<
EOF
echo "Updated $f"
done
echo ""
echo "Done. Open a new terminal, then run: claude"
echo "VS Code users: restart VS Code."