HappyHorse 1.1 API

Принимает текстовое описание и возвращает готовый ролик. Разрешение 720p, 1080p, 9 соотношений сторон, от 16:9 до 21:9, описание до 5 000 символов. Модель Alibaba, выпущена 22 июня 2026 года.

Принимает изображение и оживляет его, возвращая ролик. Разрешение 720p, 1080p, на вход одно изображение, описание до 5 000 символов. Модель Alibaba, выпущена 22 июня 2026 года.

Принимает изображения-образцы и переносит показанное на них в новый ролик. Разрешение 720p, 1080p, 9 соотношений сторон, от 16:9 до 21:9, описание до 5 000 символов. Модель Alibaba, выпущена 22 июня 2026 года.

HappyHorse 1.1 API работает в России без VPN: один API ключ GEN202, оплата рублями с российской карты.

Цена: за секунду, 720p — 35.4 кр. (17,7 ₽ · $0.1609), 1080p — 45.6 кр. (22,8 ₽ · $0.2073).

Цена: за секунду, 720p — 35.4 кр. (17,7 ₽ · $0.1609), 1080p — 45.6 кр. (22,8 ₽ · $0.2073).

Цена: за секунду, 720p — 35.4 кр. (17,7 ₽ · $0.1609), 1080p — 45.6 кр. (22,8 ₽ · $0.2073).

кр. — кредиты, покупаются за рубли.

Model

Статус

работает

Статус

работает

Статус

работает

Песочница

Input

Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.

{
  "model": "happyhorse/1-1-text-to-video",
  "input": {
    "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
    "aspect_ratio": "1:1",
    "resolution": "720p",
    "duration": 3
  }
}
Output
{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "cm8r4t0vk0001s60p2xq7f9ab",
    "model": "happyhorse/1-1-text-to-video",
    "state": "success",
    "resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
    "failCode": "",
    "failMsg": "",
    "creditsConsumed": 106.2
  }
}
Input

Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.

{
  "model": "happyhorse/1-1-image-to-video",
  "input": {
    "image_urls": [
      "https://gen202.com/assets/sample-nano-banana-pro.jpg"
    ],
    "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
    "resolution": "720p",
    "duration": 3
  }
}
Output
{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "cm8r4t0vk0001s60p2xq7f9ab",
    "model": "happyhorse/1-1-image-to-video",
    "state": "success",
    "resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
    "failCode": "",
    "failMsg": "",
    "creditsConsumed": 106.2
  }
}
Input

Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.

{
  "model": "happyhorse/1-1-reference-to-video",
  "input": {
    "prompt": "The ginger cat from [Image 1], in a white spacesuit, floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
    "reference_image": [
      "https://gen202.com/assets/sample-nano-banana-pro.jpg"
    ],
    "aspect_ratio": "1:1",
    "resolution": "720p",
    "duration": 3
  }
}
Output
{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "cm8r4t0vk0001s60p2xq7f9ab",
    "model": "happyhorse/1-1-reference-to-video",
    "state": "success",
    "resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
    "failCode": "",
    "failMsg": "",
    "creditsConsumed": 106.2
  }
}

Цена HappyHorse 1.1

Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.

Вариант Наша цена
720p 35.4 кр. $0.160917,7 ₽
1080p 45.6 кр. $0.207322,8 ₽

кр. — кредиты, покупаются за рубли.

Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.

Вариант Наша цена
720p 35.4 кр. $0.160917,7 ₽
1080p 45.6 кр. $0.207322,8 ₽

кр. — кредиты, покупаются за рубли.

Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.

Вариант Наша цена
720p 35.4 кр. $0.160917,7 ₽
1080p 45.6 кр. $0.207322,8 ₽

кр. — кредиты, покупаются за рубли.

Вызов через API

POST https://api.gen202.com/api/v1/jobs/createTask
GET https://api.gen202.com/api/v1/jobs/recordInfo?taskId=…

Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком Authorization: Bearer sk-… и выпускается в кабинете. На один ключ шлюз пропускает 30 постановок задачи и 300 запросов состояния в минуту.

Поля запроса

Значения проверяются до обращения к поставщику: поле не из списка модели или значение вне перечисления возвращают 422 и кредитов не тратят.

ПолеТипОбяз.Допустимые значения
model текст обязательное happyhorse/1-1-text-to-video
input объект обязательное Параметры генерации — поля из таблицы ниже

Поля input

ПолеТипОбяз.Допустимые значения
prompt текст обязательное от 1 до 5 000 символов
aspect_ratio значение из списка опц. 16:9 · 9:16 · 1:1 · 4:3 · 3:4 · 4:5 · 5:4 · 9:21 · 21:9 · без него шлюз подставит 16:9
resolution значение из списка опц. 720p · 1080p · без него шлюз подставит 1080p
duration целое число опц. целое от 3 до 15 · без него шлюз подставит 5

Ответ

Оба запроса отвечают одним конвертом: {"code":…,"msg":…,"data":…}, где code повторяет HTTP-статус, а полезное лежит в data. Тот же конверт приходит и при отказе — разбирать две формы ответа не нужно.

/api/v1/jobs/createTask

ПолеТипЧто в нём
data.taskId строка Номер задачи. Больше в ответе ничего нет и быть не может — работа только началась.

/api/v1/jobs/recordInfo

ПолеТипЧто в нём
data.taskId строка Номер задачи — тот же, что вернул createTask.
data.model строка Имя модели в том виде, в каком его прислал клиент.
data.state строка Состояние задачи: waiting, queuing, generating, success или fail.
data.param строка Параметры, с которыми задача создана, — строкой JSON внутри JSON.
data.resultJson строка Результат строкой JSON внутри JSON: {"resultUrls":["https://…"]} — разбирается вторым разбором. До завершения задачи — пустая строка.
data.failCode строка Код неудачи из таблицы ниже. У остальных задач — пустая строка.
data.failMsg строка Причина неудачи словами модели. Иначе пустая строка.
data.failComment строка Наш комментарий к словам модели, по-русски: что произошло. Есть не у всякой неудачи; иначе пустая строка.
data.costTime число Сколько задача заняла, миллисекунды. Пока не завершилась — null.
data.completeTime число Когда завершилась, миллисекунды эпохи Unix. Пока не завершилась — null.
data.createTime число Когда создана, миллисекунды эпохи Unix.
data.updateTime число Когда состояние менялось в последний раз, миллисекунды эпохи Unix.
data.creditsConsumed число Сколько кредитов списано. Ноль, пока задача не завершилась, и ноль у неудачной.

