DocsMigration

Migration

Getting startedIntermediate4 min

You change three things: the address, the key and the model name. Your request code stays the same.

WhatBeforeAfter
Keysk-..., sk-ant-..., sk-or-...fetch_... (create one)
OpenAI / OpenRouter addresshttps://api.openai.com/v1, https://openrouter.ai/api/v1https://api.zukko.pro/v1
Anthropic addresshttps://api.anthropic.comhttps://api.zukko.pro
Modelthe provider's namethe 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-Organization and OpenAI-Project headers 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. The x-api-key header 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_tokens is 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, transforms fields and the HTTP-Referer, X-Title headers.
  • Balance: GET /v1/balance; history: GET /v1/usage.

4Check

  1. Your model is in the list.
  2. A short request goes through. 404 model_not_found means the name isn't in the catalog. Other codes: API errors.
Migration · Zukko Docs