Загрузка
Загрузка
01 / документация
Шлюз повторяет контракт OpenAI. В официальном SDK достаточно сменить base_url.
Заголовок Authorization: Bearer sk-max-…. Ключ показывается один раз при создании. Отзыв в кабинете инвалидирует кеш сразу. Срок действия задаётся датой в кабинете — после неё запросы вернут 403 api_key_disabled. Ключ можно ограничить списком моделей — чужой id вернёт 403 model_not_allowed, а GET /models покажет только разрешённые.
Список: GET https://maxai.ru/v1/models . Одна модель: GET https://maxai.ru/v1/models/{id}. Ответ совместим с OpenAI, плюс цены в рублях. Фильтр ?kind=chat (также embedding, image). Если у ключа задан список моделей, остальные id не видны.
POST https://maxai.ru/v1/chat/completions . Стрим — stream: true. Только модели с типом «чат». Параметр n больше 1 не поддерживается (HTTP 400). Если не передать max_tokens, в апстрим уходит тот же потолок 4096, что и холд кошелька — у всех чат-моделей, не только Claude и Gemini. tool_choice: "none" на Claude тоже уходит в апстрим, а не отбрасывается. Если апстрим отдал ответ без usage, списание считается по оценке токенов, а не нулю.
POST https://maxai.ru/v1/embeddings . Оплата по входным токенам.
POST https://maxai.ru/v1/images/generations . Оплата за каждую вернувшуюся картинку. У DALL·E 3 параметр n только 1.
Перед запросом резервируется оценка стоимости. Если не передать max_tokens, холд считается на 4096 токенов выхода, а не на потолок модели. Картинка в сообщении добавляет к холду ~2000 токенов входа за штуку. После ответа списывается факт, но не больше холда плюс овердрафт кошелька; резерв снимается. Нехватка денег — HTTP 402 insufficient_funds. В ответе (не стрим) сумма в заголовках x-maxai-charged-kopecks и x-maxai-charged-rub. Стрим — комментарий SSE : maxai-charged-kopecks после последнего кадра (SDK его игнорирует). В теле JSON и в чанках стрима model — id из каталога, не слаг провайдера.
Баланс: GET https://maxai.ru/v1/billing/balance . Расход: GET https://maxai.ru/v1/billing/usage . Операции: GET https://maxai.ru/v1/billing/transactions . Параметры limit, model, key=this (только текущий ключ), since/until (ISO), status=error, group=model (сводка, days или те же since/until), before (uuid последней строки — более старые, has_more). В строке есть error_code. Неоплаченный счёт юрлицу отменяется в кабинете — карточные платежи ЮKassa так не отменить. Возврат по карте списывается с баланса, когда ЮKassa присылает refund.succeeded. Пополнение картой: POST https://maxai.ru/v1/billing/topup с amount_rub. Повтор того же запроса — заголовок Idempotency-Key (или поле idempotency_key): вернётся тот же payment_id и ссылка на оплату. После оплаты ЮKassa вернёт клиента только на тот же origin, что и кабинет (return_url на чужой сайт отбрасывается).
Тело в формате OpenAI: error.message и error.code. Ошибки Anthropic и Google тоже приводятся к этому конверту — статус апстрима сохраняется.
| HTTP | Код | Что делать |
|---|---|---|
| 401 | invalid_api_key | Проверьте ключ. Отозванный не проходит. На паузе — 403. |
| 403 | api_key_disabled | Ключ на паузе или истёк. Включите его в кабинете. |
| 403 | model_not_allowed | Этот ключ не может вызывать эту модель. Смените модель или список в кабинете. |
| 402 | insufficient_funds | Пополните баланс в кабинете. |
| 404 | model_not_found | Возьмите id из каталога или GET /v1/models. |
| 429 | rate_limited | Слишком много запросов с этого ключа (лимит в минуту) или апстрим вернул 429. Смотрите Retry-After. |
| 502 | upstream_error | Провайдер не ответил. Повторите или другая модель. |
Каждый ответ /v1 несёт x-maxai-request-id — в том числе 401/402 до резерва. Можно прислать свой x-request-id (8–128 символов) — его вернут как есть. После резерва x-maxai-request-id — id строки в GET /v1/billing/usage.
По умолчанию 600 запросов с ключа в минуту; сверх лимита — 429 rate_limited. На последнем 429 апстрима копируется его Retry-After.
При 429/5xx запрос может уйти на другую модель того же типа, не дороже запрошенной. Подмена видна в заголовках x-maxai-fallback-from и x-maxai-model. Тела промптов на сервер не пишем.
Чтобы не подменять модель, передайте X-MaxAI-Fallback: never (также off, no, false, 0).
curl https://maxai.ru/v1/chat/completions \
-H "Authorization: Bearer $MAXAI_API_KEY" \
-H "X-MaxAI-Fallback: never" \
-H "Content-Type: application/json" \
-d '{"model":"deepseek-chat","messages":[{"role":"user","content":"Привет"}]}'