Claude API key in Russia: Anthropic SDK and Claude Code on a Zukko key
The Anthropic Console doesn't serve Russia, but a Zukko key works with the Anthropic SDK and Claude Code. Steps: the key, code, prompt caching, Opus 5.5 and Sonnet 5 prices.
5 min · · API keys · development
A Claude API key is usually obtained in the Anthropic Console, but from Russia that route is closed: the region is not supported and Russian cards are not accepted. If you need a key for your own Anthropic SDK code or for Claude Code, a Zukko key will do: it works in the Anthropic format and is paid for in rubles. Below: step-by-step setup, prompt caching and prices.
Why an Anthropic key is hard to get from Russia
Russia is not on the list of regions Anthropic supports for its API (we checked the list in Anthropic's documentation on October 7, 2026). You can't top up the Anthropic Console balance with a Russian bank card. An account registered against the rules risks being blocked together with its prepaid balance, which is unacceptable for a real project.
What a Zukko key for Claude is
Zukko is an API gateway to Claude, GPT, Gemini, DeepSeek, Qwen and GLM models. A fetch_... key works with an Anthropic-compatible API:
POST https://api.zukko.pro/v1/messages— messages in the Anthropic format;POST https://api.zukko.pro/v1/messages/count_tokens— token counting before a request.
Authorization is the Authorization: Bearer fetch_... header. The Anthropic SDK sends the key in the x-api-key header, which also works. The SDKs set the anthropic-version: 2023-06-01 header themselves.
Important: it is not an Anthropic key. It only works with the Zukko address; sending it to api.anthropic.com is pointless.
How to get a Claude API key: step by step
Step 1. A key in the dashboard
- Sign up at zukko.pro and top up: SBP or a Russian bank card in rubles at the market rate, or cryptocurrency. The minimum is $1.
- Open API keys and create a key. Set a name, a daily and monthly dollar limit and, if needed, a list of allowed models.
- Copy the key right away: the full key is shown only once.
Step 2. Anthropic SDK for Python
import os
from anthropic import Anthropic
client = Anthropic(
base_url="https://api.zukko.pro",
api_key=os.environ["ZUKKO_API_KEY"],
)
message = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Find the bug: def avg(xs): return sum(xs) / len(xs)"}],
)
print(message.content[0].text)
print(message.usage)The address has no /v1: the SDK adds it and sends the request to /v1/messages.
Step 3. Anthropic SDK for Node.js
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
baseURL: "https://api.zukko.pro",
apiKey: process.env.ZUKKO_API_KEY,
});
const message = await client.messages.create({
model: "claude-opus-5-5",
max_tokens: 1024,
messages: [{ role: "user", content: "Suggest a table structure for tracking orders" }],
});
console.log(message.content[0].text);Step 4. Check with curl
curl https://api.zukko.pro/v1/messages \
-H "Authorization: Bearer $ZUKKO_API_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!"}]}'Format reference: the /v1/messages docs.
Step 5. Claude Code
Claude Code supports connecting to a gateway through environment variables. The key goes into ANTHROPIC_AUTH_TOKEN, whose value Claude Code sends in the Authorization: Bearer header:
export ANTHROPIC_BASE_URL=https://api.zukko.pro
export ANTHROPIC_AUTH_TOKEN=fetch_your_key
export ANTHROPIC_MODEL=claude-sonnet-5
export ANTHROPIC_DEFAULT_HAIKU_MODEL=claude-sonnet-5
claudeANTHROPIC_DEFAULT_HAIKU_MODEL is required: Claude Code sends background requests to the Haiku-slot model (by default claude-haiku-*), which is not in the Zukko catalog, and the gateway answers an unknown model name with 404 model_not_found. If you switch with /model opus or /model sonnet, also set ANTHROPIC_DEFAULT_OPUS_MODEL and ANTHROPIC_DEFAULT_SONNET_MODEL to catalog models.
You can put the same variables in the env block of ~/.claude/settings.json so you don't have to set them in every terminal:
{
"env": {
"ANTHROPIC_BASE_URL": "https://api.zukko.pro",
"ANTHROPIC_AUTH_TOKEN": "fetch_your_key",
"ANTHROPIC_MODEL": "claude-sonnet-5",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-sonnet-5"
}
}Detailed setup is in the Claude Code docs, and a rough monthly spend is in the article how much Claude Code costs per month.
If your code uses the OpenAI SDK
You can also call Claude through the OpenAI-compatible address https://api.zukko.pro/v1; the gateway converts the request. But for Claude, only the Anthropic format gives the cache discount: in the OpenAI format all input is billed at the input price. For long prompts and agents, the Anthropic SDK is the better deal.
If you already have a project on the official Anthropic API, the migration checklist is in the article migrating from the Anthropic API.
Prices and prompt caching
Prices are in USD per 1M tokens, as of October 7, 2026:
| Model | id | Input / output | Cache read / write | Intelligence index |
|---|---|---|---|---|
| Claude Opus 5.5 | claude-opus-5-5 | 0.8 / 4 | 0.08 / 1 | 58 |
| Claude Sonnet 5 | claude-sonnet-5 | 0.4 / 2 | 0.05 / 0.5 | — |
| Claude Fable 5.1 | claude-fable-5-1 | 7 / 35 | 0.7 / 8.75 | 53 |
The intelligence index is the Artificial Analysis Intelligence Index; there is no data for Sonnet 5. On October 6, 2026, Claude became roughly twice as expensive, and prices change often: for the current list and prices, call GET https://api.zukko.pro/v1/models or open the Models page in the dashboard.
Example: a long system prompt
Say you have a 5,000-token system prompt and make 1,000 requests with 500 fresh input tokens and 300 output tokens each. Mark the system prompt for caching:
LONG_INSTRUCTIONS = "...your 5,000-token instructions..."
message = client.messages.create(
model="claude-sonnet-5",
max_tokens=512,
system=[{"type": "text", "text": LONG_INSTRUCTIONS, "cache_control": {"type": "ephemeral"}}],
messages=[{"role": "user", "content": "Customer request text"}],
)
print(message.usage.cache_creation_input_tokens, message.usage.cache_read_input_tokens)The first request writes 5,000 tokens to the cache, the next 999 read them. Formula: (writes × write price + reads × read price + fresh input × input price + output × output price) / 1,000,000. For Sonnet 5:
- write: 5,000 × 0.5 / 1,000,000 = $0.0025;
- reads: 999 × 5,000 × 0.05 / 1,000,000 = $0.24975;
- fresh input: 1,000 × 500 × 0.4 / 1,000,000 = $0.20;
- output: 1,000 × 300 × 2 / 1,000,000 = $0.60;
- total ≈ $1.05.
Without the cache: 1,000 × 5,500 × 0.4 / 1,000,000 + $0.60 = $2.20 + $0.60 = $2.80. For Opus 5.5, the same scheme gives ≈ $2.00 with the cache and $5.60 without. The calculation assumes the cache doesn't expire: per Anthropic's documentation, the default cache lifetime is 5 minutes. This example uses October 7, 2026 prices; you can count tokens in advance with POST /v1/messages/count_tokens.
FAQ
Do I need an Anthropic Console account?
No. The key, balance and spending history are in the Zukko dashboard.
Why doesn't Claude Code accept the key?
Check three things: the key is in ANTHROPIC_AUTH_TOKEN, the address https://api.zukko.pro has no /v1, and the variables are set in the same terminal where you run claude. If you get 404 model_not_found, check that ANTHROPIC_MODEL and ANTHROPIC_DEFAULT_HAIKU_MODEL hold ids from the catalog.
Can I restrict a key to Claude models only?
Yes. Set a list of allowed models in the key settings. A request to another model returns 403 model_not_allowed_for_key.
What should I do about a 402 error?
It means insufficient balance. Top up in the dashboard: SBP, a Russian bank card or cryptocurrency, from $1.
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.
Related articles
- Your Own Neural Network Proxy on Node.js: Keep the API Key Off the FrontendA small Express server between your frontend and the model API: the key stays on the server, and models, request size and rate are capped.
- DeepSeek API in Python: Requests, Streaming, JSON and Error HandlingReady code for DeepSeek V4.1 Flash and V4 Pro on the OpenAI SDK: a request, streaming, JSON parsing and careful error handling.
- Gemini API in Python: requests via the OpenAI SDK and OpenAI formatA working Gemini API example in Python with no extra library: change base_url in the OpenAI SDK, add streaming and JSON, and compare with google-genai.
- Anthropic SDK for Python: base_url, key and a first request via a gatewayThe official anthropic package for Python just needs a different address. We cover base_url, the key, streaming, token counting, caching and errors.