Нейроныч API · Контракт проверен 28.09.2026. Здесь описаны запросы генерации, их параметры и ответы. Ключ выдаётся после подключения партнёра. Для генерации нужны активный ключ, доступная модель и баланс.
Подключение
https://api.xn--e1aikcel5c5a.onlineAuthorization: Bearer <PARTNER_API_KEY>
Content-Type: application/json
Idempotency-Key: <unique-request-key>
X-Client-Request-Id: <your-task-id>Base URL выше не содержит /v1. Указывайте полный путь метода. Все операции, кроме GET /v1/models, требуют авторизацию. Вместо Authorization допустим x-api-key; не передавайте оба заголовка. Ключ храните на своём сервере, не в браузере или мобильном клиенте.
Idempotency-Key обязателен для всех POST генерации текста, изображений и видео: строка 8–160 символов, например UUID. Один ключ обозначает один запрос в пределах партнёра, включая все его API-ключи. Сохраните ключ и исходное тело до отправки. Для получения статуса, скачивания и создания загрузки он не нужен.
Необязательный X-Client-Request-Id сохраняет UUID задачи вашей системы и возвращается в статусе и callback. Если ключ имеет вид generation:<UUID>:provider:<N>, UUID извлекается автоматически. Потерянный ответ можно восстановить через GET /api/v1/generations/by-client-request-id/<UUID>.
export API_BASE="https://api.xn--e1aikcel5c5a.online"
export API_KEY="<PARTNER_API_KEY>"
curl --fail-with-body "$API_BASE/v1/models"| Метод | Успешный ответ |
|---|---|
| GET /v1/models | 200 application/json |
| GET /v1/balance | 200 application/json |
| POST /v1/responses | 200 application/json | text/event-stream |
| POST /v1/chat/completions | 200 application/json | text/event-stream |
| POST /v1/messages | 200 application/json | text/event-stream |
| POST /v1/images/generations | 200 application/json |
| POST /v1/images/edits | 200 application/json |
| POST /v1/videos/generations | 202 application/json |
| GET /v1/videos/{request_id} | 200 application/json |
| GET /v1/videos/{request_id}/content | 200 video/mp4 | 206 partial content |
| GET /api/v1/generations/{request_id}/trace | 200 application/json |
| POST /v1/media/uploads | 201 application/json |
Баланс партнёра
GET /v1/balance возвращает только текущий рублёвый баланс владельца переданного партнёрского API-ключа. Требуется Authorization: Bearer <PARTNER_API_KEY> либо x-api-key. Нельзя получить баланс другого партнёра или использовать административный ключ. Этот GET не создаёт генерацию, не списывает деньги и не требует Idempotency-Key. Ответ не кешируется (Cache-Control: no-store).
curl --fail-with-body "$API_BASE/v1/balance" -H "Authorization: Bearer $API_KEY"{
"partner_id": "<your-partner-id>",
"balance_rub": "999.99",
"credit_limit_rub": "250.00",
"available_balance_rub": "1249.99"
}balance_rub — фактический денежный остаток в ₽; credit_limit_rub — отдельно одобренный кредитный лимит; available_balance_rub — их сумма. Для предупреждения о необходимости пополнения денежных средств сравнивайте именно balance_rub, не кредитный лимит. Денежные значения передаются строками с точностью до копейки.
Доступность моделей
GET /v1/models — актуальный список включённых Model ID, без пагинации и без параметров. data может быть пустым. Наличие модели в примере или таблице ограничений ниже не означает, что она включена для генераций. Отдельные режимы и размеры также должны быть доступны для вашего подключения. Model ID передавайте точно, включая регистр и версию.
{
"object": "list",
"data": [
{
"id": "seedance-2.5",
"object": "model",
"owned_by": "neironych"
}
]
}| Model | Model ID | Endpoint |
|---|---|---|
| GLM-5.3 Flash | glm-5.3-flash | /v1/chat/completions |
| GPT-5.6 Luna | gpt-5.6-luna | /v1/responses |
| GPT Image 2 | gpt-image-2 | /v1/images/generations |
| GPT Image 2.5 Sunburst | gpt-image-2.5-sunburst | /v1/images/generations |
| Grok 4.5 | grok-4.5 | /v1/responses |
| Grok Imagine Video 1.5 | grok-imagine-video-1.5 | /v1/videos/generations |
| Nano Banana 2 | nano-banana-2 | /v1/images/generations |
| Nano Banana 2 Lite | nano-banana-2-lite | /v1/images/generations |
| Nano Banana 2.1 | nano-banana-2.1 | /v1/images/generations |
| Nano Banana Pro | nano-banana-pro | /v1/images/generations |
| Qwen3.8-Max | qwen3.8-max | /v1/chat/completions |
| seedance-2.0 | seedance-2.0 | /v1/videos/generations |
| Seedance 2.5 | seedance-2.5 | /v1/videos/generations |
| Seedream 5.0 Pro | seedream-5.0-pro | /v1/images/generations |
| Wan 3 | wan-3 | /v1/videos/generations |
| Wan 3 Prime | wan-3-prime | /v1/videos/generations |
Текстовые модели
Выберите включённую текстовую модель из GET /v1/models. ID в примерах показывают формат запроса; их наличие в справочнике не означает, что модель сейчас доступна. GPT-модели вызывайте через Responses или Chat Completions. Messages подходит для Claude и совместимых моделей. Возможности vision, tools, JSON Schema и reasoning зависят от выбранной модели и не становятся доступными при смене протокола.
GPT-5.6 Luna
gpt-5.6-luna принимает текст и изображения, возвращает текст. Используйте POST /v1/responses с input либо POST /v1/chat/completions с messages; /v1/messages для этой модели не поддерживается. Изображения: input_image в Responses, image_url в Chat; подходят публичные HTTPS URL и data URL.
reasoning.effort в Responses или reasoning_effort в Chat: low, medium, high, xhigh, max; по умолчанию medium. Контекст 1 050 000 токенов, вход до 922 000, вывод до 128 000. Reasoning-токены входят в лимит вывода и оплачиваются как выходные.
service_tier — необязательная строка. Опустите её для стандартного режима. Значения priority или fast включают Fast: все опубликованные рублёвые тарифы этой модели умножаются на 2, включая вход, выход, чтение и запись кэша. Это правило относится к Luna; наличие Fast у другой модели проверяйте отдельно.
GLM-5.3 Flash
Для glm-5.3-flash используйте POST /v1/chat/completions. Модель принимает текст и изображения image_url с публичными HTTPS URL или data URL и возвращает текст. Контекст 1 000 000 токенов, вывод до 128 000. Thinking всегда включён; reasoning_effort: high или max, по умолчанию max. low и medium выполняются как high, xhigh — как max. service_tier не поддерживается: опустите его.
Responses и Messages доступны через преобразование в Chat Completions с ограничениями. В Responses передавайте текст или input_image; input_file не переносится. В Messages поддерживаются текст, tool-блоки и изображения только в base64; изображения по URL не переносятся. Web search и другие серверные инструменты при обоих преобразованиях не поддерживаются. reasoning.effort в Responses использует те же уровни. В Messages явно задавайте output_config.effort: без него передаётся medium, который модель выполняет как high.
Все три метода принимают JSON и требуют Authorization: Bearer, Content-Type: application/json и уникальный Idempotency-Key для каждой новой операции. В примерах API_BASE — указанный выше адрес без /v1 в конце, API_KEY — ваш ключ. Создайте REQUEST_KEY один раз, сохраните вместе с телом запроса; повтор той же операции использует тот же ключ. Для нового запроса создайте новый ключ.
REQUEST_KEY="$(python3 -c 'import uuid; print(uuid.uuid4())')"| Поле | Тип | Обязательность / значение | Назначение |
|---|---|---|---|
| model | string | Да | Точный ID текстовой модели. |
| stream | boolean | Нет; обычно false | true — SSE; false — один JSON-ответ. |
| max_output_tokens / max_completion_tokens / max_tokens | integer | 1–10,000,000 | Используйте поле своего протокола, описанное ниже. Это граница проверки API, а не лимит модели. Фактический максимум вывода и общий контекст могут быть меньше. Указывайте явный предел; reasoning-токены могут входить в него. |
| temperature / top_p | number | Нет; зависит от модели | Управление вариативностью. Диапазоны и совместимость с reasoning зависят от модели; при первом запросе опустите оба поля. |
Лимиты и возможности текстовых моделей
Проверено 28.09.2026. Здесь перечислены объявленные технические параметры, а не обещание доступности всех ID: работающая модель должна присутствовать в GET /v1/models. Контекст включает вход и вывод вместе; максимумы входа и вывода не всегда достижимы одновременно. Системные инструкции, история, инструменты и рассуждения также используют токены. Не объявлено означает, что подтверждённого значения нет; это не ноль, не отсутствие ограничения и не поддержка функции. API проверяет общий формат, а конкретная модель может отклонить превышение своего лимита.
| Model ID | Контекст, токены | Макс. вход | Макс. вывод | Вывод по умолчанию | Vision |
|---|---|---|---|---|---|
| gpt-6-astra | 1 050 000 | 922 000 | 128 000 | Не объявлено | Да |
| gpt-5.6-luna | 1 050 000 | 922 000 | 128 000 | Не объявлено | Да |
| gpt-5.6-terra | 1 050 000 | 922 000 | 128 000 | Не объявлено | Да |
| gpt-5.6-sol | 1 050 000 | 922 000 | 128 000 | Не объявлено | Да |
| claude-opus-5 | 1 000 000 | Не объявлено | 128 000 | Не объявлено | Да |
| claude-fable-5-1 | 1 000 000 | Не объявлено | 128 000 | Не объявлено | Да |
| claude-fable-5 | 1 000 000 | Не объявлено | 128 000 | Не объявлено | Да |
| grok-4.6 | 500 000 | Не объявлено | Не объявлено | Не объявлено | Да |
| claude-opus-4-8 | 1 000 000 | Не объявлено | 128 000 | Не объявлено | Да |
| claude-sonnet-5 | 1 000 000 | Не объявлено | 128 000 | Не объявлено | Да |
| deepseek-v4-flash-vision-exp | Не объявлено | Не объявлено | Не объявлено | Не объявлено | Не объявлено |
| deepseek-v4-pro-0813 | Не объявлено | Не объявлено | Не объявлено | Не объявлено | Не объявлено |
| glm-5.1 | 200 000 | Не объявлено | 128 000 | Не объявлено | Не объявлено |
| glm-5.2 | 1 000 000 | Не объявлено | 128 000 | Не объявлено | Не объявлено |
| glm-5.3 | 1 000 000 | Не объявлено | 128 000 | Не объявлено | Не объявлено |
| glm-5.3-flash | 1 000 000 | Не объявлено | 128 000 | Не объявлено | Да |
| gpt-5.3-codex-spark | Не объявлено | Не объявлено | Не объявлено | Не объявлено | Не объявлено |
| gpt-5.4 | 1 050 000 | Не объявлено | 128 000 | Не объявлено | Да |
| gpt-5.4-mini | 400 000 | 272 000 | 128 000 | Не объявлено | Да |
| gpt-5.5 | 1 050 000 | Не объявлено | 128 000 | Не объявлено | Да |
| grok-4.5 | 500 000 | Не объявлено | Не объявлено | Не объявлено | Да |
| kimi-k2.6 | 262 144 | Не объявлено | Не объявлено | Не объявлено | Не объявлено |
| kimi-k2.7-code | 262 144 | Не объявлено | Не объявлено | Не объявлено | Не объявлено |
| kimi-k3 | 1 048 576 | Не объявлено | 1 048 576 | 131 072 | Да |
| qwen3.8-max | 1 000 000 | 983 616 | 131 072 | Не объявлено | Да |
Следующая таблица отдельно показывает перечисленные уровни, дополнительные значения и объявленную настройку по умолчанию. Отсутствие default не означает medium. Для GPT с default=none не подменяйте отсутствие параметра произвольно выбранным уровнем. Способ передачи effort зависит от протокола и описан ниже. Отдельные правила GLM/Kimi приведены в разделе Reasoning / thinking.
| Model ID | Уровни effort | Дополнительные значения → фактические | Effort по умолчанию | Thinking |
|---|---|---|---|---|
| gpt-6-astra | low / medium / high / xhigh / max | Не объявлено | Не объявлено | Не объявлено |
| gpt-5.6-luna | low / medium / high / xhigh / max | Не объявлено | medium | Не объявлено |
| gpt-5.6-terra | low / medium / high / xhigh / max | Не объявлено | medium | Не объявлено |
| gpt-5.6-sol | low / medium / high / xhigh / max | Не объявлено | medium | Не объявлено |
| claude-opus-5 | low / medium / high / xhigh / max | Не объявлено | high | Можно переключать |
| claude-fable-5-1 | low / medium / high / xhigh / max | Не объявлено | high | Всегда включено |
| claude-fable-5 | low / medium / high / xhigh / max | Не объявлено | high | Всегда включено |
| grok-4.6 | low / medium / high / xhigh | max → high | high | Всегда включено |
| claude-opus-4-8 | low / medium / high / xhigh / max | Не объявлено | high | Включается явно |
| claude-sonnet-5 | low / medium / high / xhigh / max | Не объявлено | high | Можно переключать |
| deepseek-v4-flash-vision-exp | Не объявлено | Не объявлено | Не объявлено | Не объявлено |
| deepseek-v4-pro-0813 | Не объявлено | Не объявлено | Не объявлено | Не объявлено |
| glm-5.1 | Не объявлено | Не объявлено | Не объявлено | Не объявлено |
| glm-5.2 | high / max | low → high; medium → high; xhigh → max | max | Не объявлено |
| glm-5.3 | low / high / max | medium → high; xhigh → max | max | Всегда включено |
| glm-5.3-flash | high / max | low → high; medium → high; xhigh → max | max | Всегда включено |
| gpt-5.3-codex-spark | Не объявлено | Не объявлено | Не объявлено | Не объявлено |
| gpt-5.4 | low / medium / high / xhigh | Не объявлено | none | Не объявлено |
| gpt-5.4-mini | low / medium / high / xhigh | Не объявлено | none | Не объявлено |
| gpt-5.5 | low / medium / high / xhigh | Не объявлено | medium | Не объявлено |
| grok-4.5 | low / medium / high | max → high; xhigh → high | high | Всегда включено |
| kimi-k2.6 | Не объявлено | Не объявлено | Не объявлено | Не объявлено |
| kimi-k2.7-code | Не объявлено | Не объявлено | Не объявлено | Всегда включено |
| kimi-k3 | low / high / max | Не объявлено | max | Всегда включено |
| qwen3.8-max | Не объявлено | Не объявлено | Не объявлено | Всегда включено |
Claude Opus 5: отключение thinking допускается только при effort high или ниже. Claude Fable 5.1: не используйте принудительный tool_choice any/tool. Claude Sonnet 5: оставьте temperature, top_p и top_k неуказанными — произвольное изменение этих настроек не поддерживается. Для deepseek-v4-flash-vision-exp, deepseek-v4-pro-0813 и gpt-5.3-codex-spark текущие пределы не подтверждены; значения и настройки других ID на них автоматически не распространяются.
POST /v1/responses
| Поле | Тип | Обязательность / значение | Назначение |
|---|---|---|---|
| input | string | array | Да | Текст или сообщения {role, content}. content — строка либо список input_text/input_image блоков. role обычно user/assistant/system/developer. |
| instructions | string | Нет; зависит от модели | Инструкции для текущего запроса. |
| max_output_tokens | integer | Нет; зависит от модели | Верхняя граница вывода. |
| previous_response_id | string | Нет; зависит от модели | id завершённого ответа этого API, полученного вашим аккаунтом. Не все модели поддерживают продолжение. При invalid_previous_response передайте историю явно новым запросом. |
| tools / tool_choice | array / string | object | Нет; зависит от модели | Функции с type=function, name, parameters; выбор auto/none/required или конкретной функции. |
| parallel_tool_calls | boolean | Нет; зависит от модели | Разрешение нескольких вызовов функций в одном ответе. |
| reasoning | object | Нет; зависит от модели | Например {"effort":"low"}. Набор уровней зависит от модели. |
| text.format | object | Нет; зависит от модели | Формат текста; json_schema задаётся через name, schema и strict. См. пример ниже. |
| store / metadata | boolean / object | Нет; зависит от модели | Дополнительные настройки поддерживающих их моделей; не являются гарантией хранения или отдельного метода чтения ответа. |
curl --fail-with-body -sS -N "$API_BASE/v1/responses" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: $REQUEST_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "gpt-5.6-sol",
"input": "Explain a database transaction in two sentences.",
"max_output_tokens": 512
}'HTTP 200: читайте output[] и собирайте блоки content[] с type=output_text. Массив может также содержать reasoning и function_call. Не привязывайте извлечение текста к одному индексу. status=incomplete означает частичный результат; проверяйте incomplete_details.
{
"id": "8488e6a4-d38a-4f95-a831-752aa12bf5d7",
"object": "response",
"status": "completed",
"output": [
{
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "Ready."
}
]
}
],
"usage": {
"input_tokens": 12,
"output_tokens": 3,
"total_tokens": 15
}
}POST /v1/chat/completions
| Поле | Тип | Обязательность / значение | Назначение |
|---|---|---|---|
| messages | array | Да | История {role, content}: system/developer/user/assistant/tool в порядке диалога. content — строка или блоки text/image_url; доступные роли зависят от модели. |
| max_completion_tokens | integer | Нет; зависит от модели | Предпочтительное поле предела вывода. |
| max_tokens | integer | Нет; зависит от модели | Совместимое поле для моделей, использующих прежний формат. Не задавайте одновременно с max_completion_tokens. |
| tools / tool_choice | array / string | object | Нет; зависит от модели | tools[].type=function, описание внутри tools[].function; выбор auto/none/required либо конкретной функции. |
| parallel_tool_calls | boolean | Нет; зависит от модели | Разрешение нескольких функций в ответе. |
| response_format | object | Нет; зависит от модели | type=json_object для JSON или type=json_schema с вложенным json_schema для схемы. Просите JSON также в тексте запроса. |
| reasoning_effort / thinking | string / object | Нет; зависит от модели | См. таблицу моделей ниже; это разные настройки, а не взаимозаменяемые имена. |
| stream_options | object | Нет; зависит от модели | При stream=true API запрашивает include_usage=true; обработайте завершающий блок usage, даже если choices пуст. |
| stop / seed / presence_penalty / frequency_penalty | string | array / integer / number / number | Нет; зависит от модели | Остановка, подсказка генератору и штрафы повторения только у поддерживающих их моделей. seed не гарантирует точное воспроизведение. |
curl --fail-with-body -sS -N "$API_BASE/v1/chat/completions" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: $REQUEST_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "glm-5.3",
"messages": [
{
"role": "user",
"content": "Explain a database transaction in two sentences."
}
],
"max_completion_tokens": 2048,
"reasoning_effort": "low"
}'HTTP 200: текст находится в choices[].message.content, вызовы функций — в message.tool_calls, причина завершения — finish_reason. length означает достижение лимита и возможный обрыв текста.
{
"id": "8488e6a4-d38a-4f95-a831-752aa12bf5d7",
"object": "chat.completion",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Ready."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 12,
"completion_tokens": 3,
"total_tokens": 15
}
}POST /v1/messages
Передайте anthropic-version: 2023-06-01. Вместо Bearer допускается x-api-key с вашим ключом, если Authorization отсутствует. Дополнительный anthropic-beta используйте только для подтверждённой возможности выбранной модели.
| Поле | Тип | Обязательность / значение | Назначение |
|---|---|---|---|
| messages | array | Да | Сообщения user/assistant; content — строка или блоки text/image/tool_use/tool_result. |
| max_tokens | integer | Да | Предел вывода. Обязателен даже при stream=true. |
| system | string | array | Нет; зависит от модели | Отдельная системная инструкция или текстовые блоки. Роль system в messages не используется. |
| tools / tool_choice | array / object | Нет; зависит от модели | Определения name, description, input_schema; выбор {type:auto}, {type:any}, {type:tool,name:...} или {type:none}, если поддерживается моделью. |
| thinking | object | Нет; зависит от модели | Включение/режим рассуждений. Форма type и budget_tokens зависит от поколения модели; budget_tokens не заменяет обязательный max_tokens. |
| output_config | object | Нет; зависит от модели | Уровень effort и формат вывода у поддерживающих моделей. Не переносите сюда объект response_format из Chat Completions. |
| stop_sequences / top_k / metadata | array / integer / object | Нет; зависит от модели | Последовательности остановки, ограничение выборки, метаданные; поддержка зависит от модели. |
curl --fail-with-body -sS -N "$API_BASE/v1/messages" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: $REQUEST_KEY" \
-H "Content-Type: application/json" \
-H "anthropic-version: 2023-06-01" \
--data '{
"model": "claude-sonnet-5",
"max_tokens": 512,
"messages": [
{
"role": "user",
"content": "Explain a database transaction in two sentences."
}
]
}'HTTP 200: content[] содержит text, tool_use и другие блоки модели. Читайте все text-блоки; stop_reason=max_tokens указывает на ограниченный вывод, stop_reason=tool_use — на запрос инструмента. Здесь счётчики usage называются input_tokens и output_tokens.
{
"id": "8488e6a4-d38a-4f95-a831-752aa12bf5d7",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Ready."
}
],
"stop_reason": "end_turn",
"usage": {
"input_tokens": 12,
"output_tokens": 3
}
}Инструменты и JSON Schema
Ниже тела запросов к соответствующим методам; заголовки те же. Приложение выполняет функцию само после проверки её аргументов и разрешений. Результат отправляйте следующим запросом с новым Idempotency-Key. В Responses это input-элемент type=function_call_output с call_id и строкой output; в Chat — сообщение role=tool с tool_call_id и строкой content после сообщения assistant с tool_calls; в Messages — user-блок type=tool_result с tool_use_id и content после assistant-блока tool_use. Сохраняйте исходные идентификаторы вызовов и историю.
responses — tools
{
"model": "gpt-5.6-sol",
"input": "Check order A123 using the available tool.",
"max_output_tokens": 512,
"tools": [
{
"type": "function",
"name": "get_order",
"description": "Read an order status.",
"parameters": {
"type": "object",
"properties": {
"order_id": {
"type": "string"
}
},
"required": [
"order_id"
],
"additionalProperties": false
},
"strict": true
}
],
"tool_choice": "auto"
}chat/completions — tools
{
"model": "gpt-5.6-sol",
"messages": [
{
"role": "user",
"content": "Check order A123 using the available tool."
}
],
"max_completion_tokens": 512,
"tools": [
{
"type": "function",
"function": {
"name": "get_order",
"description": "Read an order status.",
"parameters": {
"type": "object",
"properties": {
"order_id": {
"type": "string"
}
},
"required": [
"order_id"
],
"additionalProperties": false
}
}
}
],
"tool_choice": "auto"
}messages — tools
{
"model": "claude-sonnet-5",
"max_tokens": 512,
"messages": [
{
"role": "user",
"content": "Check order A123 using the available tool."
}
],
"tools": [
{
"name": "get_order",
"description": "Read an order status.",
"input_schema": {
"type": "object",
"properties": {
"order_id": {
"type": "string"
}
},
"required": [
"order_id"
]
}
}
],
"tool_choice": {
"type": "auto"
}
}Для строгой схемы все обязательные свойства перечислены в required; additionalProperties=false запрещает лишние поля. Валидируйте JSON в приложении и обрабатывайте отказ модели или достижение лимита токенов. Поддержка structured output не следует только из принятия поля API.
responses — JSON Schema
{
"model": "gpt-5.6-sol",
"input": "Return the word ready in a status field.",
"max_output_tokens": 512,
"text": {
"format": {
"type": "json_schema",
"name": "status_result",
"strict": true,
"schema": {
"type": "object",
"properties": {
"status": {
"type": "string"
}
},
"required": [
"status"
],
"additionalProperties": false
}
}
}
}chat/completions — JSON Schema
{
"model": "gpt-5.6-sol",
"messages": [
{
"role": "user",
"content": "Return the word ready in a status field."
}
],
"max_completion_tokens": 512,
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "status_result",
"strict": true,
"schema": {
"type": "object",
"properties": {
"status": {
"type": "string"
}
},
"required": [
"status"
],
"additionalProperties": false
}
}
}
}Изображение в текстовом запросе
Используйте только vision-модель. Замените https://example.com/reference.jpg на прямую доступную HTTPS-ссылку на изображение. Base64 также зависит от модели: в Responses input_image.image_url и Chat image_url.url передают data:image/jpeg;base64,...; в Messages используют source с type=base64, media_type=image/jpeg и data с чистым base64. Для Kimi K3 используйте base64 data URL. Максимальный размер/число изображений и поддержка файлов и аудио не являются общими для всех текстовых моделей.
responses — vision
{
"model": "gpt-5.6-sol",
"input": [
{
"role": "user",
"content": [
{
"type": "input_text",
"text": "Describe the image."
},
{
"type": "input_image",
"image_url": "https://example.com/reference.jpg"
}
]
}
],
"max_output_tokens": 512
}chat/completions — vision
{
"model": "gpt-5.6-sol",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Describe the image."
},
{
"type": "image_url",
"image_url": {
"url": "https://example.com/reference.jpg"
}
}
]
}
],
"max_completion_tokens": 512
}messages — vision
{
"model": "claude-sonnet-5",
"max_tokens": 512,
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Describe the image."
},
{
"type": "image",
"source": {
"type": "url",
"url": "https://example.com/reference.jpg"
}
}
]
}
]
}Видео в Qwen3.8-Max
Оригинальная модель Qwen3.8-Max понимает видео, но текущий маршрут Нейроныча принимает для неё только текст и изображения. Блоки video_url, input_video и video отклоняются с HTTP 422 invalid_request_contract и заголовком X-Validation-Error: video_input_unavailable до создания задачи и оплаты. Не заменяйте видео кадрами без явного выбора такого режима. Для текстовых запросов обязательно указывайте Idempotency-Key длиной от 8 до 160 символов.
Reasoning / thinking
Для GLM и Kimi управляйте reasoning_effort через Chat Completions. Таблица описывает настройку при доступности соответствующей модели; уровни не универсальны. GPT использует reasoning.effort в Responses или reasoning_effort в Chat. У Claude thinking и output_config зависят от поколения; без подтверждённой конфигурации опустите их. HTTP 200 не подтверждает, что произвольная неподдерживаемая настройка повлияла на результат.
| Поле | Тип | Обязательность / значение | Назначение |
|---|---|---|---|
| glm-5.1 | reasoning_effort | none | По умолчанию включено; none отключает. |
| glm-5.2 | reasoning_effort | none / low / medium / high / xhigh / max | По умолчанию max; low/medium/high → high, xhigh/max → max; none отключает. |
| glm-5.3 | reasoning_effort | low / high / max | По умолчанию max; отключение не поддерживается. |
| glm-5.3-flash | reasoning_effort | high / max | По умолчанию max; low/medium → high, xhigh → max; всегда включено. |
| kimi-k2.6 | reasoning_effort | low / medium / high / xhigh | Без поля выключено; перечисленные значения включают. max не поддерживается. |
| kimi-k2.7-code | — | — | Всегда включено; thinking/reasoning_effort не задают уровень. |
| kimi-k3 | reasoning_effort | low / high / max | По умолчанию max; всегда включено. Сохраняйте один уровень на протяжении диалога. |
curl --fail-with-body -sS -N "$API_BASE/v1/chat/completions" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: $REQUEST_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "kimi-k3",
"messages": [
{
"role": "user",
"content": "List three checks before saving a payment."
}
],
"max_completion_tokens": 2048,
"reasoning_effort": "low",
"stream": true
}'SSE / stream=true
Успешный поток имеет Content-Type: text/event-stream и X-Request-Id. События разделяются пустой строкой; граница сетевого чанка не является границей события. Собирайте data: до конца события, затем разбирайте JSON. Обрабатывайте event:, служебные блоки и ошибки; при [DONE] JSON-парсер не вызывается. Иллюстрации ниже сокращены: токены usage и текст приведены только как пример.
event: response.output_text.delta
data: {"type":"response.output_text.delta","delta":"Ready."}
event: response.completed
data: {"type":"response.completed","response":{"id":"8488e6a4-d38a-4f95-a831-752aa12bf5d7","status":"completed","usage":{"input_tokens":12,"output_tokens":3}}}
Responses: собирайте response.output_text.delta.delta; конец — response.completed или response.incomplete. Последний означает частичный результат. Function-call arguments приходят отдельными событиями; их тоже нужно собрать до разбора JSON.
data: {"choices":[{"index":0,"delta":{"content":"Ready."},"finish_reason":null}]}
data: {"choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: {"choices":[],"usage":{"prompt_tokens":12,"completion_tokens":3,"total_tokens":15}}
data: [DONE]
Chat: объединяйте choices[].delta по index; content и tool_calls могут приходить частями. Не заканчивайте чтение сразу на finish_reason: после него может идти usage с пустым choices.
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Ready."}}
event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"},"usage":{"output_tokens":3}}
event: message_stop
data: {"type":"message_stop"}
Messages: обработайте message_start, content_block_start/delta/stop, message_delta и message_stop; text_delta.text — текст, input_json_delta.partial_json — часть аргументов инструмента. Счётчики usage могут находиться в нескольких событиях.
Сохраните X-Request-Id для обращения в поддержку. Разрыв потока или клиентский таймаут не означает отмену запроса: частичный текст не подтверждает успешное завершение. Не создавайте новую платную операцию автоматически при обрыве. Повтор синхронного запроса с тем же ключом возвращает 409 request_already_submitted, а не сохранённый текст. Описание ошибок — в общем разделе.
Изображения
POST /v1/images/generations создаёт изображения. POST /v1/images/edits принимает JSON с images или multipart/form-data с файлами. Запрос синхронный: дождитесь ответа, не создавайте второй при задержке.
| Параметр | Тип / обязательность | Правила |
|---|---|---|
| model | string · required | Model ID семейства изображений из /v1/models. |
| prompt | string · required | Непустое описание результата/изменений. |
| n | integer · optional, 1 | GPT Image: 1–7; Nano Banana: 1–4; Grok Image: 1–10; Seedream 5.0 Pro: 1. |
| images | array<object> · edits | JSON: [{"image_url":"https://…"}] или image_url с data:image/…;base64,…; GPT до 16, Nano Banana Pro до 14, Seedream 5.0 Pro до 8, остальные до 3. |
| mask | object | file · optional | GPT edits: {"image_url":"https://…/mask.png"} или файл PNG с альфа-каналом; прозрачная область меняется. Размер совпадает с первым изображением; не более одной маски. |
| size | string · optional, auto | GPT: auto или WIDTHxHEIGHT, например 1024x1024. Обе стороны положительные. Итоговые пиксели могут отличаться от запроса; проверяйте результат. |
| quality | string · optional, auto | GPT Image: auto | low | medium | high. |
| resolution | string · optional | Nano Banana 2/Pro: 1k (по умолчанию), 2k или 4k. Grok: 1k или 2k; доступность зависит от модели/режима. Nano Banana 2 Lite поддерживает только 1k. GPT, включая Sunburst: размер задаётся через size, например 3840x2160 для 4K. |
| aspect_ratio | string · optional | Nano: 1:1 (по умолчанию), 16:9, 9:16, 4:3, 3:4. Nano Banana Pro также принимает 3:2, 2:3, 5:4, 4:5, 21:9; при edits без aspect_ratio результат тоже 1:1, соотношение референса не наследуется. У GPT желаемую композицию также задавайте в prompt. |
| response_format | string · optional | b64_json или url для GPT/Grok; Nano поддерживает только b64_json. Nano Banana Pro возвращает JPEG в data[].b64_json. Для воспроизводимости задавайте формат явно. |
POST /v1/images/generations{
"model": "gpt-image-2",
"prompt": "A ceramic cup on a plain blue background",
"n": 1,
"size": "1024x1024",
"response_format": "b64_json"
}POST /v1/images/edits{
"model": "gpt-image-2",
"prompt": "Change the background to blue",
"images": [
{
"image_url": "https://media.example.com/cup.png"
}
],
"n": 1,
"response_format": "b64_json"
}Nano Banana 2 · 4K
POST /v1/images/generations{
"model": "nano-banana-2",
"prompt": "A cinematic mountain panorama",
"resolution": "4k",
"aspect_ratio": "16:9",
"n": 1,
"response_format": "b64_json"
}Nano Banana Pro · 4K
POST /v1/images/generations{
"model": "nano-banana-pro",
"prompt": "A cinematic mountain panorama",
"resolution": "4k",
"aspect_ratio": "21:9",
"n": 1,
"response_format": "b64_json"
}Seedream 5.0 Pro
POST /v1/images/generations{
"model": "seedream-5.0-pro",
"prompt": "A ceramic cup on a plain background",
"resolution": "2k",
"aspect_ratio": "16:9",
"n": 1,
"response_format": "b64_json"
}POST /v1/images/edits{
"model": "seedream-5.0-pro",
"prompt": "Change the cup color to green",
"images": [
{
"image_url": "https://media.example.com/cup.png"
}
],
"resolution": "2k",
"n": 1
}Seedream 5.0 Pro: 1k или 2k (по умолчанию), только n=1; JPEG. Соотношения: 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 21:9, 2:1, 1:2, 9:21. Редактирование: до 8 референсов через JSON images или multipart image[]; суммарно до 48 MiB. Размер HTTPS-референсов проверяет поставщик. Формат ответа: b64_json или url. Параметры size, quality и stream не поддерживаются. Доступность модели проверяйте в /v1/models.
GPT Image 2.5 Sunburst · 4K
POST /v1/images/generations{
"model": "gpt-image-2.5-sunburst",
"prompt": "A cinematic mountain panorama",
"size": "3840x2160",
"quality": "high",
"n": 1,
"response_format": "b64_json"
}GPT Image 2.6 Flare / Sunburst
POST /v1/images/generations{
"model": "gpt-image-2.6-flare",
"prompt": "A ceramic cup on a plain blue background",
"size": "2048x1152",
"quality": "max",
"n": 1,
"response_format": "b64_json"
}POST /v1/images/edits{
"model": "gpt-image-2.6-sunburst",
"prompt": "Change the cup color to green",
"images": [
{
"image_url": "https://media.example.com/cup.png"
}
],
"size": "1440x1440",
"quality": "xhigh",
"n": 1,
"response_format": "b64_json"
}Обе версии поддерживают 1K и 2K: size=auto либо ширинаxвысота с максимальной стороной 2048. quality: auto, low, medium, high, xhigh, max; n от 1 до 7. Редактирование: до 16 референсов через JSON images или multipart image[]. Формат ответа: b64_json или url. Параметры resolution, aspect_ratio и 4K не поддерживаются. Оплата за каждое фактически возвращённое изображение; доступность проверяйте в /v1/models.
В multipart передавайте model, prompt, n как поля формы; файлы — повторяющимся image[] (также принимаются image, images, images[]). Лимиты файлов: GPT 16, Nano Banana Pro 14, другие Nano 3, Grok 1, Seedream 5.0 Pro 8; плюс одна mask у GPT. Не задавайте Content-Type вручную: клиент добавит boundary.
curl --fail-with-body "$API_BASE/v1/images/edits" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: $REQUEST_KEY" \
-F "model=gpt-image-2" -F "prompt=Change the background to blue" \
-F "n=1" -F "response_format=b64_json" -F "image[]=@reference.png"{
"created": 1790596800,
"data": [
{
"b64_json": "<base64-encoded-image>"
}
]
}Ответ содержит data[] с b64_json или url в выбранном формате, возможен revised_prompt. Декодируйте base64 либо сразу скачайте URL. Ссылки временные; срок постоянного хранения не гарантирован. На внешние ссылки изображений не отправляйте API-ключ. X-Request-Id содержит наш ID запроса. Потерянный HTTP-ответ можно восстановить через статус по нашему ID или X-Client-Request-Id. У GPT размерный класс определяется фактическими пикселями: до 1024 по длинной стороне — 1K, до 2048 — 2K, выше — 4K. Учитывается каждое возвращённое изображение.
Видео: создание и получение
POST /v1/videos/generations принимает только JSON. Все модели возвращают 202 с request_id; это подтверждение приёма запроса, а не готовности видео. Сохраните ID. Все значения duration — целые секунды.
| Параметр | Тип / обязательность | Правила |
|---|---|---|
| model | string · required | Точный ID доступной видеомодели. |
| prompt | string | Обязателен без входных медиа; всегда обязателен для edit, Kling, Wan и MiniMax. Seedance: до 40 000 байт UTF-8; Wan: до 4500 символов. Ссылки на референсы: @Image 1, @Video 1, @Audio 1. |
| duration | integer | Задавайте явно в диапазоне своей модели, см. таблицу. Для Seedance/Kling/MiniMax/Wan при пропуске — 5; у Grok задавайте обязательно для предсказуемой длины. Для Seedance 2.5 edit — -1 или пропустить. |
| resolution | string · optional | По умолчанию 720p, у MiniMax 768p. Допустимые значения в таблице ниже, регистр значим. |
| aspect_ratio | string · optional | Задавайте явно для текстового и референсного режима. Базовые: 1:1, 16:9, 9:16, 4:3, 3:4. Seedance/MiniMax также 21:9; Grok также 3:2, 2:3. Правила adaptive ниже. |
| n | integer · optional, 1 | Только 1. |
| reference_images / reference_videos / reference_audios | array<object> · optional | [{"url":"https://…"}]. Порядок определяет нумерацию референсов. Лимиты каждого типа и суммы ниже. Не передавайте duration референса: длина определяется по файлу. |
| start_image / end_image | object · optional | Seedance/MiniMax/Wan: {"url":"https://…"}. end_image требует start_image. Кадры нельзя смешивать с reference_*. |
| image | object · optional | Grok: первый кадр {"url":"https://…"}; не совмещайте с reference_images. |
| omni_reference_task_type | string · optional, auto | Seedance 2.5: auto, reference, edit или extend; для edit/extend см. отдельные примеры. |
| draft / draft_task | boolean / object · Seedance 2.5 | draft=true создаёт 480p-превью. Для полного 1080p результата отправьте только model и draft_task:{"id":"11111111-1111-4111-8111-111111111111"} в течение 7 дней. |
| generate_audio | boolean · optional | Seedance 2.5 и Kling 4.0: true создаёт звук, false — видео без звука; только boolean, не строка. Wan также поддерживает переключатель. Контракты остальных моделей не меняются. |
| seed / watermark | model-dependent | Seedance/Kling/MiniMax: seed запрещён; watermark=true запрещён. Отсутствие ошибки формата для других моделей не подтверждает поддержку такой настройки. |
| Model ID | Секунды | resolution | Фото / видео / аудио / всего |
|---|---|---|---|
| seedance-2.5 | 4–30 | 480p, 720p, 1080p | 30 / 10 / 10 / 50 |
| seedance-2.0 | 4–15 | 480p, 720p, 1080p, 4k | 9 / 3 / 3 / 12 |
| grok-imagine-video-1.5 | 1–15 | 480p, 720p, 1080p | 7 / 0 / 0 / 7 |
Self-Developed NSFW: используйте точный Model ID из таблицы. Правила кадров, референсов и аудио соответствуют семейству Seedance 2.0 или 2.5; версия 2.5 также поддерживает edit. Варианты Self-Developed NSFW не принимают 480p: 2.0 принимает 720p, 1080p и 4k, 2.5 — 720p и 1080p. Пример 480p ниже относится к обычной seedance-2.5. Текущую доступность проверяйте через GET /v1/models.
Seedance 2.5: текст и обычные референсы используют фиксированный aspect_ratio; adaptive здесь запрещён. Для start_image/end_image — только adaptive либо отсутствие aspect_ratio. Seedance 2.0 с кадрами также принимает фиксированные пропорции. MiniMax с кадрами: aspect_ratio не передавайте — он берётся из изображения; с референсами можно adaptive. Grok с reference_images допускает только 480p/720p. Seedance 2.0 и MiniMax требуют изображение/видео вместе с аудио; Seedance 2.5 допускает только аудио.
Wan: при входных кадрах не задавайте aspect_ratio. Суммарная длительность reference_videos не более 15 секунд, а результат плюс входные видео — не более 30 секунд. Например, для 15 секунд референса выход ограничен 15 секундами. Проверка формата запроса не заменяет проверку содержимого медиа.
Seedance 2.5 · референс
POST /v1/videos/generations{
"model": "seedance-2.5",
"prompt": "Animate the image in @Image 1 with a gentle camera move.",
"reference_images": [
{
"url": "https://media.example.com/reference.jpg"
}
],
"duration": 4,
"resolution": "480p",
"aspect_ratio": "9:16"
}Сохраните JSON как request.json. Создайте REQUEST_KEY один раз и сохраните его вместе с этим файлом; при повторе той же операции не генерируйте новый ключ.
REQUEST_KEY="$(python3 -c 'import uuid; print(uuid.uuid4())')"
curl --fail-with-body "$API_BASE/v1/videos/generations" \
-H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: $REQUEST_KEY" --data-binary @request.jsonSeedance 2.5 · первый и последний кадры
POST /v1/videos/generations{
"model": "seedance-2.5",
"prompt": "A smooth camera move between the frames",
"start_image": {
"url": "https://media.example.com/start.jpg"
},
"end_image": {
"url": "https://media.example.com/end.jpg"
},
"duration": 4,
"resolution": "720p",
"aspect_ratio": "adaptive"
}Seedance 2.5 · edit
POST /v1/videos/generations{
"model": "seedance-2.5",
"prompt": "Replace the sky in @Video 1 with a sunset",
"reference_videos": [
{
"url": "https://media.example.com/source.mp4"
}
],
"omni_reference_task_type": "edit",
"duration": -1,
"resolution": "720p",
"aspect_ratio": "adaptive"
}Seedance 2.5 · extend
POST /v1/videos/generations{
"model": "seedance-2.5",
"prompt": "Continue @Video 1 forward as the camera rises above the forest",
"reference_videos": [
{
"url": "https://media.example.com/source.mp4"
}
],
"omni_reference_task_type": "extend",
"duration": 5,
"resolution": "720p"
}Seedance 2.5 · draft
POST /v1/videos/generations{
"model": "seedance-2.5",
"prompt": "Preview a slow aerial shot over a foggy forest",
"duration": 5,
"draft": true
}POST /v1/videos/generations{
"model": "seedance-2.5",
"draft_task": {
"id": "11111111-1111-4111-8111-111111111111"
}
}Тарификация Seedance 2.5: для обычного reference с reference_videos применяется тариф edit для выбранного разрешения, даже когда также переданы фото/аудио. Extend и draft имеют отдельные ставки и проходят проверку покрытия действующей розничной ценой. Без reference_videos применяется обычный тариф. При наличии видео поставщик считает оплачиваемые секунды как длительность результата плюс суммарную длительность видеореференсов; после завершения списывается только фактический usage. Наличие видео не меняет режим запроса автоматически.
Для seedance-2.5 edit обязателен prompt и ровно один reference_videos, длиной 4–30 секунд. До 30 reference_images могут направлять edit; аудио и второе видео не принимаются. Для остальных смешанных референсов используйте reference: сервер не переключает режим автоматически. В edit длина и пропорции следуют исходному ролику: duration=-1 или пропустить, aspect_ratio=adaptive или пропустить; start_image, end_image и фиксированный size не используются.
Альтернативные имена полей
Следующие формы записи описаны для Seedance, MiniMax и Wan; для Grok используйте его основные поля.
| Поле | Эквивалент |
|---|---|
| seconds | duration |
| ratio | aspect_ratio |
| image_urls: ["https://…"] | reference_images: [{"url":"https://…"}] |
| video_urls: ["https://…"] | reference_videos: [{"url":"https://…"}] |
| audio_urls: ["https://…"] | reference_audios: [{"url":"https://…"}] |
| image_url: "https://…" | start_image: {"url":"https://…"} |
| end_image_url: "https://…" | end_image: {"url":"https://…"} |
| frame_images: [{"frame_type":"first_frame","url":"https://…"}, {"frame_type":"last_frame","url":"https://…"}] | start_image + end_image |
| input_references: [{"type":"image_url","image_url":{"url":"https://…"}}] | reference_images; type=video_url/audio_url → reference_videos/reference_audios |
Выбирайте один способ записи: не дублируйте исходное поле и его псевдоним. Вместо resolution/aspect_ratio есть size=WIDTHxHEIGHT: соотношение должно соответствовать 1:1, 16:9, 9:16, 4:3, 3:4 или 21:9 с отклонением не более 3%. Короткая сторона <720 → 480p, <1080 → 720p, <2160 → 1080p, иначе 4k. Явные resolution/ratio не должны противоречить size. Для MiniMax 1366x768 соответствует 768p; при другом size обязателен resolution. Для новых интеграций используйте основные поля выше.
Ответ и опрос статуса
{
"request_id": "<our-request-id>",
"client_request_id": "<your-task-id>"
}curl --fail-with-body "$API_BASE/v1/videos/$REQUEST_ID" \
-H "Authorization: Bearer $API_KEY"| status | Значение |
|---|---|
| pending | В очереди или выполняется; продолжайте опрос раз в 10–15 секунд. |
| done | Готово: video.url временно доступен без авторизации; authenticated_url требует ключ. |
| failed | Терминальная ошибка; смотрите error, если он есть. |
| expired | Истекло время выполнения задачи; терминальный статус. |
{
"request_id": "<our-request-id>",
"client_request_id": "<your-task-id>",
"status": "done",
"video": {
"url": "https://api.xn--e1aikcel5c5a.online/api/v1/media/results/<request-id>/<expires>/<signature>",
"expires_at": 1791201600,
"authenticated_url": "https://api.xn--e1aikcel5c5a.online/v1/videos/<our-request-id>/content"
},
"usage": {
"billed_seconds": 4
}
}request_id в пути — ID из ответа 202, он доступен только своему партнёру. video появляется при done; usage.billed_seconds может отсутствовать и означает учтённые секунды, включая входное видео, а не только длительность результата. progress, ETA и video.duration не входят в ответ этого API. Не запускайте новую генерацию из-за истечения времени ожидания в своём приложении.
curl --fail-with-body "$API_BASE/v1/videos/$REQUEST_ID/content" \
-H "Authorization: Bearer $API_KEY" --output result.mp4Постоянный authenticated_url требует тот же аккаунт партнёра; временный video.url можно передать Telegram или клиенту без раскрытия API-ключа. Поддерживается Range: bytes=0-1023 с ответом 206 и Content-Range при частичной отдаче. До готовности файл недоступен. Сохраните готовый MP4 у себя: постоянное хранение результата не гарантируется.
wan-3
2–30 сек; 480p / 720p / 1080p; до 10 изображений, 5 видео, 5 аудио, всего 20. Промпт обязателен, до 20000 символов. Первый/последний кадр и edit поддерживаются. В edit не передавайте duration, aspect_ratio, size: размеры берутся из первого видео. Поддерживаются seed от 0 до 4294967295 и generate_audio: false.
POST /v1/videos/generations
{
"model": "wan-3",
"prompt": "A slow camera move around a ceramic cup",
"duration": 5,
"resolution": "720p",
"generate_audio": false,
"seed": 42
}POST /v1/videos/generations
{
"model": "wan-3",
"prompt": "Make the colors in @Video 1 warmer",
"omni_reference_task_type": "edit",
"resolution": "720p",
"reference_videos": [
{
"url": "https://media.example.com/source.mp4"
}
]
}Референсы передаются как HTTPS URL. Предварительного удержания с партнёрского баланса нет. Списание выполняется после успешной генерации по подтверждённым usage.billed_seconds. Изображения и аудио отдельно не оплачиваются. Один запрос — одно видео. Сохраняйте request_id из HTTP 202, опрашивайте GET /v1/videos/{request_id}; при done скачайте /v1/videos/{request_id}/content. Не повторяйте POST с новым ключом при задержке.
Входные клипы: 1–15 сек, до 15 сек суммарно. Результат и видеореференсы вместе: до 30 сек.
wan-3-prime
4–30 сек; 480p / 720p / 1080p; до 10 изображений, 5 видео, 5 аудио, всего 20. Промпт обязателен, до 20000 символов. Пропорции: 16:9, 1:1, 9:16. Первый/последний кадр, edit, seed, adaptive и отключение звука не поддерживаются. Аудиореференс требует изображение или видео.
POST /v1/videos/generations
{
"model": "wan-3-prime",
"prompt": "Animate the subject in @Image 1",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9",
"reference_images": [
{
"url": "https://media.example.com/reference.jpg"
}
]
}Референсы передаются как HTTPS URL. Предварительного удержания с партнёрского баланса нет. Списание выполняется после успешной генерации по подтверждённым usage.billed_seconds. Изображения и аудио отдельно не оплачиваются. Один запрос — одно видео. Сохраняйте request_id из HTTP 202, опрашивайте GET /v1/videos/{request_id}; при done скачайте /v1/videos/{request_id}/content. Не повторяйте POST с новым ключом при задержке.
Входные клипы: 1–15 сек, до 15 сек суммарно. Результат и видеореференсы вместе: до 30 сек.
Загрузка референсов
Для локального файла сначала создайте загрузку, затем отправьте байты по upload_url. media_url вставьте в запрос генерации. Генерация и загрузка — разные операции. POST /v1/media/uploads принимает только JSON с описанием файла, а не сам файл. Не отправляйте сюда multipart/form-data, байты JPEG/PNG или base64 вместо JSON. Такой Content-Type возвращает 415 media_upload_requires_json; повреждённый JSON — 422 invalid_request_contract.
POST /v1/media/uploads
Content-Type: application/json
Authorization: Bearer <PARTNER_API_KEY>{
"model": "seedance-2.5",
"type": "image",
"content_type": "image/jpeg",
"size_bytes": 123456
}| Field | Type | Required |
|---|---|---|
| model | string · Model ID | yes |
| type | image | video | audio | yes |
| content_type | string · MIME | yes |
| size_bytes | integer · actual file bytes > 0 | yes |
{
"upload_url": "https://storage.example.com/signed-put-url",
"media_url": "https://storage.example.com/signed-read-url",
"upload_expires_at": "2026-09-28T12:15:00Z",
"expires_at": "2026-10-05T12:00:00Z"
}201 возвращает подписанные ссылки и сроки в UTC. PUT должен завершиться до upload_expires_at (обычно 15 минут), media_url действует до expires_at (обычно 7 дней). Ориентируйтесь на ответ. Отправляйте исходные байты, точные Content-Type и Content-Length; не JSON и не multipart. upload_url уже содержит разрешение: API-ключ на адрес хранилища не передавайте. Не меняйте query-параметры подписанных ссылок. Пример size_bytes=123456 нужно заменить реальным размером файла.
curl --fail-with-body -X PUT "$UPLOAD_URL" \
-H "Content-Type: image/jpeg" --upload-file reference.jpg| type | content_type | Upload limit |
|---|---|---|
| image | image/jpeg, image/png, image/webp | 20 MiB |
| video | video/mp4, video/quicktime, video/webm | 500 MiB |
| audio | audio/mpeg, audio/wav, audio/mp4, audio/aac | 20 MiB |
Требования Seedance к входным файлам
Успешная загрузка ещё не означает, что формат подходит модели. Seedance/MiniMax принимают HTTPS URL без логина и пароля, доступные на всё время выполнения; не передавайте base64 в их JSON. Тело JSON этих моделей должно быть меньше 1 MiB. Для собственного хранилища используйте доступный извне HTTPS URL. Таблица ниже — более строгие требования именно Seedance.
| Input | Seedance 2.5 | Seedance 2.0 / Mini / Fast |
|---|---|---|
| Image | JPEG/PNG; ≤20 MiB; 300–6000 px/side; ratio 0.4–2.5 | JPEG/PNG; ≤20 MiB |
| Video | MP4/MOV; 2–30 s/file, ≤30 s total; ≤100 MiB/file; 24–60 fps; 300–6000 px/side; 409600–8295044 pixels; ratio 0.4–2.5 | MP4/MOV; 2–15 s/file, ≤15 s total; ≤50 MB/file; 200–2160 px/side |
| Audio | WAV/MP3; 2–30 s/file, ≤30 s total; ≤15 MB/file | WAV/MP3; 2–15 s/file, ≤15 s total; ≤15 MB/file |
Полный пример: локальное фото → Seedance → MP4
Установите Python 3.12+ и httpx (pip install httpx), сохраните код ниже как seedance_reference.py. Задайте API_BASE, API_KEY и REFERENCE_FILE — путь к JPEG/PNG. Seedance 2.5 и выбранный размер должны быть включены. При остановке запустите снова с тем же STATE_FILE: он сохраняет ключ, тело и ID запроса. Для новой платной генерации укажите другое имя STATE_FILE. Не запускайте два процесса с одним файлом состояния.
export REFERENCE_FILE="/path/to/reference.jpg"
export STATE_FILE="seedance-request.json"
python seedance_reference.pyseedance_reference.py
"""pip install httpx; set API_BASE, API_KEY, REFERENCE_FILE (JPEG or PNG).
Resume the same request by running again with the same STATE_FILE.
Use a different STATE_FILE only for an intentionally NEW paid generation.
State contains temporary media links: keep it private, never commit it.
"""
import json
import os
import time
import uuid
from pathlib import Path
import httpx
def save_state(path, state):
temporary = path.with_suffix(path.suffix + ".tmp")
fd = os.open(temporary, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600)
with os.fdopen(fd, "w") as stream:
json.dump(state, stream)
temporary.replace(path)
def run():
base = os.environ["API_BASE"].rstrip("/") # Origin only, without /v1.
if not base.startswith("https://"):
raise ValueError("API_BASE must use HTTPS")
headers = {"Authorization": "Bearer " + os.environ["API_KEY"]}
state_path = Path(os.environ.get("STATE_FILE", "seedance-request.json"))
output = Path(os.environ.get("OUTPUT_FILE", "result.mp4"))
# Do not enable automatic retries of paid POST requests.
with httpx.Client(timeout=120, follow_redirects=False) as client:
if state_path.exists():
state = json.loads(state_path.read_text())
if state["api_base"] != base:
raise ValueError("STATE_FILE belongs to a different API_BASE")
else:
source = Path(os.environ["REFERENCE_FILE"])
mime = {".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".png": "image/png"}[source.suffix.lower()]
ticket = client.post(
base + "/v1/media/uploads",
headers=headers,
json={
"model": "seedance-2.5",
"type": "image",
"content_type": mime,
"size_bytes": source.stat().st_size,
},
)
ticket.raise_for_status()
media = ticket.json()
# Signed storage URL: NEVER attach the partner API key here.
if not media["upload_url"].startswith("https://"):
raise ValueError("Upload URL must use HTTPS")
with source.open("rb") as stream:
upload = client.put(
media["upload_url"],
content=stream,
headers={"Content-Type": mime, "Content-Length": str(source.stat().st_size)},
)
upload.raise_for_status()
state = {
"api_base": base,
"idempotency_key": str(uuid.uuid4()),
"body": {
"model": "seedance-2.5",
"prompt": "Animate the image in @Image 1 with a gentle camera move.",
"reference_images": [{"url": media["media_url"]}],
"duration": 4,
"resolution": "480p",
"aspect_ratio": "9:16",
},
}
# Persist the SAME key and body BEFORE submitting the paid request.
save_state(state_path, state)
if "request_id" not in state:
submitted = client.post(
base + "/v1/videos/generations",
headers={**headers, "Idempotency-Key": state["idempotency_key"]},
json=state["body"],
)
submitted.raise_for_status()
state["request_id"] = submitted.json()["request_id"]
save_state(state_path, state)
print("request_id:", state["request_id"])
status_url = base + "/v1/videos/" + state["request_id"]
deadline = time.monotonic() + 1800
while time.monotonic() < deadline:
response = client.get(status_url, headers=headers)
response.raise_for_status()
result = response.json()
if result["status"] in ("failed", "expired"):
raise RuntimeError(result.get("error", result["status"]))
if result["status"] == "done":
# Construct our own URL; never send credentials to a returned external URL.
with client.stream("GET", status_url + "/content", headers=headers) as download:
download.raise_for_status()
temporary = output.with_suffix(output.suffix + ".part")
with temporary.open("wb") as stream:
for chunk in download.iter_bytes():
stream.write(chunk)
temporary.replace(output)
print("Saved:", output)
return
time.sleep(10)
raise TimeoutError("Still pending. Run again with the SAME STATE_FILE to resume.")
if __name__ == "__main__":
run()
Ошибки и повторные запросы
Проверяйте HTTP status до обработки результата. Ошибки имеют один из двух форматов ниже; detail также может быть массивом ошибок проверки запроса. Сохраняйте request_id или X-Request-Id для поддержки.
{
"detail": "invalid_request_contract"
}При 422 invalid_request_contract заголовок X-Validation-Error может содержать безопасный код причины: edit_requires_single_video, invalid_duration, invalid_generate_audio или unsupported_aspect_ratio. Тело ответа остаётся прежним; неизвестные внутренние ошибки не раскрываются. Отклонение на request_validation происходит до резервирования денег и отправки провайдеру.
{
"error": {
"type": "request_already_submitted",
"message": "request_already_submitted"
},
"request_id": "<our-request-id>"
}| HTTP | code | Что делать |
|---|---|---|
| 401 | api_key_required / invalid_api_key | Проверьте ключ и активность аккаунта. |
| 402 | insufficient_balance | Недостаточно доступного баланса для запроса. |
| 403 | partner_not_active | Обратитесь за активацией аккаунта. |
| 404 | model_not_available / generation_not_found / content_not_available | Проверьте Model ID, request_id и готовность файла. Чужие запросы недоступны. |
| 409 | idempotency_conflict | Этот ключ уже использован с другим телом или методом. |
| 409 | request_already_submitted | Синхронный запрос ещё выполняется либо был создан до поддержки восстановления ответа. |
| 409 | capability_mismatch / media_asset_not_ready | Режим/размер недоступен либо файл ещё не готов. |
| 410 | idempotent_result_expired | Срок хранения ответа истёк. Старый ключ не запускает новую платную генерацию. |
| 415 | multipart_not_supported_for_protocol | Multipart доступен только для images/edits. |
| 415 | media_upload_requires_json | Создайте upload ticket через application/json с описанием файла. Затем отправьте байты отдельным PUT по upload_url. |
| 422 | invalid_request_contract / invalid_idempotency_key / invalid_previous_response | Проверьте корректность JSON, параметры, сочетания полей или длину ключа. |
| 422 / 503 | upload_rejected / provider_rejected_request | Модель, файл или запрос не принят. Проверьте требования выбранной модели. |
| 422 | unknown_model_contract | Неизвестный Model ID. |
| 429 | provider_rate_limited | Достигнут лимит запросов; учитывайте Retry-After, если присутствует. |
| 503 | provider_temporarily_unavailable / upload_unavailable | Сервис временно недоступен. Сохраните ID и проверьте состояние запроса. |
| 503 | provider_response_invalid / unexpected_provider_stream / request_deadline_exceeded | Запрос завершён без результата и без оплаты. Для восстановления исходного ответа повторите тот же ключ; обратитесь в поддержку. |
Для видео повторите то же тело с тем же Idempotency-Key: вернётся исходный request_id. При наличии ID достаточно GET статуса. Для завершённых новых запросов текста/изображений тот же ключ возвращает исходный ответ; сохранённый статус изображения доступен по нашему ID или X-Client-Request-Id. Новый ключ означает новую операцию и может привести к повторной оплате. При timeout, обрыве сети или 5xx не меняйте ключ для автоматической повторной отправки. У клиентов с автоматическими повторами POST отключите их; при однозначно отклонённом запросе исправленный новый запрос отправляют с новым ключом. Фиксированная общая квота RPS здесь не гарантируется.
