> ## Documentation Index
> Fetch the complete documentation index at: https://apidoc.cometapi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Початок роботи з Midjourney API

> Швидкий старт для Midjourney API на CometAPI: надішліть /mj/submit/imagine, опитуйте /mj/task/{id}/fetch, потім використовуйте /mj/submit/action і modal-кнопки.

## Розуміння основної концепції

MidJourney API **імітує взаємодії з кнопками Discord**. На відміну від типових REST API, він працює як **машина станів**, де кожна операція повертає нові кнопки для наступного кроку.

### 4 основні API

| API                                                                                      | Призначення                                  | Коли використовувати                                    |
| ---------------------------------------------------------------------------------------- | -------------------------------------------- | ------------------------------------------------------- |
| [`POST /mj/submit/imagine`](/api/image/midjourney/imagine)                               | Генерація зображення з тексту                | Точка входу для всіх workflow                           |
| [`GET /mj/task/\{id\}/fetch`](/api/image/midjourney/task-fetching-api/fetch-single-task) | Запит статусу задачі та отримання кнопок     | Після кожного submit (опитуйте, доки не буде завершено) |
| [`POST /mj/submit/action`](/api/image/midjourney/action)                                 | Натискання кнопки (upscale, vary, zoom тощо) | Коли ви хочете виконати дію із зображенням              |
| [`POST /mj/submit/modal`](/api/image/midjourney/modal)                                   | Надсилання додаткового вводу                 | Лише коли status дорівнює `MODAL`                       |

***

## Повна схема workflow

```
┌─────────────────────────────────────────────────────────────────────────────┐
│                         MIDJOURNEY API WORKFLOW                             │
└─────────────────────────────────────────────────────────────────────────────┘

  ┌──────────────────┐
  │  POST /submit/   │  ← Крок 1: Надішліть prompt, отримайте task_id
  │     imagine      │
  └────────┬─────────┘
           │ Returns: { "result": "task_id_1" }
           ▼
  ┌──────────────────┐
  │ GET /task/{id}/  │  ← Крок 2: Опитуйте, доки status = "SUCCESS"
  │      fetch       │
  └────────┬─────────┘
           │ Returns: imageUrl + buttons[] (U1,U2,U3,U4,V1,V2,V3,V4,🔄)
           ▼
  ┌──────────────────┐
  │  POST /submit/   │  ← Крок 3: Натисніть кнопку за допомогою customId
  │     action       │
  └────────┬─────────┘
           │ Returns: { "result": "task_id_2" }
           ▼
  ┌──────────────────┐
  │ GET /task/{id}/  │  ← Крок 4: Опитуйте нову задачу
  │      fetch       │
  └────────┬─────────┘
           │
           ├─── status = "SUCCESS" → Готово! Отримайте imageUrl
           │
           └─── status = "MODAL" → Потрібен додатковий ввід (див. Крок 5)
                      │
                      ▼
           ┌──────────────────┐
           │  POST /submit/   │  ← Крок 5: Надішліть mask/prompt для спеціальних операцій
           │      modal       │
           └────────┬─────────┘
                    │ Returns: { "result": "task_id_3" }
                    ▼
           ┌──────────────────┐
           │ GET /task/{id}/  │  ← Крок 6: Опитуйте, доки не буде SUCCESS
           │      fetch       │
           └──────────────────┘
```

***

## Ключова концепція: Buttons і customId

Кожна успішно виконана задача повертає масив `buttons`. Кожна кнопка має `customId`, який ви використовуєте для запуску наступної дії.

**Приклад відповіді від `/mj/task/\{id\}/fetch`:**

```json theme={null}
{
  "status": "SUCCESS",
  "imageUrl": "https://api.cometapi.com/mj/image/xxx",
  "buttons": [
    { "customId": "MJ::JOB::upsample::1::abc123", "label": "U1" },
    { "customId": "MJ::JOB::upsample::2::abc123", "label": "U2" },
    { "customId": "MJ::JOB::variation::1::abc123", "label": "V1" },
    { "customId": "MJ::JOB::reroll::0::abc123", "emoji": "🔄" }
  ]
}
```

