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

# Erste Schritte mit der Midjourney API

> Schnellstart für die Midjourney API auf CometAPI: `/mj/submit/imagine` senden, `/mj/task/{id}/fetch` abfragen und dann `/mj/submit/action` sowie Modal-Buttons verwenden.

## Das Kernkonzept verstehen

Die MidJourney API **simuliert Discord-Button-Interaktionen**. Im Gegensatz zu typischen REST-APIs arbeitet sie als **Zustandsmaschine**, bei der jede Operation neue Buttons für den nächsten Schritt zurückgibt.

### Die 4 Kern-APIs

| API                                                                                      | Zweck                                           | Wann verwenden                                |
| ---------------------------------------------------------------------------------------- | ----------------------------------------------- | --------------------------------------------- |
| [`POST /mj/submit/imagine`](/api/image/midjourney/imagine)                               | Text-zu-Bild-Generierung                        | Ausgangspunkt für alle Workflows              |
| [`GET /mj/task/\{id\}/fetch`](/api/image/midjourney/task-fetching-api/fetch-single-task) | Task-Status abfragen und Buttons erhalten       | Nach jedem Submit (pollen, bis abgeschlossen) |
| [`POST /mj/submit/action`](/api/image/midjourney/action)                                 | Einen Button klicken (upscale, vary, zoom usw.) | Wenn du ein Bild bearbeiten möchtest          |
| [`POST /mj/submit/modal`](/api/image/midjourney/modal)                                   | Zusätzliche Eingaben übermitteln                | Nur wenn der Status `MODAL` ist               |

***

## Vollständiges Workflow-Diagramm

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

  ┌──────────────────┐
  │  POST /submit/   │  ← Step 1: Submit prompt, get task_id
  │     imagine      │
  └────────┬─────────┘
           │ Returns: { "result": "task_id_1" }
           ▼
  ┌──────────────────┐
  │ GET /task/{id}/  │  ← Step 2: Poll until status = "SUCCESS"
  │      fetch       │
  └────────┬─────────┘
           │ Returns: imageUrl + buttons[] (U1,U2,U3,U4,V1,V2,V3,V4,🔄)
           ▼
  ┌──────────────────┐
  │  POST /submit/   │  ← Step 3: Click a button using customId
  │     action       │
  └────────┬─────────┘
           │ Returns: { "result": "task_id_2" }
           ▼
  ┌──────────────────┐
  │ GET /task/{id}/  │  ← Step 4: Poll the new task
  │      fetch       │
  └────────┬─────────┘
           │
           ├─── status = "SUCCESS" → Done! Get imageUrl
           │
           └─── status = "MODAL" → Need additional input (see Step 5)
                      │
                      ▼
           ┌──────────────────┐
           │  POST /submit/   │  ← Step 5: Submit mask/prompt for special operations
           │      modal       │
           └────────┬─────────┘
                    │ Returns: { "result": "task_id_3" }
                    ▼
           ┌──────────────────┐
           │ GET /task/{id}/  │  ← Step 6: Poll until SUCCESS
           │      fetch       │
           └──────────────────┘
```

***

## Schlüsselkonzept: Buttons und customId

Jeder erfolgreiche Task gibt ein `buttons`-Array zurück. Jeder Button hat eine `customId`, die du verwendest, um die nächste Aktion auszulösen.

**Beispielantwort von `/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` ist kein fester Wert. Er ändert sich bei jedem Task. Hole ihn immer aus dem `buttons`-Array.
</Warning>

***

## Button-Referenz nach Phase

### Nach IMAGINE (4er-Bildraster)

Diese Buttons werden zurückgegeben, wenn deine anfängliche Bildgenerierung abgeschlossen ist:

| Button | customId Pattern                | Action                       | Result                            |
| ------ | ------------------------------- | ---------------------------- | --------------------------------- |
| U1-U4  | `MJ::JOB::upsample::1::xxx`     | Einzelnes Bild hochskalieren | Einzelnes Bild in hoher Auflösung |
| V1-V4  | `MJ::JOB::variation::1::xxx`    | Variationen generieren       | Neues 4er-Bildraster              |
| 🔄     | `MJ::JOB::reroll::0::xxx::SOLO` | Alles neu generieren         | Neues 4er-Bildraster              |

### Nach UPSCALE (einzelnes Bild)

Nach dem Hochskalieren erhältst du Zugriff auf Bearbeitungswerkzeuge:

| Label                             | Needs Modal?  |
| --------------------------------- | ------------- |
| Upscale (Subtle) / Upscale (2x)   | ❌ Nein        |
| Upscale (Creative) / Upscale (4x) | ❌ Nein        |
| Vary (Subtle) 🪄                  | ❌ Nein        |
| Vary (Strong) 🪄                  | ❌ Nein        |
| Vary (Region) 🖌️                 | ✅ Ja (Maske)  |
| Zoom Out 2x / 1.5x 🔍             | ❌ Nein        |
| Custom Zoom 🔍                    | ✅ Ja (Prompt) |
| ⬅️➡️⬆️⬇️ Pan                      | ❌ Nein        |
| Animate 🎞️                       | ❌ Nein        |
| 🔄 Reroll                         | ❌ Nein        |

> **Hinweis:** Button-Beschriftungen und `customId`-Formate können je nach der in deinem Prompt angegebenen MJ-Version variieren (z. B. `--v 6.1` vs `--v 5.2`). Lies die Buttons immer aus der API-Antwort aus.

<Warning>
  Der Inpaint-Button (Vary Region) erscheint erst nach Upscale.
</Warning>

***

## Vollständiges Beispiel: Generieren und hochskalieren

### Schritt 1: Imagine-Anfrage absenden

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

**Antwort:**

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

### Schritt 2: Task-Status abfragen

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

**Antwort (wenn abgeschlossen):**

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

### Schritt 3: Auf U1 klicken, um hochzuskalieren

```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"
  }'
