Нейроныч для разработчиков

Ваши идеи.
Наш API.

Текст, изображения и видео — в вашем продукте. Всё для подключения: от первого запроса до результата.

ТекстИзображенияВидео

Нейроныч API · Контракт проверен 28.09.2026. Здесь описаны запросы генерации, их параметры и ответы. Ключ выдаётся после подключения партнёра. Для генерации нужны активный ключ, доступная модель и баланс.

Подключение

https://api.xn--e1aikcel5c5a.online
Authorization: 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/models200 application/json
GET /v1/balance200 application/json
POST /v1/responses200 application/json | text/event-stream
POST /v1/chat/completions200 application/json | text/event-stream
POST /v1/messages200 application/json | text/event-stream
POST /v1/images/generations200 application/json
POST /v1/images/edits200 application/json
POST /v1/videos/generations202 application/json
GET /v1/videos/{request_id}200 application/json
GET /v1/videos/{request_id}/content200 video/mp4 | 206 partial content
GET /api/v1/generations/{request_id}/trace200 application/json
POST /v1/media/uploads201 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"
    }
  ]
}
ModelModel IDEndpoint
GLM-5.3 Flashglm-5.3-flash/v1/chat/completions
GPT-5.6 Lunagpt-5.6-luna/v1/responses
GPT Image 2gpt-image-2/v1/images/generations
GPT Image 2.5 Sunburstgpt-image-2.5-sunburst/v1/images/generations
Grok 4.5grok-4.5/v1/responses
Grok Imagine Video 1.5grok-imagine-video-1.5/v1/videos/generations
Nano Banana 2nano-banana-2/v1/images/generations
Nano Banana 2 Litenano-banana-2-lite/v1/images/generations
Nano Banana 2.1nano-banana-2.1/v1/images/generations
Nano Banana Pronano-banana-pro/v1/images/generations
Qwen3.8-Maxqwen3.8-max/v1/chat/completions
seedance-2.0seedance-2.0/v1/videos/generations
Seedance 2.5seedance-2.5/v1/videos/generations
Seedream 5.0 Proseedream-5.0-pro/v1/images/generations
Wan 3wan-3/v1/videos/generations
Wan 3 Primewan-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())')"
ПолеТипОбязательность / значениеНазначение
modelstringДаТочный ID текстовой модели.
streambooleanНет; обычно falsetrue — SSE; false — один JSON-ответ.
max_output_tokens / max_completion_tokens / max_tokensinteger1–10,000,000Используйте поле своего протокола, описанное ниже. Это граница проверки API, а не лимит модели. Фактический максимум вывода и общий контекст могут быть меньше. Указывайте явный предел; reasoning-токены могут входить в него.
temperature / top_pnumberНет; зависит от моделиУправление вариативностью. Диапазоны и совместимость с reasoning зависят от модели; при первом запросе опустите оба поля.

Лимиты и возможности текстовых моделей

Проверено 28.09.2026. Здесь перечислены объявленные технические параметры, а не обещание доступности всех ID: работающая модель должна присутствовать в GET /v1/models. Контекст включает вход и вывод вместе; максимумы входа и вывода не всегда достижимы одновременно. Системные инструкции, история, инструменты и рассуждения также используют токены. Не объявлено означает, что подтверждённого значения нет; это не ноль, не отсутствие ограничения и не поддержка функции. API проверяет общий формат, а конкретная модель может отклонить превышение своего лимита.

