Midjourney API
Midjourney - одна из самых узнаваемых моделей для художественных изображений: портреты, концепт-арт, интерьеры, паттерны, иллюстрации в стилях от фотореализма до аниме. Через API доступны три режима: генерация по тексту с референсами и тонкими настройками (imagine), смешивание нескольких картинок (blend) и редактирование одной (edits). За один запуск модель возвращает четыре варианта.
Увеличение и ремикс готового результата работают с задачей из вашей истории и доступны только в форме на сайте. Каждый вызов создаёт асинхронную операцию: вы получаете id, а результат забираете отдельным запросом статуса.
Создание операции
- Endpoint:
POST /api/v1/operations
- Авторизация:
Authorization: Bearer brth_...
- Запрос создаёт операцию и сразу возвращает
id и стартовый статус queued.
- Выполнение асинхронное: обычно 1-3 минуты.
Режимы, которые доступны через API:
imagine - изображения по тексту, при желании с референсами и настройками стиля.
blend - смешивание от 2 до 4 картинок в одну.
edits - редактирование одной картинки по описанию.
Тело запроса
{
"tool": "midjourney",
"input": {
"...": "..."
}
}
tool - slug нейросети, здесь всегда "midjourney".
input - параметры конкретного запуска.
- Все поля передаются напрямую внутри
input, без дополнительного вложенного объекта input.
Параметры
| Параметр | Тип | Обязательный | Описание |
|---|
generation_type | enum | Нет | Режим: imagine (если не передать), blend или edits. |
speed | enum | Нет | Скорость обработки: relax (если не передать, 7 ₽), fast (8 ₽) или turbo (14 ₽). |
imagine.prompt | string | Нет | Задание для imagine, от 3 до 4000 символов; обязательно в этом режиме. Передаётся как объект: "imagine": { "prompt": "..." }. |
imagine.image_urls | string[] (url) | Нет | До 4 картинок-референсов для imagine. Только http/https, форматы .jpg, .jpeg, .png, .webp. |
edits.prompt | string | Нет | Что изменить, от 3 до 4000 символов; обязательно в режиме edits. |
edits.image_url | string (url) | Нет | Картинка для редактирования; обязательна в режиме edits. |
blend.image_urls | string[] (url) | Нет | От 2 до 4 картинок для смешивания; обязательно в режиме blend. |
blend.dimensions | enum | Нет | Формат результата в blend: SQUARE (если не передать), PORTRAIT или LANDSCAPE. |
blend.size | string | Нет | Свои пропорции для blend в виде 16:9; если задано, важнее blend.dimensions. |
mj.size | enum | Нет | Пропорции для imagine и edits: (если не передать), , , , , , , . Передаётся как объект: . |
Примеры запросов
Сценарий 1. Изображение по тексту
cURL
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "midjourney",
"input": {
"generation_type": "imagine",
"speed": "relax",
"imagine": {
"prompt": "Портрет пожилого рыбака с обветренным лицом на фоне северного моря, кинематографичный свет"
},
"mj": {
"size": "2:3",
"version": "8.2",
"stylize": 250
}
}
}'
JavaScript / TypeScript
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"tool": "midjourney",
"input": {
"generation_type": "imagine",
"speed": "relax",
"imagine": {
"prompt": "Портрет пожилого рыбака с обветренным лицом на фоне северного моря, кинематографичный свет"
},
"mj": {
"size": "2:3",
"version": "8.2",
"stylize": 250
}
}
}),
})
const data = await response.json()
Python
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
"tool": "midjourney",
"input": {
"generation_type": "imagine",
"speed": "relax",
"imagine": {
"prompt": "Портрет пожилого рыбака с обветренным лицом на фоне северного моря, кинематографичный свет"
},
"mj": {
"size": "2:3",
"version": "8.2",
"stylize": 250
}
}
},
timeout=30,
)
print(response.status_code)
print(response.json())
Сценарий 2. С референсами и негативным промптом
cURL
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "midjourney",
"input": {
"generation_type": "imagine",
"speed": "fast",
"imagine": {
"prompt": "Тот же персонаж в зимнем лесу, мягкий свет",
"image_urls": [
"https://cdn.example.com/source-image-1.jpg",
"https://cdn.example.com/source-image-2.jpg"
]
},
"mj": {
"size": "16:9",
"iw": 2,
"negative_prompt": "текст, водяные знаки"
},
"use_negative_prompt": true
}
}'
JavaScript / TypeScript
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"tool": "midjourney",
"input": {
"generation_type": "imagine",
"speed": "fast",
"imagine": {
"prompt": "Тот же персонаж в зимнем лесу, мягкий свет",
"image_urls": [
"https://cdn.example.com/source-image-1.jpg",
"https://cdn.example.com/source-image-2.jpg"
]
},
"mj": {
"size": "16:9",
"iw": 2,
"negative_prompt": "текст, водяные знаки"
},
"use_negative_prompt": true
}
}),
})
const data = await response.json()
Python
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
"tool": "midjourney",
"input": {
"generation_type": "imagine",
"speed": "fast",
"imagine": {
"prompt": "Тот же персонаж в зимнем лесу, мягкий свет",
"image_urls": [
"https://cdn.example.com/source-image-1.jpg",
"https://cdn.example.com/source-image-2.jpg"
]
},
"mj": {
"size": "16:9",
"iw": 2,
"negative_prompt": "текст, водяные знаки"
},
"use_negative_prompt": True
}
},
timeout=30,
)
print(response.status_code)
print(response.json())
Сценарий 3. Референс стиля
cURL
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "midjourney",
"input": {
"generation_type": "imagine",
"imagine": {
"prompt": "Уютная кофейня на углу улицы, дождь, тёплый свет"
},
"use_sref": true,
"mj": {
"sref": "https://cdn.example.com/source-image-1.jpg",
"sw": 300,
"size": "4:3"
}
}
}'
JavaScript / TypeScript
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"tool": "midjourney",
"input": {
"generation_type": "imagine",
"imagine": {
"prompt": "Уютная кофейня на углу улицы, дождь, тёплый свет"
},
"use_sref": true,
"mj": {
"sref": "https://cdn.example.com/source-image-1.jpg",
"sw": 300,
"size": "4:3"
}
}
}),
})
const data = await response.json()
Python
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
"tool": "midjourney",
"input": {
"generation_type": "imagine",
"imagine": {
"prompt": "Уютная кофейня на углу улицы, дождь, тёплый свет"
},
"use_sref": True,
"mj": {
"sref": "https://cdn.example.com/source-image-1.jpg",
"sw": 300,
"size": "4:3"
}
}
},
timeout=30,
)
print(response.status_code)
print(response.json())
Сценарий 4. Смешивание картинок
cURL
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "midjourney",
"input": {
"generation_type": "blend",
"blend": {
"image_urls": [
"https://cdn.example.com/source-image-1.jpg",
"https://cdn.example.com/source-image-2.jpg"
],
"dimensions": "LANDSCAPE"
},
"speed": "relax"
}
}'
JavaScript / TypeScript
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"tool": "midjourney",
"input": {
"generation_type": "blend",
"blend": {
"image_urls": [
"https://cdn.example.com/source-image-1.jpg",
"https://cdn.example.com/source-image-2.jpg"
],
"dimensions": "LANDSCAPE"
},
"speed": "relax"
}
}),
})
const data = await response.json()
Python
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
"tool": "midjourney",
"input": {
"generation_type": "blend",
"blend": {
"image_urls": [
"https://cdn.example.com/source-image-1.jpg",
"https://cdn.example.com/source-image-2.jpg"
],
"dimensions": "LANDSCAPE"
},
"speed": "relax"
}
},
timeout=30,
)
print(response.status_code)
print(response.json())
Сценарий 5. Редактирование картинки
cURL
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "midjourney",
"input": {
"generation_type": "edits",
"edits": {
"prompt": "Замени фон на закатное побережье, сохрани человека и одежду",
"image_url": "https://cdn.example.com/source-image-1.jpg"
},
"mj": {
"size": "3:2"
}
}
}'
JavaScript / TypeScript
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"tool": "midjourney",
"input": {
"generation_type": "edits",
"edits": {
"prompt": "Замени фон на закатное побережье, сохрани человека и одежду",
"image_url": "https://cdn.example.com/source-image-1.jpg"
},
"mj": {
"size": "3:2"
}
}
}),
})
const data = await response.json()
Python
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
"tool": "midjourney",
"input": {
"generation_type": "edits",
"edits": {
"prompt": "Замени фон на закатное побережье, сохрани человека и одежду",
"image_url": "https://cdn.example.com/source-image-1.jpg"
},
"mj": {
"size": "3:2"
}
}
},
timeout=30,
)
print(response.status_code)
print(response.json())
Примеры ответов
Ответ после создания
{
"id": "op_uuid-123",
"status": "queued",
"tool": "midjourney",
"cost": 7,
"balance_after": 495,
"created_at": "2026-09-17T12:00:00Z"
}
Ответ после завершения
{
"id": "op_uuid-123",
"status": "completed",
"tool": "midjourney",
"cost": 7,
"created_at": "2026-09-17T12:00:00Z",
"completed_at": "2026-09-17T12:02:10Z",
"result": {
"type": "image",
"urls": [
"https://storage.bratuha.ru/results/midjourney/image-1.png",
"https://storage.bratuha.ru/results/midjourney/image-2.png",
"https://storage.bratuha.ru/results/midjourney/image-3.png",
"https://storage.bratuha.ru/results/midjourney/image-4.png"
]
},
"error_message": null
}
Ответ с ошибкой
{
"id": "op_uuid-123",
"status": "failed",
"tool": "midjourney",
"cost": 7,
"created_at": "2026-09-17T12:00:00Z",
"completed_at": "2026-09-17T12:00:20Z",
"result": null,
"error_message": "Произошла ошибка в параметрах вашего запроса. Пожалуйста, проверьте корректность введённых данных и попробуйте снова."
}
Проверка статуса
После создания операции сохраните id и проверяйте её статус запросом:
GET /api/v1/operations/{id}
cURL
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/op_uuid-123
JavaScript / TypeScript
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. Опрашивайте статус раз в 5-10 секунд.
Формат результата
После успешного завершения result содержит четыре варианта изображения:
{
"type": "image",
"urls": [
"https://storage.bratuha.ru/results/midjourney/image-1.png",
"https://storage.bratuha.ru/results/midjourney/image-2.png",
"https://storage.bratuha.ru/results/midjourney/image-3.png",
"https://storage.bratuha.ru/results/midjourney/image-4.png"
]
}
type всегда равен "image".
urls - массив ссылок на PNG, обычно четыре варианта одного задания.
Ценообразование
- Цена за одно задание зависит только от
speed: 7 ₽ за relax, 8 ₽ за fast, 14 ₽ за turbo.
- Режим, версия, качество, референсы и число вариантов на цену не влияют.
- Сумма списывается при создании операции и видна в поле
cost ответа. Если операция завершилась с ошибкой, деньги возвращаются на баланс автоматически.
Ограничения и практические заметки
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую операцию и списывает деньги.
- Операция выполняется асинхронно: после
queued проверяйте статус по id.
- Для файлов подходят только внешние
http/https ссылки, без localhost и приватных адресов. HEIC/HEIF принимаются только при загрузке через форму сайта, по URL в API - нет.
- Параметры с точкой в названии - это вложенные объекты в JSON:
mj.size передаётся как "mj": { "size": "16:9" }, imagine.prompt - как "imagine": { "prompt": "..." }.
- Негативный промпт и референсы стиля, персонажа и глубины включаются флагами
use_negative_prompt, use_sref, use_cref, use_dref: без true в флаге соответствующее поле игнорируется.
- Niji работает только с
mj.version: "6". Референс персонажа (mj.cref) - только с версиями 6.1 и 6. Комбинации с другими версиями возвращают failed с ошибкой параметров, деньги за такую операцию возвращаются.
- Модель периодически отклоняет задания на этапе обработки; повторный запрос с теми же параметрами, как правило, проходит.
- В
blend нужно от 2 до 4 картинок; одна ссылка вернёт validation_error.