ProxyAPI — единая точка входа ко всем моделям каталога. Один адрес, один ключ и один формат запроса: модель указывается прямо в запросе, поэтому при переходе с одной модели на другую не нужно ни подключать вторую библиотеку, ни переписывать код под чужой формат.

Формат запросов — OpenAI. Он работает и с моделями Anthropic, Google и остальных вендоров: запрос приводится к нужному виду по пути, а ответ возвращается таким, какой ожидает клиент OpenAI. Один и тот же код обращается к любой модели.

Так же устроены и остальные задачи — эмбеддинги, изображения, речь, видео. У каждой свой эндпоинт, но адрес, ключ и формат общие.

Базовый адрес один:

https://api.proxyapi.ru/v1

Запросы к текстовым моделям идут на https://api.proxyapi.ru/v1/chat/completions. Тело запроса передаётся в JSON, ключ — заголовком Authorization.

Обязательных полей два: model с идентификатором модели и messages со списком сообщений. У каждого сообщения есть роль (user — сообщение от пользователя, assistant — ответ модели, system — инструкция для модели) и содержимое.

curl "https://api.proxyapi.ru/v1/chat/completions" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer <КЛЮЧ>" \
    -d '{
        "model": "anthropic/claude-haiku-4-5",
        "messages": [
            {"role": "system", "content": "Отвечай коротко."},
            {"role": "user", "content": "Назови столицу Австралии."}
        ]
    }'

В примере — библиотека OpenAI и модель Anthropic. Это и есть смысл единого API: формат запроса не зависит от того, кто создал модель. Чтобы обратиться к другой модели, меняется только значение model; адрес, заголовки и структура запроса остаются теми же.

Ответ приходит в JSON. Текст модели лежит в первом элементе массива choices, в поле message.content:

{
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "Канберра."
            },
            "finish_reason": "stop"
        }
    ]
}

Рядом с choices приходит объект usage с числом израсходованных токенов — по нему считается стоимость запроса — и служебные поля: идентификатор ответа, время создания и название модели, которая его сформировала.

Поле finish_reason показывает, почему модель остановилась: stop — ответ завершён, length — упёрлась в ограничение на длину ответа.

Остальные задачи работают на том же адресе и с тем же ключом, у каждой свой эндпоинт:

ЗадачаЭндпоинт
Генерация текста/v1/chat/completions
Векторные представления текста/v1/embeddings
Генерация и редактирование изображений/v1/images/generations, /v1/images/edits
Синтез речи/v1/audio/speech
Распознавание речи/v1/audio/transcriptions
Генерация видео/v1/videos

Например, генерация изображения — тот же адрес, тот же ключ, библиотека OpenAI:

curl "https://api.proxyapi.ru/v1/images/generations" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer <КЛЮЧ>" \
    -d '{
        "model": "qwen/qwen-image-3",
        "prompt": "Рыжий кот в скафандре на фоне Земли"
    }'

Изображение приходит в поле data[0].b64_json — картинка в base64, которую остаётся сохранить в файл.

Формат OpenAI — не единственный: тот же ключ работает с форматами Anthropic Messages, OpenAI Responses и Google Gemini.

  • Быстрый старт — первый запрос с примерами на Python и Node.js.
  • Модели — как устроены идентификаторы и что доступно.

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

Нужно ли менять адрес при переходе на модель другого вендора?

Нет. Адрес, заголовки и структура запроса не меняются — достаточно поставить другое значение в поле model. Идентификатор при этом лучше писать целиком, вместе с вендором.

Только текстовые модели или что-то ещё?

Через тот же адрес и тот же ключ работают эмбеддинги, генерация и редактирование изображений, синтез и распознавание речи, генерация видео. У каждой задачи свой эндпоинт, формат запроса — такой же, как в API OpenAI.

Сколько сообщений можно передать в одном запросе?

Столько, сколько вмещает контекст модели. Модель не помнит предыдущие запросы, поэтому историю диалога нужно передавать в поле messages целиком при каждом обращении.

Обязательно ли передавать системное сообщение?

Нет, поле messages может содержать только сообщение пользователя. Системное сообщение задаёт модели общие указания и полезно, когда нужен определённый стиль или формат ответа.

Последняя редакция: 2 сентября 2026 г.