Passer au contenu principal

🎯 Comprendre le concept de base

L’API MidJourney simule les interactions avec les boutons 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

APIObjectifQuand l’utiliser
POST /mj/submit/imagineGénération de texte vers imagePoint de départ de tous les workflows
GET /mj/task/\{id\}/fetchVérifier le statut de la tâche et récupérer les boutonsAprès chaque soumission (interrogez jusqu’à la fin)
POST /mj/submit/actionCliquer sur un bouton (upscale, vary, zoom, etc.)Lorsque vous voulez agir sur une image
POST /mj/submit/modalEnvoyer une entrée supplémentaireUniquement lorsque le statut est MODAL

📊 Schéma 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 :
{
  "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": "🔄" }
  ]
}
⚠️ Important : customId n’est PAS une valeur fixe. Il change pour chaque tâche. Récupérez-le toujours depuis le tableau buttons.

📋 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 :
ButtoncustomId PatternActionResult
U1-U4MJ::JOB::upsample::1::xxxUpscaler une image uniqueImage unique en haute résolution
V1-V4MJ::JOB::variation::1::xxxGénérer des variationsNouvelle grille de 4
🔄MJ::JOB::reroll::0::xxx::SOLORégénérer l’ensembleNouvelle grille de 4

Après UPSCALE (image unique)

Après l’upscale, vous avez accès aux outils d’édition :
LabelNeeds Modal?
Upscale (Subtle) / Upscale (2x)❌ Non
Upscale (Creative) / Upscale (4x)❌ Non
Vary (Subtle) 🪄❌ Non
Vary (Strong) 🪄❌ Non
Vary (Region) 🖌️✅ Oui (mask)
Zoom Out 2x / 1.5x 🔍❌ Non
Custom Zoom 🔍✅ Oui (prompt)
⬅️➡️⬆️⬇️ Pan❌ Non
Animate 🎞️❌ Non
🔄 Reroll❌ Non
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.
⚠️ Le bouton Inpaint (Vary Region) n’apparaît qu’après Upscale !

⚡ Exemple complet : générer et upscaler

Étape 1 : soumettre une requête Imagine

curl -X POST 'https://api.cometapi.com/mj/submit/imagine' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "botType": "MID_JOURNEY",
    "prompt": "a cute cat --v 6.1",
    "accountFilter": { "modes": ["FAST"] }
  }'
Réponse :
{ "code": 1, "result": "1768464763141701" }

Étape 2 : interroger le statut de la tâche

curl -X GET 'https://api.cometapi.com/mj/task/1768464763141701/fetch' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>'
Réponse (une fois terminée) :
{
  "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 upscaler

curl -X POST 'https://api.cometapi.com/mj/submit/action' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "taskId": "1768464763141701",
    "customId": "MJ::JOB::upsample::1::5f20922e-xxx"
  }'
Réponse :
{ "code": 1, "result": "1768464800000000" }

Étape 4 : interroger la nouvelle tâche et récupérer le résultat

curl -X GET 'https://api.cometapi.com/mj/task/1768464800000000/fetch' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>'

⚠️ Quand Modal est-il requis ?

Lorsque vous appelez /mj/submit/action et que le statut de la tâche devient MODAL au lieu de SUCCESS, vous devez appeler /mj/submit/modal pour fournir des données supplémentaires.

Opérations Modal confirmées

OperationButtonWhat to Submit
InpaintVary (Region)maskBase64 (masque PNG) + prompt
Custom Zoom🔍 Custom Zoomprompt (par ex., “your prompt —zoom 2”)
Exemple : flux Inpaint
# 1. Click Vary (Region) button via Action API
curl -X POST 'https://api.cometapi.com/mj/submit/action' \
  -H 'Authorization: Bearer <YOUR_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 <YOUR_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 un préfixe de vitesse au chemin :
ModePréfixe de cheminExemple
Rapide/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 :
APIUtilité
POST /mj/submit/blendFusionner 2 à 5 images en une seule
POST /mj/submit/describeGénérer un prompt à partir d’une image
POST /mj/submit/videoConvertir une image en vidéo
POST /mj/submit/editsModifier une image avec un masque

❓ Conseils de dépannage

D’après la conception et le workflow de l’API, voici les problèmes courants que vous pouvez rencontrer :
ProblèmeCause probableSolution
Impossible de trouver le bouton Vary (Region)Affichage de l’image en grille 4Effectuez d’abord un Upscale (cliquez sur U1-U4), puis vérifiez les boutons
Statut de tâche bloqué à MODALL’opération nécessite une entrée supplémentaireAppelez /mj/submit/modal avec les données requises
customId ne fonctionne pasUtilisation d’une valeur obsolète ou codée en durRécupérez toujours un customId récent depuis la réponse de /mj/task/\{id\}/fetch
Tableau buttons videLa tâche est toujours en coursAttendez status: "SUCCESS" avant d’accéder aux boutons