Документация API
API совместим с OpenAI. Меняете base URL и ключ — SDK, параметры и стриминг работают как раньше.
Быстрый старт
Получите ключ в кабинете, подставьте base URL и отправьте первый запрос.
Описание API для генераторов клиентов и агентов — openapi.json (OpenAPI 3.1).
curl https://api.openaiapi.ru/v1/chat/completions \ -H "Authorization: Bearer $OPENAIAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "openai/gpt-5.6-sol", "messages": [{"role": "user", "content": "Привет"}] }'
Аутентификация
Передавайте ключ в заголовке Authorization. Ключ показывается один раз при создании — храните его в переменной окружения, а не в коде.
Authorizationобязательно- Bearer sk-… —
sk-и 64 шестнадцатеричных символа
Authorization: Bearer sk-…
Модели
GET/v1/models
Список моделей и цен всегда актуален. У модели несколько провайдеров и одна цена: списываем по ней, кто бы ни ответил. Имя модели передаётся в поле model в формате разработчик/модель или без разработчика: gpt-5.6-sol.
id- Имя для поля model, например
openai/gpt-5.6-sol kindchat— для Chat Completions и Responses,embedding— для Embeddingscontext_length- Контекст в токенах
pricing- Рубли за 1 млн токенов: input, cached, output
Тот же каталог без ключа: https://openaiapi.ru/api/catalog.
curl https://api.openaiapi.ru/v1/models \ -H "Authorization: Bearer $OPENAIAPI_KEY"
Chat Completions
POST/v1/chat/completions
Основной метод. Формат запроса и ответа — как в OpenAI. Принимаем только поля из списка, другое поле — ошибка 400 с его именем в param. Поле со значением null пропускаем.
modelобязательно- Модель с kind chat, например
openai/gpt-5.6-sol messagesобязательно- Непустой массив сообщений. content — строка или части типа text
max_completion_tokensmax_tokens- Лимит ответа, от 1 до максимума модели. Только одно из двух. Без лимита модель отвечает полностью
streamstream_options- true — ответ приходит частями, см. «Стриминг»
toolstool_choice- Function calling, см. раздел ниже
response_format- text, json_object или json_schema
n- Только 1
service_tier- Только auto или default
temperatureи другие- Передаём модели как есть: temperature, top_p, stop, seed, frequency_penalty, presence_penalty, logit_bias, logprobs, top_logprobs, reasoning_effort, verbosity, prediction, parallel_tool_calls, functions, function_call, metadata, user, safety_identifier
Не поддерживаем, ответ 400: картинки, аудио и файлы в content, audio, modalities кроме ["text"], web_search_options. store игнорируем: ничего не храним. prompt_cache_key заменяем своим ключом разговора в пределах аккаунта, чтобы ходы одного диалога попадали в кеш.
curl https://api.openaiapi.ru/v1/chat/completions \ -H "Authorization: Bearer $OPENAIAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "openai/gpt-5.6-sol", "messages": [{"role": "user", "content": "Привет"}] }'
Responses
POST/v1/responses
Responses API без состояния на сервере: историю присылайте целиком в каждом запросе. Так работает Codex.
modelобязательно- Модель с kind chat
inputобязательно- Строка или массив элементов: message, function_call, function_call_output, custom_tool_call, custom_tool_call_output, reasoning. Контент — только текст
instructions- Системная инструкция
max_output_tokens- Лимит ответа, от 1 до максимума модели. Без него модель отвечает полностью
stream- true — события SSE
toolstool_choice- Инструменты типа function и custom
include- ["reasoning.encrypted_content"] — рассуждения между ходами без хранения на сервере
reasoningи другие- Передаём модели как есть: reasoning, text, temperature, top_p, top_logprobs, truncation, max_tool_calls, parallel_tool_calls, stream_options, service_tier (auto или default), metadata, user, safety_identifier
Не поддерживаем, ответ 400: previous_response_id, conversation, background: true, элементы item_reference, встроенные инструменты, картинки, файлы и аудио во входе. store всегда отправляем как false.
curl https://api.openaiapi.ru/v1/responses \ -H "Authorization: Bearer $OPENAIAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "openai/gpt-5.6-sol", "input": "Привет" }'
Embeddings
POST/v1/embeddings
Векторы для поиска и RAG. Без стриминга, платите только за вход.
modelобязательно- Модель с kind embedding
inputобязательно- Строка, непустой массив строк или массивы токенов
encoding_format- float или base64
dimensions- Размерность вектора, если модель её меняет
user- Идентификатор пользователя
curl https://api.openaiapi.ru/v1/embeddings \ -H "Authorization: Bearer $OPENAIAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "openai/text-embedding-3-small", "input": ["первый текст", "второй текст"] }'
Стриминг
Добавьте stream: true — ответ придёт частями по мере генерации, в формате Server-Sent Events. Стоимость та же.
chat/completions- События data: с объектами chat.completion.chunk. Поток кончается строкой data: [DONE]
include_usage- stream_options.include_usage: true — перед [DONE] придёт чанк с usage и пустым choices. Без него такого чанка нет
responses- События от response.created до response.completed, usage — в response.completed
stream_interrupted- Модель оборвала поток: придёт ошибка с этим code, поток закроется. Статус уже 200, поэтому ошибка внутри потока. Списываем только то, что дошло
curl https://api.openaiapi.ru/v1/chat/completions \ -H "Authorization: Bearer $OPENAIAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "openai/gpt-5.6-sol", "stream": true, "messages": [{"role": "user", "content": "Привет"}] }'
Function calling
Как в OpenAI: опишите функции в tools, модель вернёт tool_calls. Выполните функцию у себя и отправьте результат сообщением с role tool. Инструменты работают на вашей стороне и стоят только токенов.
tools- Типы function и custom (свободный текст, как apply_patch в Codex)
tool_choice- none, auto, required, конкретная функция или allowed_tools из таких функций
functions- Старый формат Chat Completions тоже работает
Встроенные инструменты — web_search, file_search, code_interpreter, MCP — не поддерживаем: ответ 400 с param tools.
{ "model": "openai/gpt-5.6-sol", "messages": [{"role": "user", "content": "Погода в Москве?"}], "tools": [{ "type": "function", "function": { "name": "get_weather", "parameters": { "type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"] } } }]}
Ошибки
Ошибки приходят в формате OpenAI: HTTP-код и объект error с полями message, type, code и param. В ответах генерации есть заголовок x-request-id — назовите его поддержке. Ошибка до начала ответа не списывается.
400invalid_request- Не JSON, лишнее поле или неподдерживаемое значение — param назовёт поле. Исправьте запрос
400context_length_exceeded- Вход не влезает в контекст модели. Сократите вход или лимит ответа
400content_policy_violation- Провайдер отказал по контент-политике
401invalid_api_key- Ключа нет, он неверный или отозван
404model_not_found- Такой модели нет или она другого kind. Сверьте имя со списком моделей
404not_found- Неизвестный путь или не тот HTTP-метод
413request_too_large- Тело запроса больше 8 МиБ
429rate_limit_exceeded- Больше 600 запросов в минуту или 64 одновременных на ключ, либо провайдер ограничивает частоту. Повторите позже
429insufficient_quota- Баланс исчерпан или ключ достиг лимита расхода. Пополните баланс или поднимите лимит в кабинете, повтор не поможет
502upstream_unavailable- Провайдеры модели не ответили. Повторите запрос
502upstream_error- Сбой у провайдера. Повторите запрос
503service_unavailable- Перегрузка, пауза или модель сейчас недоступна. Повторите позже
504upstream_timeout- Модель не начала отвечать за 300 секунд. Повторите запрос
Ошибки провайдера context_length_exceeded, content_policy_violation и invalid_request сохраняют его код: 400, 404, 409, 413 или 422. Если есть заголовок Retry-After, ждите столько секунд.
{ "error": { "code": "insufficient_quota", "type": "insufficient_quota", "message": "Insufficient balance for this request. Top up in the cabinet or lower the output limit.", "param": null }}
Лимиты
Лимиты по умолчанию, на каждый ключ. Каждый сервер шлюза считает их сам: это защита от зациклившегося скрипта, а не тариф. Реальный потолок может быть выше.
600запросов в минуту- Сверх лимита — 429 rate_limit_exceeded
64одновременных запроса- Поток держит слот до конца
Лимит расхода- Задаётся для ключа в кабинете. Исчерпан — 429 insufficient_quota
Резерв- Перед запросом резервируем стоимость входа и лимита ответа. Не хватает баланса — уменьшите лимит ответа
8 МиБ- Размер тела запроса
300 с- До первого байта ответа и между частями потока
30 мин- Весь запрос вместе с потоком
Если провайдер не ответил до первого байта, запрос уходит к следующему провайдеру модели. Цена та же.
Cursor
Settings → Models → OpenAI API Key. Включите Override OpenAI Base URL и вставьте адрес. Затем добавьте модель по имени.
OpenAI API Key sk-…Override Base URL https://api.openaiapi.ru/v1 Add model openai/gpt-5.6-sol
Codex
Добавьте провайдера в конфиг и ключ в переменную окружения OPENAIAPI_KEY.
# ~/.codex/config.tomlmodel = "gpt-5.6-sol"model_provider = "openaiapi" [model_providers.openaiapi]name = "openaiapi"base_url = "https://api.openaiapi.ru/v1"env_key = "OPENAIAPI_KEY"