Состояния задачи

Состояние лежит в поле state ответа /api/v1/jobs/recordInfo. Первые три означают, что работа идёт: запрос надо повторить примерно через 3 секунды — чаще спрашивать нечего, столько же ждёт между опросами сам шлюз. Два последних состояния окончательные: после них задача не меняется.

stateЧто происходит
waiting Задача принята и стоит в очереди шлюза; поставщику она ещё не отправлена.
queuing Поставщик задачу принял и поставил в свою очередь.
generating Генерация идёт.
success Готово: ссылки на результат лежат в resultJson, в creditsConsumed — сколько списано.
fail Задача не удалась: причина в failCode и failMsg, удержанные кредиты возвращены целиком.

Задача идёт, пока модель не пришлёт результат или отказ. Причина неудачи приходит двумя полями: failCode из таблицы ниже и failMsg словами.

failCodeЧто произошло
501 Поставщик вернул отказ: генерация не удалась.
408 Модель не приняла задачу за 60 минут или не отвечала сутки.
404 Поставщик не знает такой задачи.
429 Поставщик отбил создание задачи по своему лимиту.
500 Поломка на нашей стороне; подробности остаются в журнале шлюза.

Слова модели в failMsg бывают непонятны, поэтому к части неудач шлюз добавляет поле failComment — наш комментарий по-русски о том, что произошло. У остальных неудач это поле пустое.

failMsg, примерfailComment
Image fetch failed. Модель не смогла скачать файл из нашего хранилища. Вероятно, это разовый сбой, повторите запрос. Если ошибка повторится — напишите в поддержку: hi@gen202.com
File type not supported По ссылке открывается страница сайта, а не файл. Загрузите сам файл или дайте прямую ссылку на него.
image #2: width and height must be between 300px and 6000px (got 262x377) (invalid_asset_material) Одна из картинок слишком маленькая. Seedance принимает картинки от 300 до 6000 пикселей по каждой стороне.
Seedance identified your task as video editing based on your prompt. Seedance понял запрос как редактирование присланного видео. В песочнице и чате выберите режим «Редактирование видео», в API поставьте пропорции adaptive и длительность −1.
Seedance identified your task as video extension based on your prompt. Seedance решил, что присланное видео нужно продлить. Для этого поставьте пропорции adaptive, а если продлевать не нужно — уберите эту просьбу из промта.
generate task timeout. Модель не успела создать результат и сама остановила задачу.
Internal Error Модель остановилась и не назвала причину. Возможно, она перегружена или временно недоступна. Или запрос отклонён из-за чувствительной темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды.
The request failed because the input image may contain sensitive information. Модель отклонила загруженную картинку из-за чувствительной темы. Такие темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды.
The generated content was filtered by the safety system. Модель отклонила запрос из-за чувствительной темы. Такие темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды.
The model provider rejected or dropped the task creation request. Модель остановилась и не назвала причину. Возможно, она перегружена или временно недоступна. Или запрос отклонён из-за чувствительной темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды.
No result from the provider within the task deadline. Модель либо не приняла задачу за 15 минут (у видео — за 60), либо не ответила за сутки.

Ссылка на готовый файл живёт 14 дней — столько его хранит поставщик. Файл, который нужен дольше, скачивайте к себе сразу после того, как задача пришла в состояние success.

Отказы

Тело отказа одно на все случаи: {"code":…,"msg":…,"data":null}. Задача, не дошедшая до результата, не тарифицируется — удержанные кредиты возвращаются целиком.

КодАдресКогда
400 /api/v1/jobs/createTask Тело запроса — не разбираемый JSON.
401 /api/v1/jobs/createTask Ключа нет в заголовке Authorization, либо он неверный или отключён.
402 /api/v1/jobs/createTask Свободных кредитов меньше, чем удерживается под задачу.
403 /api/v1/jobs/createTask Аккаунт заблокирован: вызовы модели, пополнение и загрузка файлов ему закрыты. Ключи при этом не отключены — запрет лежит на аккаунте.
413 /api/v1/jobs/createTask Тело запроса больше 512 КиБ.
415 /api/v1/jobs/createTask Тело отправлено не как application/json или заголовок Content-Type не передан.
422 /api/v1/jobs/createTask Поле model пустое или его имени нет в каталоге, input — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается. Тот же код — если во входе наша ссылка на готовый результат старше 14 дней: файла уже нет, его нужно загрузить заново. И если модель не может выполнить именно это сочетание полей: в сообщении сказано, что поменять, — например, другие файлы-образцы.
429 /api/v1/jobs/createTask Больше 30 запросов в минуту на один ключ, больше 50 незавершённых задач на аккаунте либо таймаут: за час 5 запросов к моделям этого вида отклонены из-за чувствительной темы, и запуск всех моделей этого вида приостановлен. У такого отказа в теле есть поле timeout с временем окончания паузы, а в заголовке Retry-After — секунды до него.
500 /api/v1/jobs/createTask Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.
401 /api/v1/jobs/recordInfo Ключа нет в заголовке Authorization, либо он неверный или отключён.
404 /api/v1/jobs/recordInfo Задачи с таким номером нет или она создана другим аккаунтом.
422 /api/v1/jobs/recordInfo Параметр taskId не передан.
429 /api/v1/jobs/recordInfo Больше 300 запросов в минуту на один ключ.
500 /api/v1/jobs/recordInfo Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.

Пример вызова

task.sh
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
  -H "Authorization: Bearer sk-ваш-ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "happyhorse/1-1-text-to-video",
    "input": {
      "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
      "aspect_ratio": "1:1",
      "resolution": "720p",
      "duration": 3
    }
  }' | jq -r '.data.taskId')

# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
#    generating означают «работа идёт», success и fail — окончательные
while true; do
  RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
    -H "Authorization: Bearer sk-ваш-ключ")
  STATE=$(echo "$RECORD" | jq -r '.data.state')
  case "$STATE" in success|fail) break;; esac
  sleep 3
done

# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
#    внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
  if .state == "fail"
  then "отказ \(.failCode): \(.failMsg)"
  else .resultJson | fromjson | .resultUrls[0]
  end'
task.py
import json
import time

import requests

headers = {"Authorization": "Bearer sk-ваш-ключ"}

# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
    "https://api.gen202.com/api/v1/jobs/createTask",
    headers=headers,
    json={
      "model": "happyhorse/1-1-text-to-video",
      "input": {
        "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
        "aspect_ratio": "1:1",
        "resolution": "720p",
        "duration": 3
      }
    },
).json()
task_id = created["data"]["taskId"]

# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
#    generating означают «работа идёт», success и fail — окончательные
while True:
    task = requests.get(
        "https://api.gen202.com/api/v1/jobs/recordInfo",
        headers=headers,
        params={"taskId": task_id},
    ).json()["data"]
    if task["state"] in ("success", "fail"):
        break
    time.sleep(3)

# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
    raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])

# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])

Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в 3 секунды, пока задача не закончится, и разбирает ответ до ссылки на файл. Разборов два, потому что поле resultJson — строка JSON внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её перечислений, поэтому он проходит проверку шлюза как есть. Подставить остаётся только свой ключ. Пример на оболочке разбирает ответ через jq; на Python своего ничего не нужно, кроме requests.

POST https://api.gen202.com/api/v1/jobs/createTask
GET https://api.gen202.com/api/v1/jobs/recordInfo?taskId=…

Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком Authorization: Bearer sk-… и выпускается в кабинете. На один ключ шлюз пропускает 30 постановок задачи и 300 запросов состояния в минуту.

Поля запроса

Значения проверяются до обращения к поставщику: поле не из списка модели или значение вне перечисления возвращают 422 и кредитов не тратят.

ПолеТипОбяз.Допустимые значения
model текст обязательное happyhorse/1-1-image-to-video
input объект обязательное Параметры генерации — поля из таблицы ниже

Поля input

ПолеТипОбяз.Допустимые значения
image_urls список ссылок обязательное одна ссылка на изображение
prompt текст опц. не длиннее 5 000 символов
resolution значение из списка опц. 720p · 1080p · без него шлюз подставит 1080p
duration целое число опц. целое от 3 до 15 · без него шлюз подставит 5

Ссылка на изображение принимается только полным адресом на http или https: не длиннее 2048 символов, на общедоступном сайте, без имени и пароля перед адресом и без порта, кроме 80 и 443. Относительный путь, а также адреса внутри сети — localhost, 127.0.0.1, 10.0.0.5, 192.168.1.2 — и имена без точки шлюз отклоняет ответом 422, к поставщику не обращаясь.

Ответ

Оба запроса отвечают одним конвертом: {"code":…,"msg":…,"data":…}, где code повторяет HTTP-статус, а полезное лежит в data. Тот же конверт приходит и при отказе — разбирать две формы ответа не нужно.

/api/v1/jobs/createTask

ПолеТипЧто в нём
data.taskId строка Номер задачи. Больше в ответе ничего нет и быть не может — работа только началась.

/api/v1/jobs/recordInfo

ПолеТипЧто в нём
data.taskId строка Номер задачи — тот же, что вернул createTask.
data.model строка Имя модели в том виде, в каком его прислал клиент.
data.state строка Состояние задачи: waiting, queuing, generating, success или fail.
data.param строка Параметры, с которыми задача создана, — строкой JSON внутри JSON.
data.resultJson строка Результат строкой JSON внутри JSON: {"resultUrls":["https://…"]} — разбирается вторым разбором. До завершения задачи — пустая строка.
data.failCode строка Код неудачи из таблицы ниже. У остальных задач — пустая строка.
data.failMsg строка Причина неудачи словами модели. Иначе пустая строка.
data.failComment строка Наш комментарий к словам модели, по-русски: что произошло. Есть не у всякой неудачи; иначе пустая строка.
data.costTime число Сколько задача заняла, миллисекунды. Пока не завершилась — null.
data.completeTime число Когда завершилась, миллисекунды эпохи Unix. Пока не завершилась — null.
data.createTime число Когда создана, миллисекунды эпохи Unix.
data.updateTime число Когда состояние менялось в последний раз, миллисекунды эпохи Unix.
data.creditsConsumed число Сколько кредитов списано. Ноль, пока задача не завершилась, и ноль у неудачной.

Состояния задачи

Состояние лежит в поле state ответа /api/v1/jobs/recordInfo. Первые три означают, что работа идёт: запрос надо повторить примерно через 3 секунды — чаще спрашивать нечего, столько же ждёт между опросами сам шлюз. Два последних состояния окончательные: после них задача не меняется.

stateЧто происходит
waiting Задача принята и стоит в очереди шлюза; поставщику она ещё не отправлена.
queuing Поставщик задачу принял и поставил в свою очередь.
generating Генерация идёт.
success Готово: ссылки на результат лежат в resultJson, в creditsConsumed — сколько списано.
fail Задача не удалась: причина в failCode и failMsg, удержанные кредиты возвращены целиком.

Задача идёт, пока модель не пришлёт результат или отказ. Причина неудачи приходит двумя полями: failCode из таблицы ниже и failMsg словами.

failCodeЧто произошло
501 Поставщик вернул отказ: генерация не удалась.
408 Модель не приняла задачу за 60 минут или не отвечала сутки.
404 Поставщик не знает такой задачи.
429 Поставщик отбил создание задачи по своему лимиту.
500 Поломка на нашей стороне; подробности остаются в журнале шлюза.

Слова модели в failMsg бывают непонятны, поэтому к части неудач шлюз добавляет поле failComment — наш комментарий по-русски о том, что произошло. У остальных неудач это поле пустое.

