Vai al contenuto principale

🎯 Comprendere il concetto fondamentale

L’API MidJourney simula le interazioni dei pulsanti di Discord. A differenza delle tipiche API REST, funziona come una macchina a stati in cui ogni operazione restituisce nuovi pulsanti per il passaggio successivo.

Le 4 API fondamentali

APIScopoQuando usarla
POST /mj/submit/imagineGenerazione di immagini da testoPunto di partenza per tutti i workflow
GET /mj/task/\{id\}/fetchVerificare lo stato del task e ottenere i pulsantiDopo ogni submit (interroga finché non è completato)
POST /mj/submit/actionFare clic su un pulsante (upscale, vary, zoom, ecc.)Quando vuoi eseguire un’operazione su un’immagine
POST /mj/submit/modalInviare input aggiuntivoSolo quando lo stato è MODAL

📊 Diagramma completo del 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       │
           └──────────────────┘

🔑 Concetto chiave: pulsanti e customId

Ogni task completato con successo restituisce un array buttons. Ogni pulsante ha un customId che usi per attivare l’azione successiva. Esempio di risposta da /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": "🔄" }
  ]
}
⚠️ Importante: customId NON è un valore fisso. Cambia per ogni task. Ottienilo sempre dall’array buttons.

📋 Riferimento pulsanti per fase

Dopo IMAGINE (immagine in griglia 4)

Questi pulsanti vengono restituiti quando la generazione iniziale dell’immagine è completata:
ButtoncustomId PatternActionResult
U1-U4MJ::JOB::upsample::1::xxxUpscale immagine singolaImmagine singola ad alta risoluzione
V1-V4MJ::JOB::variation::1::xxxGenera variazioniNuova griglia 4
🔄MJ::JOB::reroll::0::xxx::SOLORigenera tuttoNuova griglia 4

Dopo UPSCALE (immagine singola)

Dopo l’upscaling, ottieni l’accesso agli strumenti di modifica:
LabelNeeds Modal?
Upscale (Subtle) / Upscale (2x)❌ No
Upscale (Creative) / Upscale (4x)❌ No
Vary (Subtle) 🪄❌ No
Vary (Strong) 🪄❌ No
Vary (Region) 🖌️✅ Sì (mask)
Zoom Out 2x / 1.5x 🔍❌ No
Custom Zoom 🔍✅ Sì (prompt)
⬅️➡️⬆️⬇️ Pan❌ No
Animate 🎞️❌ No
🔄 Reroll❌ No
Nota: Le etichette dei pulsanti e i formati customId possono variare a seconda della versione MJ specificata nel tuo prompt (ad esempio, --v 6.1 vs --v 5.2). Leggi sempre i pulsanti dalla risposta dell’API.
⚠️ Il pulsante Inpaint (Vary Region) appare solo dopo Upscale!

⚡ Esempio completo: genera & upscale

Passaggio 1: invia la richiesta 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"] }
  }'
Risposta:
{ "code": 1, "result": "1768464763141701" }

Passaggio 2: interroga lo stato del task

curl -X GET 'https://api.cometapi.com/mj/task/1768464763141701/fetch' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>'
Risposta (quando completata):
{
  "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" },
    ...
  ]
}

Passaggio 3: fai clic su U1 per eseguire l’upscale

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"
  }'
Risposta:
{ "code": 1, "result": "1768464800000000" }

Passaggio 4: interroga il nuovo task e ottieni il risultato

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

⚠️ Quando è richiesto Modal?

Quando chiami /mj/submit/action e lo stato del task diventa MODAL invece di SUCCESS, devi chiamare /mj/submit/modal per fornire input aggiuntivo.

Operazioni Modal confermate

OperationButtonWhat to Submit
InpaintVary (Region)maskBase64 (PNG mask) + prompt
Custom Zoom🔍 Custom Zoomprompt (ad esempio, “your prompt —zoom 2”)
Esempio: flusso 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,..."
  }'

🚀 Selezione della modalità Speed

Aggiungi il prefisso della velocità al path:
ModalitàPrefisso pathEsempio
Fast/mj-fast/mj-fast/mj/submit/imagine
Turbo/mj-turbo/mj-turbo/mj/submit/imagine
Relax(predefinito)/mj/submit/imagine

🔗 Altri punti di ingresso

Queste API sono punti di ingresso indipendenti che non seguono il flusso imagine → action:
APIScopo
POST /mj/submit/blendUnisci da 2 a 5 immagini in una sola
POST /mj/submit/describeGenera un prompt da un’immagine
POST /mj/submit/videoConverte un’immagine in un video
POST /mj/submit/editsModifica un’immagine con una maschera

❓ Suggerimenti per il troubleshooting

In base al design dell’API e al workflow, ecco alcuni problemi comuni che potresti riscontrare:
ProblemaCausa probabileSoluzione
Impossibile trovare il pulsante Vary (Region)Si sta visualizzando l’immagine in griglia 4Esegui prima l’upscale (fai clic su U1-U4), poi controlla i pulsanti
Stato del task bloccato su MODALL’operazione richiede input aggiuntiviChiama /mj/submit/modal con i dati richiesti
customId non funzionaSi sta usando un valore obsoleto o hardcodedOttieni sempre un customId aggiornato dalla risposta di /mj/task/\{id\}/fetch
Array buttons vuotoIl task è ancora in corsoAttendi status: "SUCCESS" prima di accedere ai pulsanti