> ## 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.

# Memulai dengan Midjourney API

> Mulai cepat untuk Midjourney API di CometAPI: kirim /mj/submit/imagine, polling /mj/task/{id}/fetch, lalu gunakan /mj/submit/action dan tombol modal.

## Memahami konsep inti

MidJourney API **mensimulasikan interaksi tombol Discord**. Tidak seperti REST API pada umumnya, API ini bekerja sebagai **state machine** di mana setiap operasi mengembalikan tombol baru untuk langkah berikutnya.

### 4 API inti

| API                                                                                      | Tujuan                                     | Kapan digunakan                                |
| ---------------------------------------------------------------------------------------- | ------------------------------------------ | ---------------------------------------------- |
| [`POST /mj/submit/imagine`](/api/image/midjourney/imagine)                               | Pembuatan gambar dari teks                 | Titik awal untuk semua workflow                |
| [`GET /mj/task/\{id\}/fetch`](/api/image/midjourney/task-fetching-api/fetch-single-task) | Memeriksa status task & mengambil tombol   | Setelah setiap submit (polling sampai selesai) |
| [`POST /mj/submit/action`](/api/image/midjourney/action)                                 | Menekan tombol (upscale, vary, zoom, dll.) | Saat Anda ingin melakukan operasi pada gambar  |
| [`POST /mj/submit/modal`](/api/image/midjourney/modal)                                   | Mengirim input tambahan                    | Hanya ketika status adalah `MODAL`             |

***

## Diagram workflow lengkap

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

  ┌──────────────────┐
  │  POST /submit/   │  ← Langkah 1: Kirim prompt, dapatkan task_id
  │     imagine      │
  └────────┬─────────┘
           │ Returns: { "result": "task_id_1" }
           ▼
  ┌──────────────────┐
  │ GET /task/{id}/  │  ← Langkah 2: Polling sampai status = "SUCCESS"
  │      fetch       │
  └────────┬─────────┘
           │ Returns: imageUrl + buttons[] (U1,U2,U3,U4,V1,V2,V3,V4,🔄)
           ▼
  ┌──────────────────┐
  │  POST /submit/   │  ← Langkah 3: Tekan tombol menggunakan customId
  │     action       │
  └────────┬─────────┘
           │ Returns: { "result": "task_id_2" }
           ▼
  ┌──────────────────┐
  │ GET /task/{id}/  │  ← Langkah 4: Polling task baru
  │      fetch       │
  └────────┬─────────┘
           │
           ├─── status = "SUCCESS" → Selesai! Dapatkan imageUrl
           │
           └─── status = "MODAL" → Perlu input tambahan (lihat Langkah 5)
                      │
                      ▼
           ┌──────────────────┐
           │  POST /submit/   │  ← Langkah 5: Kirim mask/prompt untuk operasi khusus
           │      modal       │
           └────────┬─────────┘
                    │ Returns: { "result": "task_id_3" }
                    ▼
           ┌──────────────────┐
           │ GET /task/{id}/  │  ← Langkah 6: Polling sampai SUCCESS
           │      fetch       │
           └──────────────────┘
```

***

## Konsep utama: Buttons dan customId

Setiap task yang berhasil akan mengembalikan array `buttons`. Setiap tombol memiliki `customId` yang Anda gunakan untuk memicu aksi berikutnya.

**Contoh respons dari `/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` bukan nilai tetap. Nilainya berubah untuk setiap task. Selalu ambil nilainya dari array `buttons`.
</Warning>

***

## Referensi tombol berdasarkan tahap

### Setelah IMAGINE (gambar 4-grid)

Tombol-tombol ini dikembalikan ketika pembuatan gambar awal Anda selesai:

| Button | Pola customId                   | Tindakan               | Hasil                          |
| ------ | ------------------------------- | ---------------------- | ------------------------------ |
| U1-U4  | `MJ::JOB::upsample::1::xxx`     | Upscale gambar tunggal | Gambar tunggal resolusi tinggi |
| V1-V4  | `MJ::JOB::variation::1::xxx`    | Buat variasi           | 4-grid baru                    |
| 🔄     | `MJ::JOB::reroll::0::xxx::SOLO` | Hasilkan ulang semua   | 4-grid baru                    |

### Setelah UPSCALE (gambar tunggal)

Setelah upscale, Anda mendapatkan akses ke alat pengeditan:

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

> **Catatan:** Label tombol dan format `customId` dapat berbeda tergantung pada versi MJ yang ditentukan dalam prompt Anda (misalnya, `--v 6.1` vs `--v 5.2`). Selalu baca tombol dari respons API.

<Warning>
  Tombol Inpaint (Vary Region) hanya muncul setelah Upscale.
</Warning>

***

## Contoh lengkap: Generate dan upscale

### Langkah 1: Kirim permintaan 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"] }
  }'
```

