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

  1. 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.
  2. Open API keys and create a key. Set a name, a daily and monthly dollar limit and, if needed, a list of allowed models.
  3. Copy the key right away: the full key is shown only once.

Step 2. Anthropic SDK for Python

bash
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

bash
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

bash
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:

bash
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
claude

ANTHROPIC_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:

bash
{
  "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:

ModelidInput / outputCache read / writeIntelligence index
Claude Opus 5.5claude-opus-5-50.8 / 40.08 / 158
Claude Sonnet 5claude-sonnet-50.4 / 20.05 / 0.5—
Claude Fable 5.1claude-fable-5-17 / 350.7 / 8.7553

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:

bash
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.

Get API keyDocumentation

api.zukko.pro · fetch_*

Claude API key: how to get one from Russia · Zukko