<Warning>
  `customId` не є фіксованим значенням. Він змінюється для кожної задачі. Завжди отримуйте його з масиву `buttons`.
</Warning>

***

## Довідник кнопок за етапами

### Після IMAGINE (зображення 4-grid)

Ці кнопки повертаються, коли завершується початкова генерація зображення:

| Button | customId Pattern                | Action                      | Result                                         |
| ------ | ------------------------------- | --------------------------- | ---------------------------------------------- |
| U1-U4  | `MJ::JOB::upsample::1::xxx`     | Збільшити окреме зображення | Окреме зображення високої роздільної здатності |
| V1-V4  | `MJ::JOB::variation::1::xxx`    | Згенерувати варіації        | Новий 4-grid                                   |
| 🔄     | `MJ::JOB::reroll::0::xxx::SOLO` | Перегенерувати все          | Новий 4-grid                                   |

### Після UPSCALE (окреме зображення)

Після збільшення ви отримуєте доступ до інструментів редагування:

| Label                             | Needs Modal?   |
| --------------------------------- | -------------- |
| Upscale (Subtle) / Upscale (2x)   | ❌ Ні           |
| Upscale (Creative) / Upscale (4x) | ❌ Ні           |
| Vary (Subtle) 🪄                  | ❌ Ні           |
| Vary (Strong) 🪄                  | ❌ Ні           |
| Vary (Region) 🖌️                 | ✅ Так (mask)   |
| Zoom Out 2x / 1.5x 🔍             | ❌ Ні           |
| Custom Zoom 🔍                    | ✅ Так (prompt) |
| ⬅️➡️⬆️⬇️ Pan                      | ❌ Ні           |
| Animate 🎞️                       | ❌ Ні           |
| 🔄 Reroll                         | ❌ Ні           |

> **Примітка:** Мітки кнопок і формати `customId` можуть відрізнятися залежно від версії MJ, вказаної у вашому prompt (наприклад, `--v 6.1` проти `--v 5.2`). Завжди зчитуйте кнопки з відповіді API.

<Warning>
  Кнопка Inpaint (Vary Region) з’являється лише після Upscale.
</Warning>

***

## Повний приклад: генерація та Upscale

### Крок 1: Надішліть запит imagine

```bash theme={null}
curl -X POST 'https://api.cometapi.com/mj/submit/imagine' \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "botType": "MID_JOURNEY",
    "prompt": "a cute cat --v 6.1",
    "accountFilter": { "modes": ["FAST"] }
  }'
```

**Відповідь:**

```json theme={null}
{ "code": 1, "result": "1768464763141701" }
```

### Крок 2: Опитуйте статус завдання

```bash theme={null}
curl -X GET 'https://api.cometapi.com/mj/task/1768464763141701/fetch' \
  -H "Authorization: Bearer $COMETAPI_KEY"
```

**Відповідь (коли завершено):**

```json theme={null}
{
  "status": "SUCCESS",
  "imageUrl": "https://api.cometapi.com/mj/image/1768464763141701",
  "buttons": [
    { "customId": "MJ::JOB::upsample::1::5f20922e-xxx", "label": "U1" },
    { "customId": "MJ::JOB::upsample::2::5f20922e-xxx", "label": "U2" },
    ...
  ]
}
```

### Крок 3: Натисніть U1 для Upscale

```bash theme={null}
curl -X POST 'https://api.cometapi.com/mj/submit/action' \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "taskId": "1768464763141701",
    "customId": "MJ::JOB::upsample::1::5f20922e-xxx"
  }'
```

**Відповідь:**

```json theme={null}
{ "code": 1, "result": "1768464800000000" }
```