failMsg, примерfailComment
Image fetch failed. Модель не смогла скачать файл из нашего хранилища. Вероятно, это разовый сбой, повторите запрос. Если ошибка повторится — напишите в поддержку: hi@gen202.com
File type not supported По ссылке открывается страница сайта, а не файл. Загрузите сам файл или дайте прямую ссылку на него.
image #2: width and height must be between 300px and 6000px (got 262x377) (invalid_asset_material) Одна из картинок слишком маленькая. Seedance принимает картинки от 300 до 6000 пикселей по каждой стороне.
Seedance identified your task as video editing based on your prompt. Seedance понял запрос как редактирование присланного видео. В песочнице и чате выберите режим «Редактирование видео», в API поставьте пропорции adaptive и длительность −1.
Seedance identified your task as video extension based on your prompt. Seedance решил, что присланное видео нужно продлить. Для этого поставьте пропорции adaptive, а если продлевать не нужно — уберите эту просьбу из промта.
generate task timeout. Модель не успела создать результат и сама остановила задачу.
Internal Error Модель остановилась и не назвала причину. Возможно, она перегружена или временно недоступна. Или запрос отклонён из-за чувствительной темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды.
The request failed because the input image may contain sensitive information. Модель отклонила загруженную картинку из-за чувствительной темы. Такие темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды.
The generated content was filtered by the safety system. Модель отклонила запрос из-за чувствительной темы. Такие темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды.
The model provider rejected or dropped the task creation request. Модель остановилась и не назвала причину. Возможно, она перегружена или временно недоступна. Или запрос отклонён из-за чувствительной темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды.
No result from the provider within the task deadline. Модель либо не приняла задачу за 15 минут (у видео — за 60), либо не ответила за сутки.

Ссылка на готовый файл живёт 14 дней — столько его хранит поставщик. Файл, который нужен дольше, скачивайте к себе сразу после того, как задача пришла в состояние success.

Отказы

Тело отказа одно на все случаи: {"code":…,"msg":…,"data":null}. Задача, не дошедшая до результата, не тарифицируется — удержанные кредиты возвращаются целиком.

КодАдресКогда
400 /api/v1/jobs/createTask Тело запроса — не разбираемый JSON.
401 /api/v1/jobs/createTask Ключа нет в заголовке Authorization, либо он неверный или отключён.
402 /api/v1/jobs/createTask Свободных кредитов меньше, чем удерживается под задачу.
403 /api/v1/jobs/createTask Аккаунт заблокирован: вызовы модели, пополнение и загрузка файлов ему закрыты. Ключи при этом не отключены — запрет лежит на аккаунте.
413 /api/v1/jobs/createTask Тело запроса больше 512 КиБ.
415 /api/v1/jobs/createTask Тело отправлено не как application/json или заголовок Content-Type не передан.
422 /api/v1/jobs/createTask Поле model пустое или его имени нет в каталоге, input — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается. Тот же код — если во входе наша ссылка на готовый результат старше 14 дней: файла уже нет, его нужно загрузить заново. И если модель не может выполнить именно это сочетание полей: в сообщении сказано, что поменять, — например, другие файлы-образцы.
429 /api/v1/jobs/createTask Больше 30 запросов в минуту на один ключ, больше 50 незавершённых задач на аккаунте либо таймаут: за час 5 запросов к моделям этого вида отклонены из-за чувствительной темы, и запуск всех моделей этого вида приостановлен. У такого отказа в теле есть поле timeout с временем окончания паузы, а в заголовке Retry-After — секунды до него.
500 /api/v1/jobs/createTask Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.
401 /api/v1/jobs/recordInfo Ключа нет в заголовке Authorization, либо он неверный или отключён.
404 /api/v1/jobs/recordInfo Задачи с таким номером нет или она создана другим аккаунтом.
422 /api/v1/jobs/recordInfo Параметр taskId не передан.
429 /api/v1/jobs/recordInfo Больше 300 запросов в минуту на один ключ.
500 /api/v1/jobs/recordInfo Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.

Пример вызова

task.sh
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
  -H "Authorization: Bearer sk-ваш-ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "happyhorse/1-1-image-to-video",
    "input": {
      "image_urls": [
        "https://gen202.com/assets/sample-nano-banana-pro.jpg"
      ],
      "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
      "resolution": "720p",
      "duration": 3
    }
  }' | jq -r '.data.taskId')

# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
#    generating означают «работа идёт», success и fail — окончательные
while true; do
  RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
    -H "Authorization: Bearer sk-ваш-ключ")
  STATE=$(echo "$RECORD" | jq -r '.data.state')
  case "$STATE" in success|fail) break;; esac
  sleep 3
done

# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
#    внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
  if .state == "fail"
  then "отказ \(.failCode): \(.failMsg)"
  else .resultJson | fromjson | .resultUrls[0]
  end'
task.py
import json
import time

import requests

headers = {"Authorization": "Bearer sk-ваш-ключ"}

# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
    "https://api.gen202.com/api/v1/jobs/createTask",
    headers=headers,
    json={
      "model": "happyhorse/1-1-image-to-video",
      "input": {
        "image_urls": [
          "https://gen202.com/assets/sample-nano-banana-pro.jpg"
        ],
        "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
        "resolution": "720p",
        "duration": 3
      }
    },
).json()
task_id = created["data"]["taskId"]

# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
#    generating означают «работа идёт», success и fail — окончательные
while True:
    task = requests.get(
        "https://api.gen202.com/api/v1/jobs/recordInfo",
        headers=headers,
        params={"taskId": task_id},
    ).json()["data"]
    if task["state"] in ("success", "fail"):
        break
    time.sleep(3)

# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
    raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])

# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])

Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в 3 секунды, пока задача не закончится, и разбирает ответ до ссылки на файл. Разборов два, потому что поле resultJson — строка JSON внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её перечислений, поэтому он проходит проверку шлюза как есть. Заменить в нём нужно два значения: свой ключ и ссылку на изображение — в примере стоит образец с нашего сайта. Пример на оболочке разбирает ответ через jq; на Python своего ничего не нужно, кроме requests.

