Zukko vs OpenRouter: what's actually different

Both give one key access to several providers' models. Here's where Zukko and OpenRouter actually diverge — protocol, caching, and how you pay.

5 min · · Updated · сравнение

Both services solve the same problem: one key instead of a dozen separate provider accounts. That's where the similarity ends — the architectural differences show up the moment you actually wire up a tool.

One protocol, or both at once

OpenRouter is a single OpenAI-compatible endpoint. Models are addressed as provider/model strings, and all traffic goes through /chat/completions in one format regardless of which provider actually serves the model.

Zukko works differently: it's simultaneously an Anthropic-compatible and an OpenAI-compatible gateway, both running on the same fetch_... key with no mode switch needed. For Anthropic-style clients (Claude Code, the Anthropic SDK, Roo Code in Anthropic mode) the base URL is https://api.zukko.pro — without /v1, since the client appends the path itself — hitting POST /v1/messages with the required anthropic-version: 2023-06-01 header. For OpenAI-compatible clients (Cursor, Codex, Cline, the OpenAI SDK) the base URL is different — https://api.zukko.pro/v1 — with entry points POST /v1/chat/completions or POST /v1/responses, the latter accepting a plain string, a message array, or tools.

The practical difference: if a tool speaks the Anthropic Messages API natively, Zukko passes it through without translating the request shape into an OpenAI-like format and back. That's one less place where a field like system or a structured content block can get mangled.

bash
# Anthropic-style
curl https://api.zukko.pro/v1/messages \
  -H "Authorization: Bearer fetch_your_key" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"model":"claude-sonnet-5","max_tokens":256,"messages":[{"role":"user","content":"hi"}]}'

# OpenAI-style
curl https://api.zukko.pro/v1/chat/completions \
  -H "Authorization: Bearer fetch_your_key" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-5.6-sol","messages":[{"role":"user","content":"hi"}]}'

The model catalog

Zukko's catalog currently has six text models across three lines: claude-opus-5-5 (Claude Opus 5.5) and claude-sonnet-5 at $0.30/$0.30 per 1M tokens, gpt-5.6-sol at $0.30/$0.30, gpt-5.6-luna at $0.10/$0.10, glm-5.3 at $0.10/$0.10, and glm-5.3-flash at $0.04/$0.04. Claude and GPT have a 1,000,000-token context; GLM has 128K and no vision, so there is no single catalog-wide property. The lineup changes — the current list is at GET https://api.zukko.pro/v1/models.

Image generation through Zukko is temporarily unavailable. The model list (/v1/models) and pricing with context limits (/v1/models/info) are public, no key required:

bash
curl https://api.zukko.pro/v1/models
curl https://api.zukko.pro/v1/models/info

Caching and idempotency — the part that doesn't show up on someone else's invoice

Zukko has two mechanisms that directly cut cost on repeated requests. The Idempotency-Key header: replaying a request with the same key within 24 hours returns the same response without charging again — useful when a client hangs and you're not sure whether the request actually went through. And response caching: with an X-Zukko-Cache: true header (temperature: 0 also enables the cache, but only for models that accept it — Claude models may reject a temperature other than 1 with a 400), requests from the same user with an exactly matching body get cached (up to 7 days for chat), a repeat call returns instantly and for free (such hits are not written to /v1/usage), and the response carries X-Zukko-Cache: hit.

Every regular (non-streaming) response also carries X-Zukko-Cost-Micros (the cost of that specific request in microdollars, 1,000,000 = $1) and X-Fetch-Balance-Cents (remaining balance after the charge — despite the name, also in microdollars) — handy for logging spend without opening the dashboard. Streaming responses (stream: true) do not include these headers; there you check spend in the dashboard, /v1/usage, or /v1/balance.

Limits at the key level

Every Zukko API key can carry its own daily and monthly dollar spend limit and a list of allowed models, configured right on the key's page in the dashboard. That's a separate control layer on top of the overall account balance: hand a key to a contractor or a bot, and you constrain just that key without touching the rest. Exceed the limit and you get a 429 with key_daily_limit_reached or key_monthly_limit_reached; use a model outside the allowed list and you get a 403 model_not_allowed_for_key.

Balance, errors, and what happens at zero

Zukko checks the balance before the request reaches the model: an empty balance returns 402 with {"error":{"message":"Недостаточно средств на балансе","code":"insufficient_balance"}}, and a failed request costs nothing. Spend history is available through GET /v1/usage with cursor pagination (account-wide, no per-key filter); the current balance through GET /v1/balance (the balance_cents field).

A model that is disabled in the catalog returns 503 with model_disabled; an unavailable provider returns 503 provider_unavailable. A typo in the model name gives 404 model_not_found.

Payment, and what access from Russia looks like

Zukko accepts SBP (Faster Payments), bank cards via PayPear, cryptocurrency, and, starting 2026-09-16, foreign Mastercard EU cards through Fride. A one-time $0.50 bonus is credited for subscribing to the Telegram channel @zukkopro — once per Telegram account: link your Telegram in the dashboard, subscribe, and press "Check". There's no starting balance on regular signup — that practice was dropped on 2026-09-18 because of disposable-email account farming. A referral program pays 10% of invited users' top-ups.

Keys are created in the dashboard at zukko.pro/app/api-keys and shown once, at creation. The site is bilingual — Russian on the root domain, English under /en — with the dashboard at zukko.pro/app.

Which one to pick

If your tool speaks the Anthropic Messages API natively and you care about the request shape never passing through a translation layer, a gateway with native support for both protocols removes a whole class of small bugs at the format boundary. If you also need spend control at the individual-key level, caching for repeated calls, and idempotent retries, that's no longer just a protocol choice — it's how much manual spend-monitoring work gets taken off a developer's plate. Zukko's support runs through Telegram at @zukkopro, no ticket queue, no multi-day wait for a reply.

zukko

Pay 25×
less

for Claude Code & ChatGPT

One fetch_* key and base URL api.zukko.pro — for Cursor, Claude Code, Codex, and any SDK.

Get API keyDocumentation

api.zukko.pro · fetch_*

Zukko vs OpenRouter: key differences explained · Zukko