Claude API error: типы ошибок Anthropic-формата и что с ними делать

Таблица ошибок Messages API: какой тип что значит, какой HTTP-код приходит через шлюз, что повторять с паузой, а что нужно чинить в самом запросе.

5 мин · · ошибки · API-ключи

Когда Claude API возвращает ошибку, полезно сразу понять одно: это сбой, который пройдёт сам, или запрос, который нужно исправить. Ниже разбор типов ошибок Messages API (формат Anthropic), соответствующие HTTP-коды при работе через шлюз Zukko и готовый обработчик на Python. Если вы искали, что делать, когда «claude api не работает», в конце есть чек-лист из пяти проверок.

Как выглядит ошибка в Anthropic-формате

При вызове POST https://api.zukko.pro/v1/messages ошибка приходит с HTTP-кодом 4xx или 5xx и телом такого вида:

bash
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "max_tokens: field required"
  }
}

Поле error.type задаёт категорию, message объясняет детали. Ориентируйтесь на оба: тип показывает, что делать, а текст говорит, какое поле или параметр виноват.

Типы ошибок

error.typeHTTPЧто случилосьРетраить?
invalid_request_error400Неверный формат или параметры запросаНет, исправьте запрос
authentication_error401Неверный или отсутствующий ключНет, проверьте ключ
billing_error402Проблема с оплатой или балансомНет, пополните баланс
permission_error403Ключу не разрешён ресурс, например модельНет, смените ключ или модель
not_found_error404Неверный путь или неизвестная модельНет, проверьте адрес и имя модели
request_too_large413Запрос больше допустимого размераНет, уменьшите запрос
rate_limit_error429Превышен лимитЗависит от причины, см. ниже
api_error500Внутренняя ошибка на стороне сервераДа, с паузой
timeout_error504Запрос не успел обработатьсяДа; для длинных ответов включите стриминг
overloaded_error529Сервис перегруженДа, с паузой

Это типы из документации Anthropic (там же описан редкий conflict_error с кодом 409). Через шлюз к ним добавляются собственные коды Zukko; HTTP-статус остаётся самым надёжным ориентиром.

Коды шлюза и что за ними стоит

HTTPПричина в ZukkoЧто делать
401Неверный ключСверьте ключ fetch_... и заголовок
402Не хватает балансаПополните баланс в кабинете
403model_not_allowed_for_key: модель не входит в список разрешённых для ключаДобавьте модель в allowed_models ключа или возьмите другой ключ
404model_not_found: неизвестное имя моделиСверьте имя с GET /v1/models
413Слишком большой запросСократите контекст
429Дневной или месячный лимит ключа либо лимит провайдераСмотрите код в теле ответа
503Провайдер недоступен или модель выключена (model_disabled)Повторите позже или перейдите на другую модель

Точное значение error.type для кодов вроде 402 или 503 зависит от реализации, поэтому не привязывайте логику к строке типа там, где есть HTTP-статус: проверьте реальный ответ на своём ключе. Пока 529 и 503 в ваших логах выглядят как временные сбои, обрабатывайте их одинаково: пауза и повтор.

Подробно про отдельные случаи: ошибка 401 и ошибка 529 overloaded.

Что ретраить, а что исправлять

Правило простое. 4xx (кроме части 429) означает, что проблема в вашем запросе или ключе, и повтор вернёт тот же ответ, но спишет время. 5xx и 529 означают временный сбой, и повтор с экспоненциальной паузой оправдан. 429 нужно разбирать: ограничение у провайдера проходит, а исчерпанный лимит ключа (key_daily_limit_reached или key_monthly_limit_reached) нет.

Отдельный случай: стриминг. В потоковом режиме сервер уже ответил 200 и начал отдавать события, поэтому сбой посреди ответа приходит не HTTP-кодом, а событием error внутри потока. Если вы обрабатываете только исключения на создании запроса, такую ошибку можно пропустить.

Обработчик на Python

Официальный Anthropic SDK сам повторяет часть запросов, но разбирать причины всё равно удобнее явно. Обратите внимание: для Anthropic SDK base_url пишется без /v1, SDK добавляет путь сам.

bash
import os
import time
import anthropic

client = anthropic.Anthropic(
    base_url="https://api.zukko.pro",
    api_key=os.environ["ZUKKO_API_KEY"],
    max_retries=0,
)

def ask(prompt: str, attempts: int = 5) -> str:
    for attempt in range(attempts):
        try:
            msg = client.messages.create(

Решение принимается по status_code, а не по классу исключения: набор классов в SDK меняется от версии к версии (например, в свежих версиях для 529 есть отдельный OverloadedError, который не наследуется от InternalServerError), а HTTP-статус стабилен.

Claude API не работает: пять проверок

  1. Адрес. Для Anthropic SDK и Claude Code base URL https://api.zukko.pro без /v1; для клиентов на OpenAI-формате https://api.zukko.pro/v1.
  2. Ключ и заголовки. Authorization: Bearer fetch_... или x-api-key (SDK шлёт его сам), плюс anthropic-version: 2023-06-01 при прямых вызовах.
  3. Имя модели. Сверьте с ответом GET https://api.zukko.pro/v1/models: модели появляются и выключаются.
  4. Баланс и лимиты ключа. Баланс и расход видны в кабинете, дневной и месячный лимит ключа тоже.
  5. Статус провайдера. Если всё выше в порядке, а 5xx идут подряд, проверьте страницу статуса Anthropic и повторите позже или переключитесь на другую модель.

Быстрая проверка из терминала:

bash
curl -i https://api.zukko.pro/v1/messages \
  -H "Authorization: Bearer fetch_ваш_ключ" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"claude-sonnet-5-5","max_tokens":50,"messages":[{"role":"user","content":"ping"}]}'

Флаг -i покажет HTTP-статус и заголовки вместе с телом. Подробности формата запроса есть в справочнике Messages API, про ключи и заголовки в разделе авторизации.

Частые вопросы

Чем overloaded_error отличается от 429?

overloaded_error (529) означает, что сервис перегружен в целом, вы тут ни при чём. 429 говорит о превышении лимита: вашего ключа или у провайдера. Реакция на оба с паузой, но лимит ключа повтором не лечится.

Почему invalid_request_error возвращается снова и снова?

Потому что запрос неверный, и сервер вернёт то же самое. Прочитайте error.message: часто это отсутствующий max_tokens, неверная структура messages или параметр, который модель не принимает.

Ошибка пришла посреди стриминга. Это нормально?

Да, в потоке ошибка передаётся событием error, потому что HTTP-статус уже был 200. Обрабатывайте такие события и повторяйте запрос целиком.

Где посмотреть, что именно списалось и почему упало?

В кабинете, раздел «Использование», и через API (/usage). Создать отдельный ключ под проект и ограничить его моделями можно в разделе ключей.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.