POST https://api.gen202.com/api/v1/jobs/createTask
GET https://api.gen202.com/api/v1/jobs/recordInfo?taskId=…

Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком Authorization: Bearer sk-… и выпускается в кабинете. На один ключ шлюз пропускает 30 постановок задачи и 300 запросов состояния в минуту.

Поля запроса

Значения проверяются до обращения к поставщику: поле не из списка модели или значение вне перечисления возвращают 422 и кредитов не тратят.

ПолеТипОбяз.Допустимые значения
model текст обязательное happyhorse/1-1-reference-to-video
input объект обязательное Параметры генерации — поля из таблицы ниже

Поля input

ПолеТипОбяз.Допустимые значения
prompt текст обязательное от 1 до 5 000 символов
reference_image список ссылок обязательное от 1 до 9 ссылок на изображение
aspect_ratio значение из списка опц. 16:9 · 9:16 · 1:1 · 4:3 · 3:4 · 4:5 · 5:4 · 9:21 · 21:9 · без него шлюз подставит 16:9
resolution значение из списка опц. 720p · 1080p · без него шлюз подставит 1080p
duration целое число опц. целое от 3 до 15 · без него шлюз подставит 5

Ссылка на изображение принимается только полным адресом на http или https: не длиннее 2048 символов, на общедоступном сайте, без имени и пароля перед адресом и без порта, кроме 80 и 443. Относительный путь, а также адреса внутри сети — localhost, 127.0.0.1, 10.0.0.5, 192.168.1.2 — и имена без точки шлюз отклоняет ответом 422, к поставщику не обращаясь.

Ответ

Оба запроса отвечают одним конвертом: {"code":…,"msg":…,"data":…}, где code повторяет HTTP-статус, а полезное лежит в data. Тот же конверт приходит и при отказе — разбирать две формы ответа не нужно.

/api/v1/jobs/createTask

ПолеТипЧто в нём
data.taskId строка Номер задачи. Больше в ответе ничего нет и быть не может — работа только началась.

/api/v1/jobs/recordInfo

ПолеТипЧто в нём
data.taskId строка Номер задачи — тот же, что вернул createTask.
data.model строка Имя модели в том виде, в каком его прислал клиент.
data.state строка Состояние задачи: waiting, queuing, generating, success или fail.
data.param строка Параметры, с которыми задача создана, — строкой JSON внутри JSON.
data.resultJson строка Результат строкой JSON внутри JSON: {"resultUrls":["https://…"]} — разбирается вторым разбором. До завершения задачи — пустая строка.
data.failCode строка Код неудачи из таблицы ниже. У остальных задач — пустая строка.
data.failMsg строка Причина неудачи словами модели. Иначе пустая строка.
data.failComment строка Наш комментарий к словам модели, по-русски: что произошло. Есть не у всякой неудачи; иначе пустая строка.
data.costTime число Сколько задача заняла, миллисекунды. Пока не завершилась — null.
data.completeTime число Когда завершилась, миллисекунды эпохи Unix. Пока не завершилась — null.
data.createTime число Когда создана, миллисекунды эпохи Unix.
data.updateTime число Когда состояние менялось в последний раз, миллисекунды эпохи Unix.
data.creditsConsumed число Сколько кредитов списано. Ноль, пока задача не завершилась, и ноль у неудачной.

Состояния задачи

Состояние лежит в поле state ответа /api/v1/jobs/recordInfo. Первые три означают, что работа идёт: запрос надо повторить примерно через 3 секунды — чаще спрашивать нечего, столько же ждёт между опросами сам шлюз. Два последних состояния окончательные: после них задача не меняется.

stateЧто происходит
waiting Задача принята и стоит в очереди шлюза; поставщику она ещё не отправлена.
queuing Поставщик задачу принял и поставил в свою очередь.
generating Генерация идёт.
success Готово: ссылки на результат лежат в resultJson, в creditsConsumed — сколько списано.
fail Задача не удалась: причина в failCode и failMsg, удержанные кредиты возвращены целиком.

Задача идёт, пока модель не пришлёт результат или отказ. Причина неудачи приходит двумя полями: failCode из таблицы ниже и failMsg словами.

failCodeЧто произошло
501 Поставщик вернул отказ: генерация не удалась.
408 Модель не приняла задачу за 60 минут или не отвечала сутки.
404 Поставщик не знает такой задачи.
429 Поставщик отбил создание задачи по своему лимиту.
500 Поломка на нашей стороне; подробности остаются в журнале шлюза.

Слова модели в failMsg бывают непонятны, поэтому к части неудач шлюз добавляет поле failComment — наш комментарий по-русски о том, что произошло. У остальных неудач это поле пустое.

failMsg, примерfailComment
Image fetch failed. Модель не смогла скачать файл из нашего хранилища. Вероятно, это разовый сбой, повторите запрос. Если ошибка повторится — напишите в поддержку: hi@gen202.com
File type not supported По ссылке открывается страница сайта, а не файл. Загрузите сам файл или дайте прямую ссылку на него.
image #2: width and height must be between 300px and 6000px (got 262x377) (invalid_asset_material) Одна из картинок слишком маленькая. Seedance принимает картинки от 300 до 6000 пикселей по каждой стороне.
Seedance identified your task as video editing based on your prompt. Seedance понял запрос как редактирование присланного видео. В песочнице и чате выберите режим «Редактирование видео», в API поставьте пропорции adaptive и длительность −1.
Seedance identified your task as video extension based on your prompt. Seedance решил, что присланное видео нужно продлить. Для этого поставьте пропорции adaptive, а если продлевать не нужно — уберите эту просьбу из промта.
generate task timeout. Модель не успела создать результат и сама остановила задачу.
Internal Error Модель остановилась и не назвала причину. Возможно, она перегружена или временно недоступна. Или запрос отклонён из-за чувствительной темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды.
The request failed because the input image may contain sensitive information. Модель отклонила загруженную картинку из-за чувствительной темы. Такие темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды.
The generated content was filtered by the safety system. Модель отклонила запрос из-за чувствительной темы. Такие темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды.
The model provider rejected or dropped the task creation request. Модель остановилась и не назвала причину. Возможно, она перегружена или временно недоступна. Или запрос отклонён из-за чувствительной темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды.
No result from the provider within the task deadline. Модель либо не приняла задачу за 15 минут (у видео — за 60), либо не ответила за сутки.

