Генерирует изображения по текстовому описанию и умеет опираться на до 3 референсов, чтобы сохранить персонажа, стиль или детали сцены. Цена зависит от разрешения: 720p - 8 ₽/изображение, 1080p - 12 ₽/изображение.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Runway Gen4 Image создаёт изображения по текстовому описанию. Главная её сила - референсы: можно передать до трёх картинок, и модель перенесёт в новую сцену того же человека, предмет, одежду или стиль. Так удобно делать серию кадров с одним персонажем, ставить товар в разные интерьеры или менять время суток на знакомой сцене.
Основные сценарии:
Каждый вызов создаёт асинхронную операцию. Сохраните её id из ответа и проверяйте статус отдельным запросом.
POST /api/v1/operationsAuthorization: Bearer brth_...id и стартовый статус queued.Отдельного переключателя режимов нет: если передать reference_images, модель опирается на референсы, если не передать - рисует только по тексту.
{
"tool": "runway-gen4-image",
"input": {
"prompt": "...",
"reference_images": [
"https://cdn.example.com/reference-1.jpg",
"https://cdn.example.com/reference-2.jpg"
],
"aspect_ratio": "4:3",
"resolution": "1080p"
}
}
tool - slug нейросети, всегда "runway-gen4-image".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
prompt | string | Да | Описание картинки: кто или что в кадре, где, какой свет и стиль. Если передаёте референсы, прямо напишите, что взять с каждого: «человек с первого референса», «пальто со второго». От 3 до 4000 символов. |
reference_images | string[] (url) | Нет | Ссылки на референсы, от 1 до 3. Форматы: jpg, jpeg, png, webp. Если поле не передано или массив пустой, картинка создаётся только по тексту. |
aspect_ratio | enum | Да | Соотношение сторон результата. Варианты: 1:1 - квадрат, 16:9 - горизонталь, 9:16 - вертикаль для сторис, 4:3 - горизонталь, 3:4 - вертикаль. Если не передать, будет 4:3. |
resolution | enum | Да | Разрешение результата. 1080p - высокое, 720p - стандартное и дешевле. Если не передать, будет 1080p. |
Для reference_images нужны внешние http/https ссылки, которые открываются без авторизации. Размер одного файла - до 128 МБ.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "runway-gen4-image",
"input": {
"prompt": "Маленький книжный магазин на углу старой улицы в дождливый вечер, тёплый свет в витрине, отражения фонарей в лужах, реалистичная фотография",
"aspect_ratio": "16:9",
"resolution": "1080p"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'runway-gen4-image',
input: {
prompt: 'Маленький книжный магазин на углу старой улицы в дождливый вечер, тёплый свет в витрине, отражения фонарей в лужах, реалистичная фотография',
aspect_ratio: '16:9',
resolution: '1080p',
},
}),
})
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': 'runway-gen4-image',
'input': {
'prompt': 'Маленький книжный магазин на углу старой улицы в дождливый вечер, тёплый свет в витрине, отражения фонарей в лужах, реалистичная фотография',
'aspect_ratio': '16:9',
'resolution': '1080p',
},
},
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": "runway-gen4-image",
"input": {
"prompt": "Этот же человек с референса сидит в уютной кофейне у окна с чашкой капучино, вечер, тёплый свет ламп, реалистичная фотография",
"reference_images": [
"https://cdn.example.com/reference-1.png"
],
"aspect_ratio": "16:9",
"resolution": "720p"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'runway-gen4-image',
input: {
prompt: 'Этот же человек с референса сидит в уютной кофейне у окна с чашкой капучино, вечер, тёплый свет ламп, реалистичная фотография',
reference_images: [
'https://cdn.example.com/reference-1.png',
],
aspect_ratio: '16:9',
resolution: '720p',
},
}),
})
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': 'runway-gen4-image',
'input': {
'prompt': 'Этот же человек с референса сидит в уютной кофейне у окна с чашкой капучино, вечер, тёплый свет ламп, реалистичная фотография',
'reference_images': [
'https://cdn.example.com/reference-1.png',
],
'aspect_ratio': '16:9',
'resolution': '720p',
},
},
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": "runway-gen4-image",
"input": {
"prompt": "Девушка с первого референса в пальто со второго референса идёт по улице из третьего референса, осенний день, съёмка в полный рост",
"reference_images": [
"https://cdn.example.com/reference-1.jpg",
"https://cdn.example.com/reference-2.jpg",
"https://cdn.example.com/reference-3.webp"
],
"aspect_ratio": "3:4",
"resolution": "1080p"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'runway-gen4-image',
input: {
prompt: 'Девушка с первого референса в пальто со второго референса идёт по улице из третьего референса, осенний день, съёмка в полный рост',
reference_images: [
'https://cdn.example.com/reference-1.jpg',
'https://cdn.example.com/reference-2.jpg',
'https://cdn.example.com/reference-3.webp',
],
aspect_ratio: '3:4',
resolution: '1080p',
},
}),
})
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': 'runway-gen4-image',
'input': {
'prompt': 'Девушка с первого референса в пальто со второго референса идёт по улице из третьего референса, осенний день, съёмка в полный рост',
'reference_images': [
'https://cdn.example.com/reference-1.jpg',
'https://cdn.example.com/reference-2.jpg',
'https://cdn.example.com/reference-3.webp',
],
'aspect_ratio': '3:4',
'resolution': '1080p',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "runway-gen4-image",
"cost": 8,
"balance_after": 492,
"created_at": "2026-09-30T19:50:36.759732+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "runway-gen4-image",
"cost": 8,
"created_at": "2026-09-30T19:50:36.759732+00:00",
"completed_at": "2026-09-30T19:53:10.125197+00:00",
"result": {
"type": "image",
"urls": [
"https://storage.bratuha.ru/results/runway-gen4-image/image-1.png"
]
},
"error_message": null
}
{
"id": "op_uuid-123",
"status": "failed",
"tool": "runway-gen4-image",
"cost": 8,
"created_at": "2026-09-30T19:50:36.759732+00:00",
"completed_at": "2026-09-30T19:50:51.402118+00:00",
"result": null,
"error_message": "Ваш запрос не прошел модерацию."
}
Сохраните id из ответа на создание и запрашивайте статус операции по нему:
GET /api/v1/operations/{id}
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/op_uuid-123
async function waitForResult(id: string) {
while (true) {
const response = await fetch(`https://bratuha.ru/api/v1/operations/${id}`, {
headers: { Authorization: 'Bearer brth_ваш_ключ' },
})
const operation = await response.json()
if (operation.status === 'completed' || operation.status === 'failed') {
return operation
}
await new Promise((resolve) => setTimeout(resolve, 5000))
}
}
Статус меняется с queued на processing, а затем на completed или failed. Обычно картинка готова меньше чем за минуту, но иногда генерация занимает 2-3 минуты. Опрашивать одну операцию можно не чаще раза в секунду, разумный интервал - 3-5 секунд.
После завершения в result приходит:
{
"type": "image",
"urls": [
"https://storage.bratuha.ru/results/runway-gen4-image/image-1.png"
]
}
type - всегда "image".urls - массив с одной ссылкой на готовое изображение в формате PNG.Размер зависит от resolution и aspect_ratio: например, 16:9 в 720p приходит размером 1280 × 720 пикселей.
Цена фиксирована за одно изображение и зависит только от разрешения. Число референсов, пропорции и длина задания на цену не влияют.
resolution | Цена |
|---|---|
1080p | 12 ₽ |
720p | 8 ₽ |
Стоимость списывается при создании операции и приходит в поле cost ответа.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую оплаченную операцию. Если ответ потерялся, не повторяйте запрос вслепую.queued, результат забирается по id.http/https URL на файлы jpg, jpeg, png или webp.failed и сообщением «Ваш запрос не прошел модерацию.»