### Крок 4: Опитуйте нове завдання та отримайте результат

```bash theme={null}
curl -X GET 'https://api.cometapi.com/mj/task/1768464800000000/fetch' \
  -H "Authorization: Bearer $COMETAPI_KEY"
```

***

## Коли потрібен Modal?

Коли ви викликаєте [`/mj/submit/action`](/api/image/midjourney/action) і статус завдання стає `MODAL` замість `SUCCESS`, ви повинні викликати [`/mj/submit/modal`](/api/image/midjourney/modal), щоб надати додаткові дані.

### Підтверджені операції Modal

| Operation   | Button         | What to Submit                               |
| ----------- | -------------- | -------------------------------------------- |
| Inpaint     | Vary (Region)  | `maskBase64` (PNG mask) + `prompt`           |
| Custom Zoom | 🔍 Custom Zoom | `prompt` (наприклад, "your prompt --zoom 2") |

**Приклад: потік Inpaint**

```bash theme={null}
# 1. Click Vary (Region) button via Action API
curl -X POST 'https://api.cometapi.com/mj/submit/action' \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"taskId": "xxx", "customId": "MJ::Inpaint::xxx", "enableRemix": true}'

# 2. Poll and see status = "MODAL"
curl -X GET 'https://api.cometapi.com/mj/task/new_task_id/fetch'
# Response: { "status": "MODAL" }

# 3. Submit mask and prompt via Modal API
curl -X POST 'https://api.cometapi.com/mj/submit/modal' \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "taskId": "new_task_id",
    "prompt": "replace with golden crown",
    "maskBase64": "data:image/png;base64,..."
  }'
```

***

## Вибір режиму швидкості

Додайте префікс швидкості до шляху:

| Режим | Префікс шляху      | Приклад                       |
| ----- | ------------------ | ----------------------------- |
| Fast  | `/mj-fast`         | `/mj-fast/mj/submit/imagine`  |
| Turbo | `/mj-turbo`        | `/mj-turbo/mj/submit/imagine` |
| Relax | (за замовчуванням) | `/mj/submit/imagine`          |

***

## Інші точки входу

Ці API є **незалежними точками входу**, які не дотримуються потоку imagine → action:

| API                                                            | Призначення                              |
| -------------------------------------------------------------- | ---------------------------------------- |
| [`POST /mj/submit/blend`](/api/image/midjourney/blend)         | Змішати 2-5 зображень в одне             |
| [`POST /mj/submit/describe`](/api/image/midjourney/describe)   | Згенерувати prompt із зображення         |
| [`POST /mj/submit/video`](/api/image/midjourney/submit-video)  | Перетворити зображення на відео          |
| [`POST /mj/submit/edits`](/api/image/midjourney/submit-editor) | Редагувати зображення за допомогою маски |

***

## Поради з усунення проблем

На основі дизайну API та робочого процесу, ось поширені проблеми, з якими ви можете зіткнутися:

| Проблема                                | Імовірна причина                                           | Рішення                                                                                                                                 |
| --------------------------------------- | ---------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| Не вдається знайти кнопку Vary (Region) | Ви дивитеся на зображення у вигляді сітки 4                | Спочатку виконайте upscale (натисніть U1-U4), потім перевірте кнопки                                                                    |
| Статус завдання завис на `MODAL`        | Операція потребує додаткового вводу                        | Викличте [`/mj/submit/modal`](/api/image/midjourney/modal) з потрібними даними                                                          |
| `customId` не працює                    | Використовується застаріле або жорстко закодоване значення | Завжди отримуйте актуальний `customId` з відповіді [`/mj/task/\{id\}/fetch`](/api/image/midjourney/task-fetching-api/fetch-single-task) |
| Порожній масив `buttons`                | Завдання все ще виконується                                | Дочекайтеся `status: "SUCCESS"` перед доступом до кнопок                                                                                |
