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

# Commencer avec l’API Midjourney

> Démarrage rapide pour l’API Midjourney sur CometAPI : soumettez /mj/submit/imagine, interrogez /mj/task/{id}/fetch, puis utilisez /mj/submit/action et les boutons modaux.

## Comprendre le concept de base

L’API MidJourney **simule les interactions avec les boutons de Discord**. Contrairement aux API REST classiques, elle fonctionne comme une **machine à états** où chaque opération renvoie de nouveaux boutons pour l’étape suivante.

### Les 4 API principales

| API                                                                                      | Objectif                                            | Quand l’utiliser                                             |
| ---------------------------------------------------------------------------------------- | --------------------------------------------------- | ------------------------------------------------------------ |
| [`POST /mj/submit/imagine`](/api/image/midjourney/imagine)                               | Génération de texte en image                        | Point de départ de tous les workflows                        |
| [`GET /mj/task/\{id\}/fetch`](/api/image/midjourney/task-fetching-api/fetch-single-task) | Consulter l’état de la tâche et obtenir les boutons | Après chaque soumission (interroger jusqu’à la fin)          |
| [`POST /mj/submit/action`](/api/image/midjourney/action)                                 | Cliquer sur un bouton (upscale, vary, zoom, etc.)   | Lorsque vous souhaitez effectuer une opération sur une image |
| [`POST /mj/submit/modal`](/api/image/midjourney/modal)                                   | Soumettre une entrée supplémentaire                 | Uniquement lorsque le statut est `MODAL`                     |

***

## Diagramme complet du workflow

```
┌─────────────────────────────────────────────────────────────────────────────┐
│                         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       │
           └──────────────────┘
```

***

## Concept clé : boutons et customId

Chaque tâche réussie renvoie un tableau `buttons`. Chaque bouton possède un `customId` que vous utilisez pour déclencher l’action suivante.

**Exemple de réponse de `/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` n’est pas une valeur fixe. Il change pour chaque tâche. Récupérez-le toujours à partir du tableau `buttons`.
</Warning>

***

## Référence des boutons par étape

### Après IMAGINE (image en grille 4)

Ces boutons sont renvoyés lorsque votre génération d’image initiale est terminée :

| Button | customId Pattern                | Action                    | Result                           |
| ------ | ------------------------------- | ------------------------- | -------------------------------- |
| U1-U4  | `MJ::JOB::upsample::1::xxx`     | Agrandir une image unique | Image unique en haute résolution |
| V1-V4  | `MJ::JOB::variation::1::xxx`    | Générer des variations    | Nouvelle grille 4                |
| 🔄     | `MJ::JOB::reroll::0::xxx::SOLO` | Régénérer l’ensemble      | Nouvelle grille 4                |

### Après UPSCALE (image unique)

Après l’agrandissement, vous avez accès aux outils d’édition :

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

> **Note :** Les libellés des boutons et les formats de `customId` peuvent varier selon la version MJ spécifiée dans votre prompt (par ex., `--v 6.1` vs `--v 5.2`). Lisez toujours les boutons depuis la réponse de l’API.

<Warning>
  Le bouton Inpaint (Vary Region) n’apparaît qu’après Upscale.
</Warning>

***

## Exemple complet : générer et agrandir

### Étape 1 : Soumettre une requête 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"] }
  }'
```

**Réponse :**

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

### Étape 2 : Interroger le statut de la tâche

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

**Réponse (une fois terminée) :**

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

### Étape 3 : Cliquer sur U1 pour agrandir

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

**Réponse :**

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

### Étape 4 : Interroger la nouvelle tâche et obtenir le résultat

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

***

## Quand Modal est-il requis ?

Lorsque vous appelez [`/mj/submit/action`](/api/image/midjourney/action) et que le statut de la tâche devient `MODAL` au lieu de `SUCCESS`, vous devez appeler [`/mj/submit/modal`](/api/image/midjourney/modal) pour fournir des informations supplémentaires.

### Opérations Modal confirmées

| Operation   | Button         | What to Submit                             |
| ----------- | -------------- | ------------------------------------------ |
| Inpaint     | Vary (Region)  | `maskBase64` (masque PNG) + `prompt`       |
| Custom Zoom | 🔍 Custom Zoom | `prompt` (par ex., "your prompt --zoom 2") |

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

***

## Sélection du mode de vitesse

Ajoutez le préfixe de vitesse au chemin :

| Mode  | Préfixe de chemin | Exemple                       |
| ----- | ----------------- | ----------------------------- |
| Fast  | `/mj-fast`        | `/mj-fast/mj/submit/imagine`  |
| Turbo | `/mj-turbo`       | `/mj-turbo/mj/submit/imagine` |
| Relax | (par défaut)      | `/mj/submit/imagine`          |

***

## Autres points d'entrée

Ces API sont des **points d'entrée indépendants** qui ne suivent pas le flux imagine → action :

| API                                                            | Objectif                               |
| -------------------------------------------------------------- | -------------------------------------- |
| [`POST /mj/submit/blend`](/api/image/midjourney/blend)         | Fusionner 2 à 5 images en une seule    |
| [`POST /mj/submit/describe`](/api/image/midjourney/describe)   | Générer un prompt à partir d'une image |
| [`POST /mj/submit/video`](/api/image/midjourney/submit-video)  | Convertir une image en vidéo           |
| [`POST /mj/submit/edits`](/api/image/midjourney/submit-editor) | Modifier une image avec un masque      |

***

## Conseils de dépannage

D'après la conception de l'API et le workflow, voici les problèmes courants que vous pouvez rencontrer :

| Problème                                      | Cause probable                                    | Solution                                                                                                                                          |
| --------------------------------------------- | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| Impossible de trouver le bouton Vary (Region) | Vous regardez une image en grille 4               | Effectuez d'abord un upscale (cliquez sur U1-U4), puis vérifiez les boutons                                                                       |
| Statut de tâche bloqué sur `MODAL`            | L'opération nécessite une entrée supplémentaire   | Appelez [`/mj/submit/modal`](/api/image/midjourney/modal) avec les données requises                                                               |
| `customId` ne fonctionne pas                  | Vous utilisez une valeur obsolète ou codée en dur | Récupérez toujours un `customId` récent depuis la réponse de [`/mj/task/\{id\}/fetch`](/api/image/midjourney/task-fetching-api/fetch-single-task) |
| Tableau `buttons` vide                        | La tâche est toujours en cours                    | Attendez `status: "SUCCESS"` avant d'accéder aux boutons                                                                                          |
