Общая документация Public API · API-ключ можно создать в настройках аккаунта
Wan 2.7 Image - универсальная модель для картинок: она создаёт изображения по текстовому описанию и редактирует готовые фотографии по инструкции. Её сильные стороны - точное следование описанию, аккуратное редактирование без порчи остальной картинки, работа с несколькими референсами и серии согласованных кадров.
Через API доступны все режимы формы сайта:
prompt;input_urls и описываете, что изменить;Каждый вызов создаёт асинхронную операцию: вы получаете id, а результат забираете отдельным запросом статуса.
POST /api/v1/operationsAuthorization: Bearer brth_...id и стартовый статус queued.Сценарии, которые поддерживает модель:
input_urls.use_bbox_list + bbox_list).use_color_palette + color_palette).enable_sequential).{
"tool": "wan-2-7-image",
"input": {
"...": "..."
}
}
tool - slug нейросети, здесь всегда "wan-2-7-image".input - параметры конкретного запуска.input, без дополнительного вложенного объекта input.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
prompt | string | Да | Что нарисовать или что изменить на исходном изображении, от 3 до 5000 символов. Описывайте сцену, стиль, свет и важные детали. При редактировании перечислите, что менять, и что оставить как есть. |
tier | enum | Нет | Модель: standard (Обычная, 5 ₽ за изображение) или pro (Pro, 10 ₽ за изображение). По умолчанию standard. Pro даёт больше деталей в фотореализме и портретах. |
input_urls | string[] (url) | Нет | От 1 до 9 внешних URL изображений для редактирования или референсов. Без этого поля модель генерирует картинку с нуля. Только http/https ссылки, форматы .jpg, .jpeg, .png, .webp. |
aspect_ratio | enum | Нет | Формат кадра для генерации без изображений: auto, 1:1, 16:9, 4:3, 21:9, 3:4, 9:16, 8:1, 1:8. По умолчанию auto. Если передан input_urls, формат берётся из исходного изображения, и это поле не учитывается. |
resolution | enum | Нет | Разрешение результата: 1K, 2K или 4K. По умолчанию 2K. 4K принимается только для модели standard без изображений и при выключенном групповом режиме; в наших тестах провайдер сейчас отвечает на 4K ошибкой «Указанное разрешение не поддерживается», поэтому надёжный максимум - 2K. |
num_images_standard | number | Нет | Сколько независимых вариантов сгенерировать в обычном режиме, от 1 до 4. По умолчанию 1. Каждое изображение оплачивается отдельно. |
enable_sequential | boolean | Нет | Групповой режим. Если true, модель рисует серию согласованных кадров (один персонаж, один стиль) за один запрос. По умолчанию . Несовместим с и . |
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "wan-2-7-image",
"input": {
"prompt": "Портрет пожилого рыбака крупным планом, обветренная кожа, капли дождя на жёлтом капюшоне, серый северный свет, фотореалистично, объектив 85 мм",
"tier": "pro",
"aspect_ratio": "3:4",
"resolution": "2K"
}
}'
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-7-image',
input: {
prompt:
'Портрет пожилого рыбака крупным планом, обветренная кожа, капли дождя на жёлтом капюшоне, серый северный свет, фотореалистично, объектив 85 мм',
tier: 'pro',
aspect_ratio: '3:4',
resolution: '2K',
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-2-7-image',
'input': {
'prompt': 'Портрет пожилого рыбака крупным планом, обветренная кожа, капли дождя на жёлтом капюшоне, серый северный свет, фотореалистично, объектив 85 мм',
'tier': 'pro',
'aspect_ratio': '3:4',
'resolution': '2K',
},
},
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-7-image",
"input": {
"prompt": "Замени бумажный стаканчик кофе на прозрачную чашку зелёного чая и сделай за окном зимний вечер с гирляндами. Лицо, позу, одежду и надписи не менять",
"input_urls": [
"https://cdn.example.com/source-image-1.jpg"
]
}
}'
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-7-image',
input: {
prompt:
'Замени бумажный стаканчик кофе на прозрачную чашку зелёного чая и сделай за окном зимний вечер с гирляндами. Лицо, позу, одежду и надписи не менять',
input_urls: ['https://cdn.example.com/source-image-1.jpg'],
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-2-7-image',
'input': {
'prompt': 'Замени бумажный стаканчик кофе на прозрачную чашку зелёного чая и сделай за окном зимний вечер с гирляндами. Лицо, позу, одежду и надписи не менять',
'input_urls': ['https://cdn.example.com/source-image-1.jpg'],
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Первое изображение - персонаж, второе - предмет или фон. В prompt явно скажите, что взять из каждого.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "wan-2-7-image",
"input": {
"prompt": "Помести персонажа с первого изображения на кроссовок со второго изображения, как будто он на нём катается. Сохрани внешность персонажа и дизайн кроссовка, сделай яркий рекламный кадр",
"input_urls": [
"https://cdn.example.com/source-image-1.jpg",
"https://cdn.example.com/source-image-2.jpg"
]
}
}'
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-7-image',
input: {
prompt:
'Помести персонажа с первого изображения на кроссовок со второго изображения, как будто он на нём катается. Сохрани внешность персонажа и дизайн кроссовка, сделай яркий рекламный кадр',
input_urls: [
'https://cdn.example.com/source-image-1.jpg',
'https://cdn.example.com/source-image-2.jpg',
],
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-2-7-image',
'input': {
'prompt': 'Помести персонажа с первого изображения на кроссовок со второго изображения, как будто он на нём катается. Сохрани внешность персонажа и дизайн кроссовка, сделай яркий рекламный кадр',
'input_urls': [
'https://cdn.example.com/source-image-1.jpg',
'https://cdn.example.com/source-image-2.jpg',
],
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Координаты считаются в пикселях исходного изображения: [x1, y1, x2, y2] - левый верхний и правый нижний углы прямоугольника. На каждое изображение из input_urls нужен свой список областей, поэтому bbox_list - массив массивов.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "wan-2-7-image",
"input": {
"prompt": "В выделенной области замени бумажный стаканчик на стеклянную вазу с розовыми тюльпанами. Остальное изображение не трогать",
"input_urls": [
"https://cdn.example.com/source-image-1.jpg"
],
"use_bbox_list": true,
"bbox_list": [
[
[330, 1080, 520, 1350]
]
]
}
}'
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-7-image',
input: {
prompt:
'В выделенной области замени бумажный стаканчик на стеклянную вазу с розовыми тюльпанами. Остальное изображение не трогать',
input_urls: ['https://cdn.example.com/source-image-1.jpg'],
use_bbox_list: true,
bbox_list: [[[330, 1080, 520, 1350]]],
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-2-7-image',
'input': {
'prompt': 'В выделенной области замени бумажный стаканчик на стеклянную вазу с розовыми тюльпанами. Остальное изображение не трогать',
'input_urls': ['https://cdn.example.com/source-image-1.jpg'],
'use_bbox_list': True,
'bbox_list': [[[330, 1080, 520, 1350]]],
},
},
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-7-image",
"input": {
"prompt": "Плоская векторная иллюстрация горного пейзажа на рассвете: слои гор, озеро, одинокая сосна, минимализм, без текста",
"aspect_ratio": "16:9",
"use_color_palette": true,
"color_palette": [
{ "hex": "#1B263B", "ratio": "30.00%" },
{ "hex": "#415A77", "ratio": "25.00%" },
{ "hex": "#778DA9", "ratio": "20.00%" },
{ "hex": "#E0E1DD", "ratio": "15.00%" },
{ "hex": "#F4A261", "ratio": "10.00%" }
]
}
}'
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-7-image',
input: {
prompt:
'Плоская векторная иллюстрация горного пейзажа на рассвете: слои гор, озеро, одинокая сосна, минимализм, без текста',
aspect_ratio: '16:9',
use_color_palette: true,
color_palette: [
{ hex: '#1B263B', ratio: '30.00%' },
{ hex: '#415A77', ratio: '25.00%' },
{ hex: '#778DA9', ratio: '20.00%' },
{ hex: '#E0E1DD', ratio: '15.00%' },
{ hex: '#F4A261', ratio: '10.00%' },
],
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-2-7-image',
'input': {
'prompt': 'Плоская векторная иллюстрация горного пейзажа на рассвете: слои гор, озеро, одинокая сосна, минимализм, без текста',
'aspect_ratio': '16:9',
'use_color_palette': True,
'color_palette': [
{'hex': '#1B263B', 'ratio': '30.00%'},
{'hex': '#415A77', 'ratio': '25.00%'},
{'hex': '#778DA9', 'ratio': '20.00%'},
{'hex': '#E0E1DD', 'ratio': '15.00%'},
{'hex': '#F4A261', 'ratio': '10.00%'},
],
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Опишите все кадры в одном prompt и задайте их количество в num_images_sequential. В ответе придёт столько же ссылок.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "wan-2-7-image",
"input": {
"prompt": "Комикс из четырёх кадров про маленького робота-садовника: 1) сажает семечко в горшок, 2) поливает из лейки, 3) ждёт под дождём, 4) радуется расцветшему цветку. Один и тот же персонаж и стиль во всех кадрах, мягкий 3D-рендер",
"aspect_ratio": "1:1",
"enable_sequential": true,
"num_images_sequential": 4
}
}'
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-7-image',
input: {
prompt:
'Комикс из четырёх кадров про маленького робота-садовника: 1) сажает семечко в горшок, 2) поливает из лейки, 3) ждёт под дождём, 4) радуется расцветшему цветку. Один и тот же персонаж и стиль во всех кадрах, мягкий 3D-рендер',
aspect_ratio: '1:1',
enable_sequential: true,
num_images_sequential: 4,
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-2-7-image',
'input': {
'prompt': 'Комикс из четырёх кадров про маленького робота-садовника: 1) сажает семечко в горшок, 2) поливает из лейки, 3) ждёт под дождём, 4) радуется расцветшему цветку. Один и тот же персонаж и стиль во всех кадрах, мягкий 3D-рендер',
'aspect_ratio': '1:1',
'enable_sequential': True,
'num_images_sequential': 4,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "wan-2-7-image",
"cost": 5,
"balance_after": 495,
"created_at": "2026-09-17T12:00:00Z"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "wan-2-7-image",
"cost": 5,
"created_at": "2026-09-17T12:00:00Z",
"completed_at": "2026-09-17T12:00:41Z",
"result": {
"type": "image",
"urls": [
"https://storage.bratuha.ru/results/wan-2-7-image/image-1.png"
]
},
"error_message": null
}
{
"id": "op_uuid-123",
"status": "failed",
"tool": "wan-2-7-image",
"cost": 5,
"created_at": "2026-09-17T12:00:00Z",
"completed_at": "2026-09-17T12:00:05Z",
"result": null,
"error_message": "Указанное разрешение не поддерживается. Пожалуйста, выберите другое."
}
После создания операции сохраните id и проверяйте её статус запросом:
GET /api/v1/operations/{id}
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()
Пока операция выполняется, status будет queued или processing. Опрашивайте статус раз в несколько секунд.
После успешного завершения result содержит готовые изображения:
{
"type": "image",
"urls": [
"https://storage.bratuha.ru/results/wan-2-7-image/image-1.png",
"https://storage.bratuha.ru/results/wan-2-7-image/image-2.png"
]
}
type всегда равен "image".urls - массив ссылок на PNG. В обычном режиме их столько, сколько задано в num_images_standard, в групповом - сколько в num_images_sequential. Порядок ссылок совпадает с порядком кадров.standard и 10 ₽ для pro.num_images_standard (обычный режим) или num_images_sequential (групповой режим). Например, 4 кадра в групповом режиме на модели standard стоят 20 ₽, 2 варианта на pro - 20 ₽.cost ответа.POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую операцию и списывает деньги.queued проверяйте статус по id.input_urls подходят только внешние http/https ссылки, без localhost и приватных адресов; форматы .jpg, .jpeg, .png, .webp. HEIC/HEIF принимаются только при загрузке через форму сайта, по URL в API - нет.aspect_ratio работает только без изображений: при редактировании формат берётся из исходника.4K принимается только для standard без input_urls и без группового режима, но по нашим тестам провайдер сейчас завершает такие операции ошибкой; используйте 2K.thinking_mode и color_palette работают только при выключенном групповом режиме, thinking_mode - ещё и только без изображений. bbox_list работает только вместе с input_urls.use_color_palette и use_bbox_list - выключатели: без true соответствующие данные не отправляются модели.bbox_list должно совпадать с числом изображений в input_urls, иначе запрос получит validation_error. Координаты - целые числа в пикселях исходного изображения.prompt и явно попросите сохранять внешность во всех кадрах.falsethinking_modecolor_palettenum_images_sequential | number | Нет | Сколько кадров в серии при enable_sequential: true, от 1 до 12. По умолчанию 1. Каждый кадр оплачивается отдельно. |
thinking_mode | boolean | Нет | Режим размышления: модель сначала продумывает расположение объектов и их взаимодействие, потом рисует. Работает только без input_urls и при выключенном групповом режиме. По умолчанию false. |
use_color_palette | boolean | Нет | Включает заданную палитру. Без true поле color_palette игнорируется. Доступно только при выключенном групповом режиме. |
color_palette | object[] | Нет | От 3 до 10 цветов, рекомендуется 8. Каждый элемент - объект { "hex": "#RRGGBB", "ratio": "30.00%" }: цвет и его доля в процентах. Доля - строка с двумя знаками после точки и знаком %, сумма долей должна быть ровно 100.00%. |
use_bbox_list | boolean | Нет | Включает точечную правку областей. Без true поле bbox_list игнорируется. Работает только вместе с input_urls. |
bbox_list | number[][][] | Нет | Области для правки: массив, где на каждое изображение из input_urls приходится один элемент, а внутри - список прямоугольников [x1, y1, x2, y2] в пикселях исходного изображения (целые числа, левый верхний и правый нижний углы). До 2 областей на изображение. Количество элементов должно совпадать с количеством изображений. |