/v1/chat/completions
Подходит для OpenAI SDK, Cherry Studio, Cline, Open WebUI и большинства клиентов.
Эндпоинты, параметры, ответы и коды ошибок. Руководства и первый запрос — в документации.
Подключение
https://api.chinaapi.ai
https://api.chinaapi.ai/v1 и используйте свой токен ChinaAPI как bearer-ключ.
Все запросы к API используют аутентификацию по bearer-токену. Создайте токен в личном кабинете и передавайте его в заголовке Authorization.
Authorization: Bearer $CHINAAPI_KEY
Content-Type: application/json
Большинство клиентов OpenAI работают после смены baseURL. Используйте имя модели, опубликованное в вашем личном кабинете ChinaAPI.
Ключевые параметры: model и messages обязательны. Поведение генерации задают temperature, top_p, max_tokens и stream. reasoning_effort может принимать значения low, medium, high или значение, специфичное для модели, если выбранная модель рассуждений это поддерживает.
curl https://api.chinaapi.ai/v1/chat/completions \
-H "Authorization: Bearer $CHINAAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-chat",
"messages": [
{ "role": "user", "content": "Hello" }
]
}'
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.CHINAAPI_KEY,
baseURL: "https://api.chinaapi.ai/v1",
});
const result = await client.chat.completions.create({
model: "deepseek-chat",
messages: [{ role: "user", content: "Hello" }],
});
Три формата запросов покрывают весь каталог. Один ключ ChinaAPI и один Base URL работают со всеми, поэтому отправляйте тот, на котором ваш клиент уже говорит.
Подходит для OpenAI SDK, Cherry Studio, Cline, Open WebUI и большинства клиентов.
Отправляйте сообщения в формате Claude, сохраняя тот же ключ шлюза и те же ограничения по квоте.
Подходит для Codex и других клиентов, построенных на Responses API. В консоли отмечено, какие модели его принимают.
POST /v1beta/models/{model}:generateContent. Его поддерживают только модели gemini-*, и то не все — форматы, которые принимает каждая модель, указаны в её карточке в разделе «Модели». Всё остальное использует один из трёх форматов выше.
Многошаговые диалоги Responses ссылаются на предыдущий ответ через previous_response_id. Если следующий запрос вернулся с previous_response_not_found, предыдущий ответ не потерян: подождите десять–двадцать секунд и отправьте тот же запрос снова, вместо того чтобы собирать диалог заново.
Модели видео отвечают задачами, а не одним ответом. POST /v1/videos возвращает идентификатор задачи со "status": "queued", а GET /v1/videos/{task_id} сообщает о ходе выполнения, пока задача не достигнет состояния completed или failed. По завершении готовый файл — это подписанный URL в metadata.url; он содержит параметр Expires, поэтому скачивайте файл, а не сохраняйте ссылку. Неудачная задача несёт код и текст вышестоящего сервиса в error.code и error.message, чего обычно достаточно, чтобы понять, какого поля не хватало в запросе. POST /v1/video/generations ведёт к тому же обработчику для клиентов, уже написанных под этот путь.
curl https://api.chinaapi.ai/v1/videos \
-H "Authorization: Bearer $CHINAAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan2.7-i2v",
"prompt": "the cat turns and walks toward the camera",
"input_reference": "https://example.com/first-frame.jpg",
"size": "1280*720",
"duration": 5
}'
# {"id":"task_9f2c...","task_id":"task_9f2c...","object":"video",
# "model":"wan2.7-i2v","status":"queued","progress":0}
curl https://api.chinaapi.ai/v1/videos/task_9f2c... \
-H "Authorization: Bearer $CHINAAPI_KEY"
# {"id":"task_9f2c...","object":"video","model":"wan2.7-i2v",
# "status":"completed","progress":100,
# "metadata":{"url":"https://.../output.mp4?Expires=..."}}
model и prompt — единственные обязательные поля. Без size и duration шлюз отправляет 1280*720 на пять секунд.
Оживление неподвижного изображения. input_reference принимает публично доступный URL изображения и становится первым кадром; отправляйте вместе с ним size и duration.
Построение видео по референсным материалам. input_reference принимает одно референсное изображение; чтобы передать несколько, используйте images, а video_url добавляет референсное видео — референсы считаются вместе, максимум пять. Не отправляйте input_reference и images одновременно: шлюз оставит только input_reference.
Редактирование существующего ролика по промпту. video_url принимает исходное видео длительностью от 2 до 10 секунд в формате MP4 или MOV, а size задаёт результат.
Референсные изображения передаются в images, а input_reference принимает одно; при отправке обоих сохраняются оба. Длительность указывается в seconds или duration, а параметры поставщика — в metadata, где resolution принимает значение 480p или 720p.
Та же форма запроса, что и у doubao-seedance-2-5-260628, включая правила role для metadata.content. doubao-seedance-2-0-fast-260128 и doubao-seedance-2-0-mini-260615 меняют качество на скорость и стоимость, а линейке 2.0 нужен хотя бы один референс — изображение или видео, тогда как 2.5 принимает и одно аудио.
Первый кадр передаётся в image; это семейство никогда не читает input_reference. mode по умолчанию равен std, а duration — 5 секунд. Остальное несёт metadata: image_tail для завершающего кадра, sound со значением on или off (off по умолчанию), а также negative_prompt, cfg_scale и camera_control.
Отправьте prompt для генерации видео из текста или добавьте image — и шлюз соберёт массив contents, который ожидает вышестоящий сервис. Размеры задаются в metadata.settings: resolution принимает 720p или 1080p, duration — от 3 до 15 секунд, а aspect_ratio — 16:9, 9:16 или 1:1. Звук включается всегда и не имеет переключателя.
Генерация по нескольким референсным изображениям сразу. Все параметры находятся в metadata, поля resolution нет — уровень качества задаёт mode. См. разобранный пример ниже.
Принимает собственные поля шлюза и собирает запрос для вышестоящего сервиса за вас: image или input_reference становится первым кадром, images — референсными изображениями, а video_url — референсным видео. size выбирает 768P или 2K, а duration — целое число от 4 до 15. Запросам только из текста нужен явный metadata.ratio, отличный от adaptive.
Вместе с MiniMax-Hailuo-2.3-Fast и MiniMax-Hailuo-02. Эти модели читают с верхнего уровня только prompt, duration и size; все изображения передаются через metadata — как first_frame_image, last_frame_image или subject_reference.
Вместе с happyhorse-1.1-i2v и happyhorse-1.1-r2v. Поля совпадают с семейством wan2.7 — prompt, input_reference, size, duration, — и 480P здесь имеет цену, поэтому 832*480 принимается там, где wan2.7 его отклоняет. Несколько референсов передаются в metadata.input.media, потому что автоматическая сборка, которую запускает поле images, характерна только для wan2.7-r2v.
size как ширину и высоту через звёздочку, например 1280*720. Буква x не принимается: 832x480 возвращается как invalid size: 832x480, example: 1920*1080. duration — целое число секунд. Для wan2.7-i2v, wan2.7-r2v и wan2.7-videoedit шлюз сводит size к уровню разрешения, а у вышестоящего сервиса их всего два, поэтому отправляйте 1280*720 для 720P или 1920*1080 для 1080P. Размер 480P, например 832*480, не имеет цены у этих трёх и либо отклоняется сразу, либо принимается и затем падает у вышестоящего сервиса с InvalidParameter; неудачная задача возвращает средства, но обращение в любом случае потрачено впустую. wan2.7-t2v принимает значение как есть.
size по фиксированной таблице, где размеры записаны через букву x — 1280x720, 1920x1080, 720x1280, 1080x1920, 1024x1024, 512x512, — и всё, что оно не распознаёт, становится 1:1 без ошибки. Поэтому отправка формы со звёздочкой 1280*720 в kling-v3 возвращает квадратное видео, а не жалобу: если кадрирование важно, задавайте metadata.aspect_ratio напрямую.
MiniMax-Hailuo-2.3, MiniMax-Hailuo-2.3-Fast и MiniMax-Hailuo-02 молча отбрасывают image, input_reference, images и video_url верхнего уровня: запрос выполняется успешно, но работает как генерация из текста и тарифицируется соответственно. Помещайте изображение в metadata.first_frame_image, добавляйте metadata.last_frame_image для завершающего кадра и используйте metadata.subject_reference для референсов объекта. MiniMax-H3 — исключение в этом семействе: он читает поля верхнего уровня.
curl https://api.chinaapi.ai/v1/video/generations \
-H "Authorization: Bearer $CHINAAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kling-v3-omni",
"prompt": "the character from the references walks through a neon-lit street",
"metadata": {
"image_list": [
{"image_url": "https://example.com/character.jpg"},
{"image_url": "https://example.com/outfit.jpg"},
{"image_url": "https://example.com/scene.jpg"}
],
"mode": "std",
"duration": "5",
"aspect_ratio": "16:9",
"sound": "off"
}
}'
curl https://api.chinaapi.ai/v1/video/generations/task_9f2c... \
-H "Authorization: Bearer $CHINAAPI_KEY"
# {"code":"success",
# "data":{"task_id":"task_9f2c...","status":"SUCCESS",
# "progress":"100%","fail_reason":"",
# "result_url":"https://.../output.mp4"}}
type; это поле нужно только чтобы отметить first_frame или end_frame, а aspect_ratio обязателен всегда, когда первого кадра нет. mode — это уровень качества (std, pro или 4k), и у вышестоящего сервиса по умолчанию стоит pro, который тарифицируется в 1,33 раза выше указанной цены, а 4k — в 5 раз; передавайте mode явно, чтобы списание было ожидаемым. duration — строка от "3" до "15", а sound по умолчанию равен off. Референсное видео передаётся в video_list и должно содержать "refer_type": "feature": режим редактирования base тарифицируется по длине переданного вами видео, не может быть оценён до отправки и потому отклоняется. У референсных изображений также есть минимальный размер у вышестоящего сервиса, и файл размером с иконку пройдёт отправку, но задача упадёт с Image pixel is invalid; неудачная задача возвращает средства, но обращение потеряно.
GET /v1/videos/{task_id} отвечает в формате видео OpenAI, где файл — это metadata.url, а прогресс — число. GET /v1/video/generations/{task_id} отвечает {"code": "success", "data": {…}}, где файл — data.result_url, data.status — слово в верхнем регистре, например SUCCESS или FAILURE, data.progress — строка вида "100%", а причина неудачи объясняется в data.fail_reason. Опрашивайте тот путь, на который отправляли задачу.
curl https://api.chinaapi.ai/v1/videos \
-H "Authorization: Bearer $CHINAAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedance-2-5-260628",
"prompt": "the subject slowly turns toward the camera",
"images": ["https://example.com/first-frame.jpg"],
"seconds": "5",
"metadata": {"resolution": "480p"}
}'
curl https://api.chinaapi.ai/v1/videos \
-H "Authorization: Bearer $CHINAAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedance-2-5-260628",
"prompt": "keep the subject from the reference image",
"seconds": "5",
"metadata": {
"resolution": "480p",
"ratio": "16:9",
"content": [
{
"type": "image_url",
"image_url": {"url": "https://example.com/reference.jpg"},
"role": "reference_image"
}
]
}
}'
role читается как первый кадр, а не как референс: результат наследует соотношение сторон этого изображения, отправка ratio вместе с ним отклоняется с InvalidParameter.TaskTypeConstraint, а seconds со значением 2 там тоже отклоняется, тогда как 5 работает. generate_audio у вышестоящего сервиса по умолчанию равен true, поэтому файл возвращается со звуковой дорожкой, если не выставить false в metadata. Помечайте каждую часть metadata.content полем role, чтобы получить полный референсный режим — до 30 изображений, 10 видео и 10 аудиофрагментов, ввод только из аудио и 30 секунд за один раз, — где ratio принимается.
POST /v1/images/generations отвечает одним ответом, а не задачей. model и prompt обязательны; n, size и quality необязательны, и модели используют собственные значения по умолчанию. Ответ имеет вид {"created": …, "data": [ … ]}, где каждая запись содержит url, а b64_json присутствует, но пуст, пока вы не запросите его через "response_format": "b64_json". Редактирование существующего изображения выполняется через POST /v1/images/edits с исходником в image. Тарификация идёт за каждое созданное изображение, поэтому n умножает списание.
curl https://api.chinaapi.ai/v1/images/generations \
-H "Authorization: Bearer $CHINAAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "image-01",
"prompt": "a red paper crane on a white desk, soft daylight",
"n": 1
}'
# {"created":1786620000,
# "data":[{"url":"https://.../image_inference_output/....jpg","b64_json":""}],
# "metadata":{"success_count":"1","failed_count":"0"}}
Вместе с doubao-seedream-4-5-251128. Обе достигают 4K и обе принимают входное изображение для редактирования и композиции из нескольких изображений, поэтому size стоит задавать явно, а не полагаться на значение по умолчанию.
Вместе с wan2.7-image-pro, которая добавляет уровень 4K примерно по двойной цене. Поля запроса те же, что и у остальных на этом эндпоинте; вариант pro стоит выбирать, когда результат пойдёт в печать или на увеличение.
Вместе с step-2x-large и image-01. step-image-edit-2 создана для редактирования переданного вами изображения и дешевле остальных двух; image-01 — самая дешёвая модель «текст в изображение» на этом эндпоинте.
"n": 4 стоит вчетверо дороже одного изображения. Цены здесь различаются более чем на порядок, поэтому сначала выбирайте модель и лишь затем настраивайте промпт.
POST /v1/audio/speech возвращает само аудио, а не JSON: телом ответа является закодированный файл, а Content-Type следует за response_format, поэтому mp3 возвращается как audio/mpeg. Значимые поля — model, input и voice; speed и instructions необязательны, а имена голосов каждая модель публикует свои. Записывайте ответ сразу в файл — попытка декодировать его как текст его испортит.
curl https://api.chinaapi.ai/v1/audio/speech \
-H "Authorization: Bearer $CHINAAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "step-tts-2",
"input": "ChinaAPI text to speech verification.",
"voice": "cixingnansheng",
"response_format": "mp3"
}' \
--output speech.mp3
# HTTP 200, Content-Type: audio/mpeg
Вместе с step-tts-mini и stepaudio-2.5-tts. Все три клонируют голос примерно по десяти секундам референсного аудио и принимают указания по эмоции и подаче на естественном языке. step-tts-mini — вариант с низкой задержкой и низкой стоимостью.
Вместе с speech-2.8-turbo. Вариант hd даёт наивысшую точность на этом эндпоинте и стоит соответственно; turbo частично меняет её на задержку примерно за половину цены.
Вместе с glm-tts. Обе многоязычны и стоят дешевле моделей с клонированием, что делает их разумным выбором по умолчанию, когда конкретный клонированный голос не нужен.
input, один символ за один токен, поэтому стоимость известна ещё до отправки запроса. Созданное аудио тоже измеряется и отображается как completion-токены из расчёта тысяча токенов на минуту, но тарифицируется по нулевой ставке: запрос из пятидесяти девяти символов, давший около пяти секунд речи, записал 59 prompt-токенов и 83 completion-токена, а списание прошло по 59. Знаки препинания и пробелы считаются символами.
POST /v1/audio/transcriptions принимает multipart/form-data, а не JSON: передайте model как поле формы, а запись — как файловую часть с именем file. Ответ имеет вид {"text": "…"}. POST /v1/audio/translations устроен так же и возвращает английский текст. В отличие от эндпоинтов видео этот работает синхронно, поэтому длинная запись удерживает соединение открытым до завершения.
curl https://api.chinaapi.ai/v1/audio/transcriptions \
-H "Authorization: Bearer $CHINAAPI_KEY" \
-F model=stepaudio-2.5-asr \
-F file=@speech.mp3
# {"text":" China api text to speech verification."}
Вместе с step-asr, step-asr-1.1 и stepaudio-2-asr-pro. stepaudio-2.5-asr с большим отрывом самая дешёвая модель расшифровки на этом эндпоинте; варианты pro и 1.1 стоят примерно в пятнадцать раз дороже и оправданы лишь тогда, когда важна точность на сложном аудио.
Вместе с step-asr-1.1-stream. Они возвращают частичный текст по мере обработки аудио, а не одним блоком в конце, что и нужно для субтитров в реальном времени; обе стоят дороже за минуту, чем их непотоковые аналоги.
Вместе с glm-asr-2512 и mimo-v2.5-asr. qwen3-asr-flash и glm-asr-2512 — многоязычные варианты, а mimo-v2.5-asr настроена на китайские диалекты.
Опубликуйте псевдонимы моделей, которыми должна пользоваться ваша команда, а затем сопоставьте их с вышестоящими каналами, резервными пулами, ценами и группами в личном кабинете.
Ключи, пользователи, группы, состояние каналов, журналы, квоты и тарификация описаны в документации. Эта страница посвящена контракту протокола: эндпоинтам, параметрам, ответам и ошибкам.