```

**Antwort:**

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

### Schritt 4: Neuen Task abfragen und Ergebnis abrufen

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

***

## Wann ist Modal erforderlich?

Wenn du [`/mj/submit/action`](/api/image/midjourney/action) aufrufst und der Task-Status `MODAL` statt `SUCCESS` wird, musst du [`/mj/submit/modal`](/api/image/midjourney/modal) aufrufen, um zusätzliche Eingaben bereitzustellen.

### Bestätigte Modal-Operationen

| Operation   | Button         | What to Submit                          |
| ----------- | -------------- | --------------------------------------- |
| Inpaint     | Vary (Region)  | `maskBase64` (PNG-Maske) + `prompt`     |
| Custom Zoom | 🔍 Custom Zoom | `prompt` (z. B. "your prompt --zoom 2") |

**Beispiel: Inpaint-Ablauf**

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

***

## Auswahl des Geschwindigkeitsmodus

Fügen Sie dem Pfad ein Geschwindigkeitspräfix hinzu:

| Modus | Pfadpräfix  | Beispiel                      |
| ----- | ----------- | ----------------------------- |
| Fast  | `/mj-fast`  | `/mj-fast/mj/submit/imagine`  |
| Turbo | `/mj-turbo` | `/mj-turbo/mj/submit/imagine` |
| Relax | (Standard)  | `/mj/submit/imagine`          |

***

## Andere Einstiegspunkte

Diese APIs sind **unabhängige Einstiegspunkte**, die nicht dem imagine → action-Ablauf folgen:

| API                                                            | Zweck                              |
| -------------------------------------------------------------- | ---------------------------------- |
| [`POST /mj/submit/blend`](/api/image/midjourney/blend)         | 2–5 Bilder zu einem zusammenführen |
| [`POST /mj/submit/describe`](/api/image/midjourney/describe)   | Prompt aus Bild generieren         |
| [`POST /mj/submit/video`](/api/image/midjourney/submit-video)  | Bild in Video umwandeln            |
| [`POST /mj/submit/edits`](/api/image/midjourney/submit-editor) | Bild mit Maske bearbeiten          |

***

## Tipps zur Fehlerbehebung

Basierend auf dem API-Design und Workflow finden Sie hier häufige Probleme, auf die Sie stoßen können:

| Problem                                     | Wahrscheinliche Ursache                            | Lösung                                                                                                                                            |
| ------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| Vary (Region)-Schaltfläche nicht auffindbar | Es wird ein 4er-Bildraster angezeigt               | Zuerst hochskalieren (auf U1-U4 klicken), dann die Schaltflächen prüfen                                                                           |
| Task-Status bleibt bei `MODAL` hängen       | Der Vorgang erfordert zusätzliche Eingaben         | Rufen Sie [`/mj/submit/modal`](/api/image/midjourney/modal) mit den erforderlichen Daten auf                                                      |
| `customId` funktioniert nicht               | Veralteter oder fest codierter Wert wird verwendet | Holen Sie immer eine aktuelle `customId` aus der Antwort von [`/mj/task/\{id\}/fetch`](/api/image/midjourney/task-fetching-api/fetch-single-task) |
| Leeres `buttons`-Array                      | Task wird noch verarbeitet                         | Warten Sie auf `status: "SUCCESS"`, bevor Sie auf Schaltflächen zugreifen                                                                         |