Model IDКонтекст, токеныМакс. входМакс. выводВывод по умолчаниюVision
gpt-6-astra1 050 000922 000128 000Не объявленоДа
gpt-5.6-luna1 050 000922 000128 000Не объявленоДа
gpt-5.6-terra1 050 000922 000128 000Не объявленоДа
gpt-5.6-sol1 050 000922 000128 000Не объявленоДа
claude-opus-51 000 000Не объявлено128 000Не объявленоДа
claude-fable-5-11 000 000Не объявлено128 000Не объявленоДа
claude-fable-51 000 000Не объявлено128 000Не объявленоДа
grok-4.6500 000Не объявленоНе объявленоНе объявленоДа
claude-opus-4-81 000 000Не объявлено128 000Не объявленоДа
claude-sonnet-51 000 000Не объявлено128 000Не объявленоДа
deepseek-v4-flash-vision-expНе объявленоНе объявленоНе объявленоНе объявленоНе объявлено
deepseek-v4-pro-0813Не объявленоНе объявленоНе объявленоНе объявленоНе объявлено
glm-5.1200 000Не объявлено128 000Не объявленоНе объявлено
glm-5.21 000 000Не объявлено128 000Не объявленоНе объявлено
glm-5.31 000 000Не объявлено128 000Не объявленоНе объявлено
glm-5.3-flash1 000 000Не объявлено128 000Не объявленоДа
gpt-5.3-codex-sparkНе объявленоНе объявленоНе объявленоНе объявленоНе объявлено
gpt-5.41 050 000Не объявлено128 000Не объявленоДа
gpt-5.4-mini400 000272 000128 000Не объявленоДа
gpt-5.51 050 000Не объявлено128 000Не объявленоДа
grok-4.5500 000Не объявленоНе объявленоНе объявленоДа
kimi-k2.6262 144Не объявленоНе объявленоНе объявленоНе объявлено
kimi-k2.7-code262 144Не объявленоНе объявленоНе объявленоНе объявлено
kimi-k31 048 576Не объявлено1 048 576131 072Да
qwen3.8-max1 000 000983 616131 072Не объявленоДа

Следующая таблица отдельно показывает перечисленные уровни, дополнительные значения и объявленную настройку по умолчанию. Отсутствие default не означает medium. Для GPT с default=none не подменяйте отсутствие параметра произвольно выбранным уровнем. Способ передачи effort зависит от протокола и описан ниже. Отдельные правила GLM/Kimi приведены в разделе Reasoning / thinking.

Model IDУровни effortДополнительные значения → фактическиеEffort по умолчаниюThinking
gpt-6-astralow / medium / high / xhigh / maxНе объявленоНе объявленоНе объявлено
gpt-5.6-lunalow / medium / high / xhigh / maxНе объявленоmediumНе объявлено
gpt-5.6-terralow / medium / high / xhigh / maxНе объявленоmediumНе объявлено
gpt-5.6-sollow / medium / high / xhigh / maxНе объявленоmediumНе объявлено
claude-opus-5low / medium / high / xhigh / maxНе объявленоhighМожно переключать
claude-fable-5-1low / medium / high / xhigh / maxНе объявленоhighВсегда включено
claude-fable-5low / medium / high / xhigh / maxНе объявленоhighВсегда включено
grok-4.6low / medium / high / xhighmax → highhighВсегда включено
claude-opus-4-8low / medium / high / xhigh / maxНе объявленоhighВключается явно
claude-sonnet-5low / medium / high / xhigh / maxНе объявленоhighМожно переключать
deepseek-v4-flash-vision-expНе объявленоНе объявленоНе объявленоНе объявлено
deepseek-v4-pro-0813Не объявленоНе объявленоНе объявленоНе объявлено
glm-5.1Не объявленоНе объявленоНе объявленоНе объявлено
glm-5.2high / maxlow → high; medium → high; xhigh → maxmaxНе объявлено
glm-5.3low / high / maxmedium → high; xhigh → maxmaxВсегда включено
glm-5.3-flashhigh / maxlow → high; medium → high; xhigh → maxmaxВсегда включено
gpt-5.3-codex-sparkНе объявленоНе объявленоНе объявленоНе объявлено
gpt-5.4low / medium / high / xhighНе объявленоnoneНе объявлено
gpt-5.4-minilow / medium / high / xhighНе объявленоnoneНе объявлено
gpt-5.5low / medium / high / xhighНе объявленоmediumНе объявлено
grok-4.5low / medium / highmax → high; xhigh → highhighВсегда включено
kimi-k2.6Не объявленоНе объявленоНе объявленоНе объявлено
kimi-k2.7-codeНе объявленоНе объявленоНе объявленоВсегда включено
kimi-k3low / 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

