Создаёт короткое видео по одному изображению и текстовому описанию движения, как будто «оживляет» картинку. Цена зависит от разрешения: 480p - 6 ₽/сек., 720p - 12 ₽/сек.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Wan 2.2 превращает статичную картинку в короткий видеоролик с движением. Вы загружаете изображение, описываете, что должно происходить в кадре, и получаете 5- или 8-секундное видео: камера двигается, персонаж оживает, на фоне шевелятся деревья, мерцает свет или летят искры.
Два основных сценария:
Каждый вызов создаёт асинхронную операцию. После запуска API сразу возвращает id и стартовый статус, а готовый результат нужно забирать отдельной проверкой.
POST /api/v1/operationsAuthorization: Bearer brth_...id, стартовый статус и стоимость.{
"tool": "wan-2-2-i2v",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "wan-2-2-i2v".input - параметры конкретного запуска. Набор полей зависит от сценария.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
prompt | string | Да | Текстовое описание того, что должно происходить в кадре: движение персонажа, камеры, фона, стиль, свет. Чем конкретнее описание, тем предсказуемее результат. От 3 до 2000 символов. |
image | string (url) | Да | URL исходного изображения - стартового кадра, который нейросеть будет «оживлять». Допустимые расширения: .jpg, .jpeg, .png, .webp. |
resolution | enum | Да | Разрешение видео. Варианты: 480p, 720p. Влияет на цену. |
duration_ui | enum | Да | Длительность ролика. Варианты: 5 (5 секунд), 8 (8 секунд). Влияет на цену. |
use_negative_prompt | boolean | Нет | Включает негативный промпт. Если true, можно передать negative_prompt. |
negative_prompt | string | Нет | Описание того, чего не должно быть в кадре (например, «размыто, артефакты, лишние пальцы, текст»). Работает только при use_negative_prompt = true. Максимум 500 символов. |
use_last_image | boolean | Нет | Включает режим конечного кадра. Если true, нужно также передать last_image. |
last_image | string (url) | Нет | URL изображения конечного кадра - картинки, к которой ролик должен прийти в конце. Обязателен при use_last_image = true. Допустимые расширения: .jpg, .jpeg, .png, .webp. |
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "wan-2-2-i2v",
"input": {
"prompt": "Персонаж слегка поворачивает голову, ветер колышет волосы, мягкий естественный свет, плавный наезд камеры",
"image": "https://cdn.example.com/source-image-1.jpg",
"resolution": "480p",
"duration_ui": "5"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'wan-2-2-i2v',
input: {
prompt:
'Персонаж слегка поворачивает голову, ветер колышет волосы, мягкий естественный свет, плавный наезд камеры',
image: 'https://cdn.example.com/source-image-1.jpg',
resolution: '480p',
duration_ui: '5',
},
}),
})
const data = await response.json()
console.log(data)
import requests
response = requests.post(
"https://bratuha.ru/api/v1/operations",
headers={
"Authorization": "Bearer brth_ваш_ключ",
"Content-Type": "application/json",
},
json={
"tool": "wan-2-2-i2v",
"input": {
"prompt": "Персонаж слегка поворачивает голову, ветер колышет волосы, мягкий естественный свет, плавный наезд камеры",
"image": "https://cdn.example.com/source-image-1.jpg",
"resolution": "480p",
"duration_ui": "5",
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Конечный кадр позволяет задать финальную картинку, к которой ролик плавно придёт в конце. Удобно для переходов «кадр А - кадр Б».
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "wan-2-2-i2v",
"input": {
"prompt": "Плавный переход: цветок раскрывается из бутона в полный распуск, мягкий студийный свет",
"image": "https://cdn.example.com/source-image-1.jpg",
"use_last_image": true,
"last_image": "https://cdn.example.com/source-image-2.jpg",
"resolution": "720p",
"duration_ui": "8"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'wan-2-2-i2v',
input: {
prompt:
'Плавный переход: цветок раскрывается из бутона в полный распуск, мягкий студийный свет',
image: 'https://cdn.example.com/source-image-1.jpg',
use_last_image: true,
last_image: 'https://cdn.example.com/source-image-2.jpg',
resolution: '720p',
duration_ui: '8',
},
}),
})
const data = await response.json()
console.log(data)
import requests
response = requests.post(
"https://bratuha.ru/api/v1/operations",
headers={
"Authorization": "Bearer brth_ваш_ключ",
"Content-Type": "application/json",
},
json={
"tool": "wan-2-2-i2v",
"input": {
"prompt": "Плавный переход: цветок раскрывается из бутона в полный распуск, мягкий студийный свет",
"image": "https://cdn.example.com/source-image-1.jpg",
"use_last_image": True,
"last_image": "https://cdn.example.com/source-image-2.jpg",
"resolution": "720p",
"duration_ui": "8",
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "wan-2-2-i2v",
"cost": 30,
"balance_after": 495,
"created_at": "2026-03-29T12:00:00Z"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "wan-2-2-i2v",
"cost": 30,
"created_at": "2026-03-29T12:00:00Z",
"completed_at": "2026-03-29T12:01:15Z",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/wan-2-2-i2v/result.mp4"
]
},
"error_message": null
}
После создания операции сохраните id и используйте его для отдельной проверки статуса:
GET /api/v1/operations/{id}id возвращается сразу после POST /api/v1/operations.curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/op_uuid-123
const response = await fetch(
'https://bratuha.ru/api/v1/operations/op_uuid-123',
{
headers: {
Authorization: 'Bearer brth_ваш_ключ',
},
},
)
const data = await response.json()
console.log(data)
После успешного завершения операция возвращает result в таком формате:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/wan-2-2-i2v/result.mp4"
]
}
type - всегда "video".urls - массив ссылок на готовые видеофайлы. Обычно возвращается один ролик в формате .mp4.Если операция завершилась с ошибкой, result будет null, а текст ошибки вернётся в error_message.
Цена зависит от двух параметров: разрешения и длительности. Ставка за секунду умножается на длительность ролика.
| Разрешение | Длительность | Цена |
|---|---|---|
| 480p | 5 сек | 30 ₽ |
| 480p | 8 сек | 48 ₽ |
| 720p | 5 сек | 60 ₽ |
| 720p | 8 сек | 96 ₽ |
Цена не зависит от использования негативного промпта или конечного кадра.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую операцию.queued, затем отдельно проверяете статус по id.image и last_image подходят только внешние http/https URL. localhost, private IP и внутренние адреса не принимаются..jpg, .jpeg, .png, .webp. Форматы HEIC/HEIF, которые поддерживаются при загрузке файлов в UI, в Public API по URL не принимаются.last_image) работает через gate-поле use_last_image. Чтобы передать last_image, нужно также отправить use_last_image: true.use_negative_prompt. Чтобы передать negative_prompt, нужно также отправить use_negative_prompt: true.