Migration
Getting startedIntermediate4 min
You change three things: the address, the key and the model name. Your request code stays the same.
| What | Before | After |
|---|---|---|
| Key | sk-..., sk-ant-..., sk-or-... | fetch_... (create one) |
| OpenAI / OpenRouter address | https://api.openai.com/v1, https://openrouter.ai/api/v1 | https://api.zukko.pro/v1 |
| Anthropic address | https://api.anthropic.com | https://api.zukko.pro |
| Model | the provider's name | the name from the catalog |
Supported: /v1/chat/completions, /v1/responses, /v1/messages, /v1/messages/count_tokens, /v1/images/generations, /v1/models, /v1/balance, /v1/usage, /v1/web-search. Everything else (embeddings, audio, files, batches, fine-tuning) returns 404.
1From OpenAI
python
from openai import OpenAI
client = OpenAI(
base_url="https://api.zukko.pro/v1",
api_key="fetch_...",
)
r = client.chat.completions.create(
model="gpt-5.6-sol",
messages=[{"role": "user", "content": "Hi!"}],
)- GPT models:
gpt-6.1-sol,gpt-6-astra,gpt-6-sol,gpt-5.6-sol,gpt-5.6-terra; cheaper:gpt-6-luna,gpt-5.6-luna. The same client works with Claude, Gemini, Qwen, DeepSeek and GLM. - The
OpenAI-OrganizationandOpenAI-Projectheaders aren't needed. - With environment variables:
OPENAI_BASE_URL=https://api.zukko.pro/v1,OPENAI_API_KEY=fetch_....
2From Anthropic
python
from anthropic import Anthropic
client = Anthropic(
base_url="https://api.zukko.pro",
api_key="fetch_...",
)
msg = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hi!"}],
)- The address goes without
/v1. Thex-api-keyheader is accepted. - Names with a date (
claude-sonnet-5-20260101) or a dot (claude-opus-5.5) are recognized, but use the catalog name. - Prompt caching works and is billed at cache prices.
count_tokensis paid, at the input price. - Claude Code has its own guide.
3From OpenRouter
python
from openai import OpenAI
client = OpenAI(
base_url="https://api.zukko.pro/v1", # was https://openrouter.ai/api/v1
api_key="fetch_...", # was sk-or-...
)
r = client.chat.completions.create(
model="claude-sonnet-5", # was anthropic/claude-sonnet-5
messages=[{"role": "user", "content": "Hi!"}],
)- A vendor prefix (
anthropic/claude-sonnet-5) is recognized, but drop it. - Remove the
models,provider,route,transformsfields and theHTTP-Referer,X-Titleheaders. - Balance: GET /v1/balance; history: GET /v1/usage.
4Check
- Your model is in the list.
- A short request goes through.
404 model_not_foundmeans the name isn't in the catalog. Other codes: API errors.