**Respons:**

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

### Langkah 2: Poll status task

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

**Respons (saat selesai):**

```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" },
    ...
  ]
}
```

### Langkah 3: Klik U1 untuk 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"
  }'
```

**Respons:**

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

### Langkah 4: Poll task baru dan dapatkan hasil

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

***

## Kapan Modal diperlukan?

Saat Anda memanggil [`/mj/submit/action`](/api/image/midjourney/action) dan status task menjadi `MODAL` alih-alih `SUCCESS`, Anda harus memanggil [`/mj/submit/modal`](/api/image/midjourney/modal) untuk memberikan input tambahan.

### Operasi Modal yang terkonfirmasi

| Operation   | Button         | Yang harus dikirim                          |
| ----------- | -------------- | ------------------------------------------- |
| Inpaint     | Vary (Region)  | `maskBase64` (mask PNG) + `prompt`          |
| Custom Zoom | 🔍 Custom Zoom | `prompt` (misalnya, "your prompt --zoom 2") |

**Contoh: alur 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,..."
  }'
```

***

## Pemilihan mode kecepatan

Tambahkan prefiks kecepatan ke path:

| Mode  | Prefiks Path | Contoh                        |
| ----- | ------------ | ----------------------------- |
| Cepat | `/mj-fast`   | `/mj-fast/mj/submit/imagine`  |
| Turbo | `/mj-turbo`  | `/mj-turbo/mj/submit/imagine` |
| Relax | (default)    | `/mj/submit/imagine`          |

***

## Titik masuk lainnya

API ini adalah **titik masuk independen** yang tidak mengikuti alur imagine → action:

| API                                                            | Tujuan                            |
| -------------------------------------------------------------- | --------------------------------- |
| [`POST /mj/submit/blend`](/api/image/midjourney/blend)         | Gabungkan 2-5 gambar menjadi satu |
| [`POST /mj/submit/describe`](/api/image/midjourney/describe)   | Hasilkan prompt dari gambar       |
| [`POST /mj/submit/video`](/api/image/midjourney/submit-video)  | Ubah gambar menjadi video         |
| [`POST /mj/submit/edits`](/api/image/midjourney/submit-editor) | Edit gambar dengan mask           |

***

## Tips pemecahan masalah

Berdasarkan desain API dan alur kerjanya, berikut adalah masalah umum yang mungkin Anda temui:

| Masalah                                    | Kemungkinan penyebab                                | Solusi                                                                                                                            |
| ------------------------------------------ | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| Tidak dapat menemukan tombol Vary (Region) | Melihat gambar 4-grid                               | Lakukan upscale terlebih dahulu (klik U1-U4), lalu periksa tombol                                                                 |
| Status task macet di `MODAL`               | Operasi memerlukan input tambahan                   | Panggil [`/mj/submit/modal`](/api/image/midjourney/modal) dengan data yang diperlukan                                             |
| `customId` tidak berfungsi                 | Menggunakan nilai yang sudah usang atau di-hardcode | Selalu ambil `customId` terbaru dari respons [`/mj/task/\{id\}/fetch`](/api/image/midjourney/task-fetching-api/fetch-single-task) |
| Array `buttons` kosong                     | Task masih berlangsung                              | Tunggu hingga `status: "SUCCESS"` sebelum mengakses tombol                                                                        |
