Создаёт изображения по текстовому заданию и редактирует загруженные картинки, включая изменение отдельной выделенной области. Цена зависит от разрешения: 1K - 4 ₽ за изображение, 2K - 6 ₽ за изображение.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Qwen Image 2.1 создаёт изображения по текстовому заданию и редактирует готовые картинки. Её используют для иллюстраций, баннеров и обложек, для замены деталей на фото, переноса стиля или цвета с одного изображения на другое и для сборки одной сцены из нескольких референсов. Через API доступны три сценария:
image_urls с одной или несколькими ссылками;Каждый запуск создаёт асинхронную операцию. Сразу после запроса API возвращает id, а готовое изображение нужно забрать отдельной проверкой статуса.
POST /api/v1/operationshttps://bratuha.ru/api/v1/operationsAuthorization: Bearer brth_...id и стартовый статус.Сценарий выбирается автоматически:
image_urls не передан или массив пустой, изображение создаётся только по тексту;image_urls передан, модель редактирует эти изображения или использует их как референсы;use_mask: true и mask_url, меняется только область под маской.{
"tool": "qwen-image-2-1",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "qwen-image-2-1".input - параметры запуска. Все поля передаются напрямую внутри этого объекта, без дополнительного вложенного объекта input.Обязателен только prompt. Остальные параметры можно не передавать - тогда используются значения, указанные в таблице ниже.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
prompt | string | Да | Текстовое задание, от 3 до 5000 символов, на любом языке. Опишите, что должно получиться или что изменить. С несколькими изображениями ссылайтесь на них по порядку: «первое изображение», «второе изображение». С маской описывайте только то, что должно появиться в закрашенной области. |
image_urls | string[] (url) | Нет | Массив ссылок на изображения для редактирования или референсов, от 1 до 10 штук. Расширения: jpg, jpeg, png, webp. Каждое изображение до 30 МБ и до 25 мегапикселей. Порядок в массиве важен: задание ссылается на изображения именно в этом порядке. |
use_mask | boolean | Нет | Включает правку выделенной области. Работает только вместе с mask_url и только когда в image_urls ровно одно изображение. Если не передан, маска не применяется. |
mask_url | string (url) | Только при use_mask: true | Ссылка на чёрно-белую маску в формате png. Белым отмечена область, которую нужно изменить, чёрным - то, что должно остаться без изменений. Маска должна совпадать по пропорциям с исходным изображением. Если use_mask не равен true, маска игнорируется. |
aspect_ratio | enum | Нет | Соотношение сторон: auto, 1:1, 4:3, 3:4, 3:2, 2:3, 16:9, 9:16, 21:9, 9:21. Если не передан, используется 1:1, в том числе при запросе с изображениями. Значение auto берёт пропорции первого изображения и доступно только вместе с image_urls. С маской параметр не учитывается: результат сохраняет пропорции исходника. |
resolution | enum | Нет | Разрешение: 1K или 2K, заглавной буквой. 1K - быстрее, 2K - в 4 раза больше пикселей. Если не передан, используется 1K. |
output_format | enum | Нет | Формат файла: png, webp, jpeg. Если не передан, используется png. |
background | enum | Нет | Фон: opaque - обычный, transparent - прозрачный. Прозрачный фон работает только с png и webp и несовместим с маской. Если не передан, используется opaque. |
enhance_prompt | boolean | Нет | Перед генерацией дополняет задание подробным описанием сцены - обычно это заметно улучшает качество. Передайте false, если нужен результат строго по вашему тексту. Если не передан, используется true. С маской параметр не учитывается. |
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "qwen-image-2-1",
"input": {
"prompt": "Корги в жёлтой непромокаемой шляпе сидит на каменных ступенях после дождя, малая глубина резкости",
"aspect_ratio": "16:9",
"resolution": "1K",
"output_format": "png"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'qwen-image-2-1',
input: {
prompt:
'Корги в жёлтой непромокаемой шляпе сидит на каменных ступенях после дождя, малая глубина резкости',
aspect_ratio: '16:9',
resolution: '1K',
output_format: 'png',
},
}),
})
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': 'qwen-image-2-1',
'input': {
'prompt': 'Корги в жёлтой непромокаемой шляпе сидит на каменных ступенях после дождя, малая глубина резкости',
'aspect_ratio': '16:9',
'resolution': '1K',
'output_format': 'png',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Для прозрачного фона выберите png или webp и описывайте только сам объект, без окружения и поверхности: если в задании есть фон или сцена, результат может получиться непрозрачным.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "qwen-image-2-1",
"input": {
"prompt": "Керамическая кружка мятного цвета с деревянной ручкой, вид сбоку",
"aspect_ratio": "1:1",
"resolution": "2K",
"output_format": "png",
"background": "transparent"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'qwen-image-2-1',
input: {
prompt: 'Керамическая кружка мятного цвета с деревянной ручкой, вид сбоку',
aspect_ratio: '1:1',
resolution: '2K',
output_format: 'png',
background: 'transparent',
},
}),
})
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': 'qwen-image-2-1',
'input': {
'prompt': 'Керамическая кружка мятного цвета с деревянной ручкой, вид сбоку',
'aspect_ratio': '1:1',
'resolution': '2K',
'output_format': 'png',
'background': 'transparent',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Здесь aspect_ratio: "auto" сохраняет пропорции первого изображения. Без него результат будет квадратным.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "qwen-image-2-1",
"input": {
"prompt": "Перекрась рюкзак на первом изображении в цвета со второго изображения, всё остальное оставь без изменений",
"image_urls": [
"https://cdn.example.com/source-image-1.jpg",
"https://cdn.example.com/source-image-2.jpg"
],
"aspect_ratio": "auto",
"resolution": "1K"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'qwen-image-2-1',
input: {
prompt:
'Перекрась рюкзак на первом изображении в цвета со второго изображения, всё остальное оставь без изменений',
image_urls: [
'https://cdn.example.com/source-image-1.jpg',
'https://cdn.example.com/source-image-2.jpg',
],
aspect_ratio: 'auto',
resolution: '1K',
},
}),
})
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': 'qwen-image-2-1',
'input': {
'prompt': 'Перекрась рюкзак на первом изображении в цвета со второго изображения, всё остальное оставь без изменений',
'image_urls': [
'https://cdn.example.com/source-image-1.jpg',
'https://cdn.example.com/source-image-2.jpg',
],
'aspect_ratio': 'auto',
'resolution': '1K',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Передайте ровно одно изображение, use_mask: true и ссылку на маску. В задании опишите, что должно появиться в белой области маски.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "qwen-image-2-1",
"input": {
"prompt": "Серый диван из мягкой ткани с двумя подушками горчичного цвета",
"image_urls": [
"https://cdn.example.com/source-image-1.jpg"
],
"use_mask": true,
"mask_url": "https://cdn.example.com/mask-1.png",
"resolution": "1K"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'qwen-image-2-1',
input: {
prompt: 'Серый диван из мягкой ткани с двумя подушками горчичного цвета',
image_urls: ['https://cdn.example.com/source-image-1.jpg'],
use_mask: true,
mask_url: 'https://cdn.example.com/mask-1.png',
resolution: '1K',
},
}),
})
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': 'qwen-image-2-1',
'input': {
'prompt': 'Серый диван из мягкой ткани с двумя подушками горчичного цвета',
'image_urls': ['https://cdn.example.com/source-image-1.jpg'],
'use_mask': True,
'mask_url': 'https://cdn.example.com/mask-1.png',
'resolution': '1K',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "3c1f7a52-8e4d-4b9a-a6f1-2d7e5c9b0f14",
"status": "queued",
"tool": "qwen-image-2-1",
"cost": 4,
"balance_after": 496,
"created_at": "2026-09-23T12:00:00Z"
}
{
"id": "3c1f7a52-8e4d-4b9a-a6f1-2d7e5c9b0f14",
"status": "completed",
"tool": "qwen-image-2-1",
"cost": 4,
"created_at": "2026-09-23T12:00:00Z",
"completed_at": "2026-09-23T12:00:14Z",
"result": {
"type": "image",
"urls": [
"https://storage.yandexcloud.net/bratuha.ru.files/user_files/result-image-1.png"
]
},
"error_message": null
}
{
"id": "3c1f7a52-8e4d-4b9a-a6f1-2d7e5c9b0f14",
"status": "failed",
"tool": "qwen-image-2-1",
"cost": 4,
"created_at": "2026-09-23T12:00:00Z",
"completed_at": "2026-09-23T12:00:20Z",
"result": null,
"error_message": "Не удалось выполнить операцию"
}
Если запрос не прошёл проверку, операция не создаётся и деньги не списываются:
{
"error": {
"code": "validation_error",
"message": "Опция «Прозрачный» недоступна для выбранных параметров",
"request_id": "0b6f1d7e-3a52-4c1e-9d0a-5f2f7c8e41b3"
}
}
Основные коды: unauthorized - нет заголовка Authorization, invalid_api_key - ключ неверный или отключён, validation_error - ошибка в параметрах, insufficient_funds - не хватает средств на балансе.
После создания операции сохраните id из ответа и проверяйте статус этим запросом:
GET /api/v1/operations/{id}
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/3c1f7a52-8e4d-4b9a-a6f1-2d7e5c9b0f14
const operationId = '3c1f7a52-8e4d-4b9a-a6f1-2d7e5c9b0f14'
const response = await fetch(
`https://bratuha.ru/api/v1/operations/${operationId}`,
{
headers: {
Authorization: 'Bearer brth_ваш_ключ',
},
},
)
const operation = await response.json()
console.log(operation.status, operation.result)
Статус проходит путь queued -> processing -> completed или failed. В 1K изображение обычно готово за 7-12 секунд, в 2K - за 30-55 секунд, а с входными изображениями в 2K - до 3 минут. Проверяйте одну операцию не чаще раза в секунду, иначе API вернёт 429 с кодом rate_limit_exceeded.
После успешного завершения в поле result возвращается объект изображения:
{
"type": "image",
"urls": [
"https://storage.yandexcloud.net/bratuha.ru.files/user_files/result-image-1.png"
]
}
type - тип результата, для этой нейросети это "image".urls - массив ссылок на готовые изображения. Один запуск возвращает одно изображение, но оно всё равно приходит в массиве.Файл приходит в формате, указанном в output_format.
Цена зависит только от разрешения:
| Разрешение | Цена за изображение |
|---|---|
1K | 4 ₽ |
2K | 6 ₽ |
Цена не зависит от:
Итоговая стоимость приходит в поле cost сразу после создания операции. Если на балансе недостаточно средств, операция не будет создана, а API вернёт ошибку insufficient_funds.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую операцию и повторно списывает стоимость при успешном создании.id.http/https URL, которые открываются обычным GET-запросом без авторизации. Если ссылка отвечает ошибкой или домен не открывается, операция завершится ошибкой.localhost, приватные IP-адреса и внутренние адреса.heic и heif по ссылке не принимаются: перед отправкой сконвертируйте их в jpg или png.image_urls, тем меньше деталей сохраняется с каждого. Если важна точность, передавайте не больше 4.3:2 или 16:9.background: "transparent" нельзя сочетать с output_format: "jpeg" и с маской - API вернёт validation_error.aspect_ratio: "auto" без image_urls вернёт validation_error.