Naar hoofdinhoud gaan

🎯 Begrijp het kernconcept

De MidJourney API simuleert Discord-knopinteracties. In tegenstelling tot typische REST API’s werkt deze als een statusmachine waarbij elke bewerking nieuwe knoppen teruggeeft voor de volgende stap.

De 4 kern-API’s

APIDoelWanneer te gebruiken
POST /mj/submit/imagineTekst-naar-afbeeldinggeneratieStartpunt voor alle workflows
GET /mj/task/\{id\}/fetchTaskstatus opvragen en knoppen ophalenNa elke submit (poll tot voltooid)
POST /mj/submit/actionOp een knop klikken (upscale, vary, zoom, enz.)Wanneer je een bewerking op een afbeelding wilt uitvoeren
POST /mj/submit/modalExtra invoer versturenAlleen wanneer de status MODAL is

📊 Compleet workflowdiagram

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

🔑 Kernconcept: Buttons & customId

Elke succesvolle task geeft een buttons-array terug. Elke knop heeft een customId die je gebruikt om de volgende actie te triggeren. Voorbeeldresponse van /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": "🔄" }
  ]
}
⚠️ Belangrijk: customId is GEEN vaste waarde. Deze verandert voor elke task. Haal deze altijd op uit de buttons-array.

📋 Knoppenreferentie per fase

Na IMAGINE (4-grid afbeelding)

Deze knoppen worden teruggegeven wanneer je initiële afbeeldingsgeneratie is voltooid:
ButtoncustomId PatternActionResult
U1-U4MJ::JOB::upsample::1::xxxAfzonderlijke afbeelding upscalenEnkele afbeelding in hoge resolutie
V1-V4MJ::JOB::variation::1::xxxVariaties genererenNieuwe 4-grid
🔄MJ::JOB::reroll::0::xxx::SOLOAlles opnieuw genererenNieuwe 4-grid

Na UPSCALE (enkele afbeelding)

Na het upscalen krijg je toegang tot bewerkingstools:
LabelNeeds Modal?
Upscale (Subtle) / Upscale (2x)❌ Nee
Upscale (Creative) / Upscale (4x)❌ Nee
Vary (Subtle) 🪄❌ Nee
Vary (Strong) 🪄❌ Nee
Vary (Region) 🖌️✅ Ja (masker)
Zoom Out 2x / 1.5x 🔍❌ Nee
Custom Zoom 🔍✅ Ja (prompt)
⬅️➡️⬆️⬇️ Pan❌ Nee
Animate 🎞️❌ Nee
🔄 Reroll❌ Nee
Opmerking: Knoplabels en customId-indelingen kunnen variëren afhankelijk van de MJ-versie die in je prompt is opgegeven (bijv. --v 6.1 vs --v 5.2). Lees knoppen altijd uit de API-respons.
⚠️ De Inpaint-knop (Vary Region) verschijnt alleen na Upscale!

⚡ Volledig voorbeeld: Genereren & upscalen

Stap 1: Imagine-request indienen

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"] }
  }'
Respons:
{ "code": 1, "result": "1768464763141701" }

Stap 2: Taakstatus pollen

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

Stap 3: Klik op U1 om te upscalen

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

Stap 4: Poll de nieuwe taak en haal het resultaat op

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

⚠️ Wanneer is Modal vereist?

Wanneer je /mj/submit/action aanroept en de taakstatus MODAL wordt in plaats van SUCCESS, moet je /mj/submit/modal aanroepen om extra invoer te geven.

Bevestigde Modal-bewerkingen

OperationButtonWhat to Submit
InpaintVary (Region)maskBase64 (PNG-masker) + prompt
Custom Zoom🔍 Custom Zoomprompt (bijv. “your prompt —zoom 2”)
Voorbeeld: Inpaint-flow
# 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,..."
  }'

🚀 Snelheidsmodusselectie

Voeg een snelheidsprefix toe aan het pad:
ModusPadprefixVoorbeeld
Snel/mj-fast/mj-fast/mj/submit/imagine
Turbo/mj-turbo/mj-turbo/mj/submit/imagine
Relax(standaard)/mj/submit/imagine

🔗 Andere toegangspunten

Deze API’s zijn onafhankelijke toegangspunten die niet de imagine → action-flow volgen:
APIDoel
POST /mj/submit/blendMeng 2-5 afbeeldingen tot één
POST /mj/submit/describeGenereer prompt uit een afbeelding
POST /mj/submit/videoZet afbeelding om naar video
POST /mj/submit/editsBewerk afbeelding met masker

❓ Tips voor probleemoplossing

Op basis van het API-ontwerp en de workflow zijn dit veelvoorkomende problemen die je kunt tegenkomen:
ProbleemWaarschijnlijke oorzaakOplossing
Kan de knop Vary (Region) niet vindenJe kijkt naar een 4-grid-afbeeldingEerst Upscale uitvoeren (klik op U1-U4), controleer daarna de knoppen
Taakstatus blijft hangen op MODALDe bewerking vereist extra invoerRoep /mj/submit/modal aan met de vereiste gegevens
customId werkt nietJe gebruikt een verouderde of hardcoded waardeHaal altijd een nieuwe customId op uit het antwoord van /mj/task/\{id\}/fetch
Lege buttons-arrayTaak is nog bezigWacht op status: "SUCCESS" voordat je buttons benadert