ПолеТипОбязательность / значениеНазначение
inputstring | arrayДаТекст или сообщения {role, content}. content — строка либо список input_text/input_image блоков. role обычно user/assistant/system/developer.
instructionsstringНет; зависит от моделиИнструкции для текущего запроса.
max_output_tokensintegerНет; зависит от моделиВерхняя граница вывода.
previous_response_idstringНет; зависит от моделиid завершённого ответа этого API, полученного вашим аккаунтом. Не все модели поддерживают продолжение. При invalid_previous_response передайте историю явно новым запросом.
tools / tool_choicearray / string | objectНет; зависит от моделиФункции с type=function, name, parameters; выбор auto/none/required или конкретной функции.
parallel_tool_callsbooleanНет; зависит от моделиРазрешение нескольких вызовов функций в одном ответе.
reasoningobjectНет; зависит от моделиНапример {"effort":"low"}. Набор уровней зависит от модели.
text.formatobjectНет; зависит от моделиФормат текста; json_schema задаётся через name, schema и strict. См. пример ниже.
store / metadataboolean / 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

ПолеТипОбязательность / значениеНазначение
messagesarrayДаИстория {role, content}: system/developer/user/assistant/tool в порядке диалога. content — строка или блоки text/image_url; доступные роли зависят от модели.
max_completion_tokensintegerНет; зависит от моделиПредпочтительное поле предела вывода.
max_tokensintegerНет; зависит от моделиСовместимое поле для моделей, использующих прежний формат. Не задавайте одновременно с max_completion_tokens.
tools / tool_choicearray / string | objectНет; зависит от моделиtools[].type=function, описание внутри tools[].function; выбор auto/none/required либо конкретной функции.
parallel_tool_callsbooleanНет; зависит от моделиРазрешение нескольких функций в ответе.
response_formatobjectНет; зависит от моделиtype=json_object для JSON или type=json_schema с вложенным json_schema для схемы. Просите JSON также в тексте запроса.
reasoning_effort / thinkingstring / objectНет; зависит от моделиСм. таблицу моделей ниже; это разные настройки, а не взаимозаменяемые имена.
stream_optionsobjectНет; зависит от моделиПри stream=true API запрашивает include_usage=true; обработайте завершающий блок usage, даже если choices пуст.
stop / seed / presence_penalty / frequency_penaltystring | 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 используйте только для подтверждённой возможности выбранной модели.

ПолеТипОбязательность / значениеНазначение
messagesarrayДаСообщения user/assistant; content — строка или блоки text/image/tool_use/tool_result.
max_tokensintegerДаПредел вывода. Обязателен даже при stream=true.
systemstring | arrayНет; зависит от моделиОтдельная системная инструкция или текстовые блоки. Роль system в messages не используется.
tools / tool_choicearray / objectНет; зависит от моделиОпределения name, description, input_schema; выбор {type:auto}, {type:any}, {type:tool,name:...} или {type:none}, если поддерживается моделью.
thinkingobjectНет; зависит от моделиВключение/режим рассуждений. Форма type и budget_tokens зависит от поколения модели; budget_tokens не заменяет обязательный max_tokens.
output_configobjectНет; зависит от моделиУровень effort и формат вывода у поддерживающих моделей. Не переносите сюда объект response_format из Chat Completions.
stop_sequences / top_k / metadataarray / 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.1reasoning_effortnoneПо умолчанию включено; none отключает.
glm-5.2reasoning_effortnone / low / medium / high / xhigh / maxПо умолчанию max; low/medium/high → high, xhigh/max → max; none отключает.
glm-5.3reasoning_effortlow / high / maxПо умолчанию max; отключение не поддерживается.
glm-5.3-flashreasoning_efforthigh / maxПо умолчанию max; low/medium → high, xhigh → max; всегда включено.
kimi-k2.6reasoning_effortlow / medium / high / xhighБез поля выключено; перечисленные значения включают. max не поддерживается.
kimi-k2.7-code——Всегда включено; thinking/reasoning_effort не задают уровень.
kimi-k3reasoning_effortlow / 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 с файлами. Запрос синхронный: дождитесь ответа, не создавайте второй при задержке.