Ссылка на готовый файл живёт 14 дней — столько его хранит поставщик. Файл, который нужен дольше, скачивайте к себе сразу после того, как задача пришла в состояние success.

Отказы

Тело отказа одно на все случаи: {"code":…,"msg":…,"data":null}. Задача, не дошедшая до результата, не тарифицируется — удержанные кредиты возвращаются целиком.

КодАдресКогда
400 /api/v1/jobs/createTask Тело запроса — не разбираемый JSON.
401 /api/v1/jobs/createTask Ключа нет в заголовке Authorization, либо он неверный или отключён.
402 /api/v1/jobs/createTask Свободных кредитов меньше, чем удерживается под задачу.
403 /api/v1/jobs/createTask Аккаунт заблокирован: вызовы модели, пополнение и загрузка файлов ему закрыты. Ключи при этом не отключены — запрет лежит на аккаунте.
413 /api/v1/jobs/createTask Тело запроса больше 512 КиБ.
415 /api/v1/jobs/createTask Тело отправлено не как application/json или заголовок Content-Type не передан.
422 /api/v1/jobs/createTask Поле model пустое или его имени нет в каталоге, input — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается. Тот же код — если во входе наша ссылка на готовый результат старше 14 дней: файла уже нет, его нужно загрузить заново. И если модель не может выполнить именно это сочетание полей: в сообщении сказано, что поменять, — например, другие файлы-образцы.
429 /api/v1/jobs/createTask Больше 30 запросов в минуту на один ключ, больше 50 незавершённых задач на аккаунте либо таймаут: за час 5 запросов к моделям этого вида отклонены из-за чувствительной темы, и запуск всех моделей этого вида приостановлен. У такого отказа в теле есть поле timeout с временем окончания паузы, а в заголовке Retry-After — секунды до него.
500 /api/v1/jobs/createTask Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.
401 /api/v1/jobs/recordInfo Ключа нет в заголовке Authorization, либо он неверный или отключён.
404 /api/v1/jobs/recordInfo Задачи с таким номером нет или она создана другим аккаунтом.
422 /api/v1/jobs/recordInfo Параметр taskId не передан.
429 /api/v1/jobs/recordInfo Больше 300 запросов в минуту на один ключ.
500 /api/v1/jobs/recordInfo Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.

Пример вызова

task.sh
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
  -H "Authorization: Bearer sk-ваш-ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "happyhorse/1-1-reference-to-video",
    "input": {
      "prompt": "The ginger cat from [Image 1], in a white spacesuit, floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
      "reference_image": [
        "https://gen202.com/assets/sample-nano-banana-pro.jpg"
      ],
      "aspect_ratio": "1:1",
      "resolution": "720p",
      "duration": 3
    }
  }' | jq -r '.data.taskId')

# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
#    generating означают «работа идёт», success и fail — окончательные
while true; do
  RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
    -H "Authorization: Bearer sk-ваш-ключ")
  STATE=$(echo "$RECORD" | jq -r '.data.state')
  case "$STATE" in success|fail) break;; esac
  sleep 3
done

# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
#    внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
  if .state == "fail"
  then "отказ \(.failCode): \(.failMsg)"
  else .resultJson | fromjson | .resultUrls[0]
  end'
task.py
import json
import time

import requests

headers = {"Authorization": "Bearer sk-ваш-ключ"}

# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
    "https://api.gen202.com/api/v1/jobs/createTask",
    headers=headers,
    json={
      "model": "happyhorse/1-1-reference-to-video",
      "input": {
        "prompt": "The ginger cat from [Image 1], in a white spacesuit, floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
        "reference_image": [
          "https://gen202.com/assets/sample-nano-banana-pro.jpg"
        ],
        "aspect_ratio": "1:1",
        "resolution": "720p",
        "duration": 3
      }
    },
).json()
task_id = created["data"]["taskId"]

# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
#    generating означают «работа идёт», success и fail — окончательные
while True:
    task = requests.get(
        "https://api.gen202.com/api/v1/jobs/recordInfo",
        headers=headers,
        params={"taskId": task_id},
    ).json()["data"]
    if task["state"] in ("success", "fail"):
        break
    time.sleep(3)

# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
    raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])

# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])

Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в 3 секунды, пока задача не закончится, и разбирает ответ до ссылки на файл. Разборов два, потому что поле resultJson — строка JSON внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её перечислений, поэтому он проходит проверку шлюза как есть. Заменить в нём нужно два значения: свой ключ и ссылку на изображение — в примере стоит образец с нашего сайта. Пример на оболочке разбирает ответ через jq; на Python своего ничего не нужно, кроме requests.

Остальные модели этого семейства и их поля — в разделе документации Видео.

Что делает нейросеть HappyHorse 1.1

HappyHorse 1.1 — видеомодель Alibaba, объявленная 22 июня 2026 года; через API её отдаёт Alibaba Cloud Model Studio. Цена у GEN202 — 17,7 ₽ за секунду в 720p и 22,8 ₽ в 1080p, одна и та же во всех режимах. Видео модель отдаёт сразу со звуком.

Сцену задают одним из трёх способов, и под каждый на странице свой режим: «Текст», «Референсы» и «Кадры». В поле model они уходят именами happyhorse/1-1-text-to-video, happyhorse/1-1-reference-to-video и happyhorse/1-1-image-to-video.

В режиме «Референсы» к описанию прикладывают от 1 до 9 изображений и называют их в тексте метками [Image 1], [Image 2] и дальше по порядку списка. В режиме «Кадры» изображение одно, и с него начинается видео.

Звук модель пишет сама, вместе с изображением, а фоновую музыку и шумы называют словами в описании. Поля всех трёх режимов разобраны в разделе «HappyHorse».