ПараметрТип / обязательностьПравила
modelstring · requiredModel ID семейства изображений из /v1/models.
promptstring · requiredНепустое описание результата/изменений.
ninteger · optional, 1GPT Image: 1–7; Nano Banana: 1–4; Grok Image: 1–10; Seedream 5.0 Pro: 1.
imagesarray<object> · editsJSON: [{"image_url":"https://…"}] или image_url с data:image/…;base64,…; GPT до 16, Nano Banana Pro до 14, Seedream 5.0 Pro до 8, остальные до 3.
maskobject | file · optionalGPT edits: {"image_url":"https://…/mask.png"} или файл PNG с альфа-каналом; прозрачная область меняется. Размер совпадает с первым изображением; не более одной маски.
sizestring · optional, autoGPT: auto или WIDTHxHEIGHT, например 1024x1024. Обе стороны положительные. Итоговые пиксели могут отличаться от запроса; проверяйте результат.
qualitystring · optional, autoGPT Image: auto | low | medium | high.
resolutionstring · optionalNano Banana 2/Pro: 1k (по умолчанию), 2k или 4k. Grok: 1k или 2k; доступность зависит от модели/режима. Nano Banana 2 Lite поддерживает только 1k. GPT, включая Sunburst: размер задаётся через size, например 3840x2160 для 4K.
aspect_ratiostring · optionalNano: 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_formatstring · optionalb64_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 — целые секунды.

ПараметрТип / обязательностьПравила
modelstring · requiredТочный ID доступной видеомодели.
promptstringОбязателен без входных медиа; всегда обязателен для edit, Kling, Wan и MiniMax. Seedance: до 40 000 байт UTF-8; Wan: до 4500 символов. Ссылки на референсы: @Image 1, @Video 1, @Audio 1.
durationintegerЗадавайте явно в диапазоне своей модели, см. таблицу. Для Seedance/Kling/MiniMax/Wan при пропуске — 5; у Grok задавайте обязательно для предсказуемой длины. Для Seedance 2.5 edit — -1 или пропустить.
resolutionstring · optionalПо умолчанию 720p, у MiniMax 768p. Допустимые значения в таблице ниже, регистр значим.
aspect_ratiostring · optionalЗадавайте явно для текстового и референсного режима. Базовые: 1:1, 16:9, 9:16, 4:3, 3:4. Seedance/MiniMax также 21:9; Grok также 3:2, 2:3. Правила adaptive ниже.
ninteger · optional, 1Только 1.
reference_images / reference_videos / reference_audiosarray<object> · optional[{"url":"https://…"}]. Порядок определяет нумерацию референсов. Лимиты каждого типа и суммы ниже. Не передавайте duration референса: длина определяется по файлу.
start_image / end_imageobject · optionalSeedance/MiniMax/Wan: {"url":"https://…"}. end_image требует start_image. Кадры нельзя смешивать с reference_*.
imageobject · optionalGrok: первый кадр {"url":"https://…"}; не совмещайте с reference_images.
omni_reference_task_typestring · optional, autoSeedance 2.5: auto, reference, edit или extend; для edit/extend см. отдельные примеры.
draft / draft_taskboolean / object · Seedance 2.5draft=true создаёт 480p-превью. Для полного 1080p результата отправьте только model и draft_task:{"id":"11111111-1111-4111-8111-111111111111"} в течение 7 дней.
generate_audioboolean · optionalSeedance 2.5 и Kling 4.0: true создаёт звук, false — видео без звука; только boolean, не строка. Wan также поддерживает переключатель. Контракты остальных моделей не меняются.
seed / watermarkmodel-dependentSeedance/Kling/MiniMax: seed запрещён; watermark=true запрещён. Отсутствие ошибки формата для других моделей не подтверждает поддержку такой настройки.
Model IDСекундыresolutionФото / видео / аудио / всего
seedance-2.54–30480p, 720p, 1080p30 / 10 / 10 / 50
seedance-2.04–15480p, 720p, 1080p, 4k9 / 3 / 3 / 12
grok-imagine-video-1.51–15480p, 720p, 1080p7 / 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.json

Seedance 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 используйте его основные поля.

ПолеЭквивалент
secondsduration
ratioaspect_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
}
FieldTypeRequired
modelstring · Model IDyes
typeimage | video | audioyes
content_typestring · MIMEyes
size_bytesinteger · actual file bytes > 0yes
{
  "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
typecontent_typeUpload limit
imageimage/jpeg, image/png, image/webp20 MiB
videovideo/mp4, video/quicktime, video/webm500 MiB
audioaudio/mpeg, audio/wav, audio/mp4, audio/aac20 MiB

Требования Seedance к входным файлам

Успешная загрузка ещё не означает, что формат подходит модели. Seedance/MiniMax принимают HTTPS URL без логина и пароля, доступные на всё время выполнения; не передавайте base64 в их JSON. Тело JSON этих моделей должно быть меньше 1 MiB. Для собственного хранилища используйте доступный извне HTTPS URL. Таблица ниже — более строгие требования именно Seedance.

InputSeedance 2.5Seedance 2.0 / Mini / Fast
ImageJPEG/PNG; ≤20 MiB; 300–6000 px/side; ratio 0.4–2.5JPEG/PNG; ≤20 MiB
VideoMP4/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.5MP4/MOV; 2–15 s/file, ≤15 s total; ≤50 MB/file; 200–2160 px/side
AudioWAV/MP3; 2–30 s/file, ≤30 s total; ≤15 MB/fileWAV/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.py
seedance_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>"
}
HTTPcodeЧто делать
401api_key_required / invalid_api_keyПроверьте ключ и активность аккаунта.
402insufficient_balanceНедостаточно доступного баланса для запроса.
403partner_not_activeОбратитесь за активацией аккаунта.
404model_not_available / generation_not_found / content_not_availableПроверьте Model ID, request_id и готовность файла. Чужие запросы недоступны.
409idempotency_conflictЭтот ключ уже использован с другим телом или методом.
409request_already_submittedСинхронный запрос ещё выполняется либо был создан до поддержки восстановления ответа.
409capability_mismatch / media_asset_not_readyРежим/размер недоступен либо файл ещё не готов.
410idempotent_result_expiredСрок хранения ответа истёк. Старый ключ не запускает новую платную генерацию.
415multipart_not_supported_for_protocolMultipart доступен только для images/edits.
415media_upload_requires_jsonСоздайте upload ticket через application/json с описанием файла. Затем отправьте байты отдельным PUT по upload_url.
422invalid_request_contract / invalid_idempotency_key / invalid_previous_responseПроверьте корректность JSON, параметры, сочетания полей или длину ключа.
422 / 503upload_rejected / provider_rejected_requestМодель, файл или запрос не принят. Проверьте требования выбранной модели.
422unknown_model_contractНеизвестный Model ID.
429provider_rate_limitedДостигнут лимит запросов; учитывайте Retry-After, если присутствует.
503provider_temporarily_unavailable / upload_unavailableСервис временно недоступен. Сохраните ID и проверьте состояние запроса.
503provider_response_invalid / unexpected_provider_stream / request_deadline_exceededЗапрос завершён без результата и без оплаты. Для восстановления исходного ответа повторите тот же ключ; обратитесь в поддержку.

Для видео повторите то же тело с тем же Idempotency-Key: вернётся исходный request_id. При наличии ID достаточно GET статуса. Для завершённых новых запросов текста/изображений тот же ключ возвращает исходный ответ; сохранённый статус изображения доступен по нашему ID или X-Client-Request-Id. Новый ключ означает новую операцию и может привести к повторной оплате. При timeout, обрыве сети или 5xx не меняйте ключ для автоматической повторной отправки. У клиентов с автоматическими повторами POST отключите их; при однозначно отклонённом запросе исправленный новый запрос отправляют с новым ключом. Фиксированная общая квота RPS здесь не гарантируется.