Как снять видео в HappyHorse 1.1: описание, референсы или первый кадр

Запрос к HappyHorse 1.1 принимает GEN202 и передаёт дальше, а видео собирается на стороне Alibaba. В песочнице на этой странице видео запускают из формы, смотрят и скачивают.

Ставка за секунду у трёх режимов общая, и задаёт её разрешение: обе строки собраны в таблице цен. Самое короткое видео — 3 секунды в 720p — стоит 53,1 ₽.

Шаги у всех режимов HappyHorse 1.1 одни, и отличаются они только файлами, которые прикладывают к описанию.

  1. Выберите режим. «Текст» — одно описание, «Референсы» — описание с изображениями-референсами, «Кадры» — описание с изображением первого кадра.
  2. Опишите сцену. Описание до 5 000 знаков называет персонажей, действие, движение камеры и всё, что должно звучать. В режиме «Кадры» описание пишут по желанию.
  3. Приложите изображения. Референсы кладут списком reference_image и называют в описании метками [Image 1], [Image 2]; первый кадр — одной ссылкой в image_urls.
  4. Задайте длину, разрешение и форму кадра. Поле duration берёт от 3 до 15 секунд, resolution — 720p и 1080p, aspect_ratio — одну из 9 форм. В режиме «Кадры» форму задаёт сам кадр.
  5. Проверьте замысел коротким видео. Сначала снимают 3 секунды в 720p и правят описание, а длинное видео в 1080p запускают по готовому тексту.

Чем различаются режимы HappyHorse 1.1

У трёх режимов HappyHorse 1.1 одна ставка, одна длительность и одни разрешения; различаются они файлами, которые кладут рядом с описанием.

РежимОткуда берётся сценаЧто кладут сверх описанияФорма кадра
«Текст»из описания—одна из 9
«Референсы»из описания и изображенийот 1 до 9 изображений в reference_imageодна из 9
«Кадры»из первого кадраодно изображение в image_urlsкак у изображения

Обязательные поля в режиме «Текст» — prompt, в режиме «Референсы» — prompt и reference_image, в режиме «Кадры» — image_urls.

Сцену в режиме «Кадры» задаёт сам кадр, а текст описания лишь уточняет, что в ней происходит.

Выпуски HappyHorse: имена у Alibaba и даты

HappyHorse 1.1 — следующий выпуск после HappyHorse 1.0, и обе модели Alibaba выпустила в 2026 году. В таблице — имя у разработчика, дата, что изменилось и имя для поля model.

Имя у AlibabaДата выходаЧто изменилосьИмя для поля model
HappyHorse 1.122 июня 2026Связнее движение, до 9 референсов, точнее следование описанию, естественнее изображение, точнее звукhappyhorse/1-1-text-to-video, happyhorse/1-1-reference-to-video, happyhorse/1-1-image-to-video
HappyHorse 1.022 апреля 2026Первое поколение модели в Alibaba Cloud Model Studio—

Прочерк в строке HappyHorse 1.0 значит, что на этой странице работает HappyHorse 1.1.

Дату выхода 1.1 называет текст, который HappyHorse передала изданию QbitAI («量子位»): «6月22日,阿里巴巴发布视频生成模型HappyHorse 1.1». Перевод наш: «22 июня Alibaba выпустила видеомодель HappyHorse 1.1». Страница — текст HappyHorse о выходе 1.1.

Дата 1.0 взята из журнала моделей Model Studio; обе даты приведены на 6 ноября 2026 года, а линейка целиком разобрана на странице HappyHorse API.

Какой длины и в каком разрешении выходит видео HappyHorse 1.1

Поле duration у HappyHorse 1.1 берёт целое число секунд от 3 до 15, одинаково во всех трёх режимах.

Разрешения — 720p и 1080p, и от выбора между ними зависит ставка за секунду; обе стоят в таблице цен.

Форм кадра 9: 16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9. Их выбирают в режимах «Текст» и «Референсы», а в режиме «Кадры» видео сохраняет пропорции присланного кадра.

Что кладут в запрос HappyHorse 1.1 кроме описания

Описание вмещает до 5 000 знаков: в режимах «Текст» и «Референсы» оно обязательно, в режиме «Кадры» — по желанию.

Референсы идут списком reference_image — от 1 до 9 ссылок на изображения. Первое изображение списка в описании зовётся [Image 1], второе — [Image 2], и так далее.

Первый кадр передают одной ссылкой в списке image_urls, и с этого изображения видео начинается.

Дорожку звука модель собирает сама, и всё, что должно звучать, — реплики, музыку, шумы — называют в описании. Все поля HappyHorse 1.1 с их значениями собраны в таблице выше.

Что Alibaba говорит о модели HappyHorse 1.1

Через API модель отдаёт Alibaba Cloud, и на странице каждой модели 1.1 это сказано прямо: «The inference service provider for happyhorse-1.1-t2v is Alibaba Cloud Model Studio». Перевод наш: «Вывод модели happyhorse-1.1-t2v обслуживает Alibaba Cloud Model Studio». Страница — сведения о модели happyhorse-1.1-t2v.

Что нового в выпуске, Alibaba Cloud перечисляет в описании к видео о выходе 1.1 на своём канале: «Enhanced Dynamic Expressiveness», «Robust Subject Identity Consistency», «Long-Context Instruction Following», «Upgraded Visual Quality», «Native Audio Capability». Перевод наш: выразительнее движение, устойчивее облик персонажа, модель следует длинному описанию, лучше изображение, звук рождается вместе с видео. Видео — Alibaba Cloud, 22 июня 2026.

О референсах Alibaba Cloud пишет на странице модели happyhorse-1.1-r2v: «With support for up to 9 reference images». Перевод наш: «С поддержкой до 9 изображений-референсов». Страница — сведения о модели happyhorse-1.1-r2v. В форме GEN202 список reference_image берёт до 9 ссылок.

Звуку в статье Alibaba Cloud о выходе 1.1 отдан отдельный раздел — «音频能力优化,音画同步精度提升». Перевод наш: «Звук доработан, синхронизация звука и изображения точнее». Там же сказано, что темп, паузы и интонация реплик меняются по сцене и настроению, а фоновую музыку и шумы задают в описании. Статья — Alibaba Cloud в WeChat, 23 июня 2026.

Время работы разработчик называет в справочнике по видео из описания: «Text-to-video tasks typically take 1 to 5 minutes». Перевод наш: «Задача на видео по описанию обычно занимает от 1 до 5 минут». Число относится к платформе самой Alibaba Cloud. Страница — справочник HappyHorse по видео из описания.

Слова Alibaba Cloud о HappyHorse 1.1 приведены по справочнику Model Studio, статье и видео на 6 ноября 2026 года.

Какие пределы Alibaba ставит у HappyHorse 1.1

Первый кадр разработчик описывает так: «Formats: JPEG, JPG, PNG, WEBP. Resolution: Width and height must both be at least 300 pixels. Aspect ratio: Between 1:2.5 and 2.5:1. File size: Up to 20 MB». Перевод наш: форматы JPEG, JPG, PNG и WEBP, ширина и высота от 300 точек, пропорции от 1:2,5 до 2,5:1, файл до 20 МБ. Страница — справочник HappyHorse по видео из первого кадра.

У референса предел свой: «The shortest side must be at least 400 pixels. A clear image with a resolution of 720P or higher is recommended», а файл — до 20 МБ. Перевод наш: короткая сторона от 400 точек, а лучше брать чёткое изображение от 720p. Страница — справочник HappyHorse по видео по референсам.

Число референсов разработчик держит в границах «Number of reference images: 1 to 9» — от одного до девяти; поле reference_image в форме GEN202 берёт от 1 до 9.

Что показали независимые проверки HappyHorse 1.1

HappyHorse 1.1 стоит в таблицах Artificial Analysis рядом с прошлым выпуском, HappyHorse 1.0. Оценка в этих таблицах — Elo: она складывается из попарных сравнений, и рядом с ней стоят допуск и число голосов.

В таблице видео по описанию со звуком у HappyHorse-1.1 оценка 1050 с допуском 14 при 6 549 голосах, у HappyHorse-1.0 — 1033 с допуском 14 при 5 089. Таблица — Artificial Analysis, видео по описанию.

В таблице видео из изображения со звуком у HappyHorse-1.1 — 1037 с допуском 15 при 6 273 голосах, у HappyHorse-1.0 — 1022 с допуском 16 при 4 348. Таблица — Artificial Analysis, видео из изображения.

Голоса собрала площадка Artificial Analysis, и оценки HappyHorse приведены по её таблицам на 6 ноября 2026 года.

Официальный канал Alibaba Cloud — объявление о выходе HappyHorse 1.1 от 22 июня 2026 года: короткий фильм «Are You Happy», а под видео — список того, что нового в выпуске. Идёт 2 минуты 21 секунду.

Вопросы и ответы

Как вызвать HappyHorse 1.1 через API из России?
Запрос уходит на api.gen202.com, и это адрес GEN202, а не адрес Alibaba: обращения за границу в вызове HappyHorse 1.1 нет, поэтому VPN не требуется. В поле model уходит идентификатор выбранного варианта: текст в видео (happyhorse/1-1-text-to-video), первый кадр (happyhorse/1-1-image-to-video), референсы (happyhorse/1-1-reference-to-video). Порядок вызова HappyHorse 1.1 с примерами кода разобран в документации.
Сколько стоит HappyHorse 1.1
Цена за секунду HappyHorse 1.1 — от 35.4 кр. (17,7 ₽ · $0.1609) до 45.6 кр. (22,8 ₽ · $0.2073). У HappyHorse 1.1 списывается фактический расход, а задача, завершившаяся ошибкой, не тарифицируется вовсе.
Нужны ли VPN и иностранная карта для HappyHorse 1.1
Ни то, ни другое: обращение к HappyHorse 1.1 идёт на наш адрес, а расчёты с Alibaba ведём мы, поэтому договариваться с ним клиенту не о чем. Оплата рублями с карты российского банка.
Что HappyHorse 1.1 принимает на вход
Обязательные поля запроса к HappyHorse 1.1: Текст в видео — prompt — от 1 до 5 000 символов. Первый кадр — image_urls — одна ссылка на изображение. Референсы — prompt — от 1 до 5 000 символов; reference_image — от 1 до 9 ссылок на изображение. Остальные поля необязательны.
Как подключить HappyHorse 1.1 API и сделать первый вызов
Войти на сайт и выпустить ключ в кабинете: при первом входе начисляется 50 кредитов, и этот же ключ открывает HappyHorse 1.1 вместе с остальным каталогом. Собственного ключа Alibaba и договора с ним для вызова HappyHorse 1.1 не нужно.
Какая компания разработала HappyHorse 1.1
HappyHorse 1.1 разработала Alibaba и объявила 22 июня 2026 года, а через API модель отдаёт Alibaba Cloud Model Studio. Это видеомодель со звуком: видео по описанию, по изображениям-референсам и из первого кадра.
Чем HappyHorse 1.1 отличается от HappyHorse 1.0
По словам Alibaba Cloud, у 1.1 связнее и сильнее движение, режим референсов берёт до 9 изображений и устойчивее держит облик персонажа, модель лучше понимает и короткое, и длинное описание, в изображении меньше «масляного блеска» и пересвеченной резкости, а звук точнее совпадает с действием. Длина видео, разрешения и свободные пропорции у двух выпусков те же.
Есть ли у HappyHorse официальный сайт
Сайт модели — happyhorse.com, официальный аккаунт в X — @HappyHorseATH, а для разработчиков HappyHorse описана в справочнике Alibaba Cloud Model Studio. Здесь HappyHorse 1.1 вызывают по API ключу GEN202 и оплачивают рублями.
Как сослаться на референсы в HappyHorse 1.1
Изображения кладут списком reference_image — до 9 штук, — а в описании называют метками [Image 1], [Image 2] и дальше. Номер в метке совпадает с местом изображения в списке.