Hopp til hovedinnhold

🎯 Forstå kjernekonseptet

MidJourney API simulerer Discord-knappeinteraksjoner. I motsetning til typiske REST API-er fungerer det som en state machine der hver operasjon returnerer nye knapper for neste steg.

De 4 kjerne-API-ene

APIFormålNår det brukes
POST /mj/submit/imagineTekst-til-bilde-genereringStartpunktet for alle arbeidsflyter
GET /mj/task/\{id\}/fetchHent task-status og få knapperEtter hver innsending (poll til den er ferdig)
POST /mj/submit/actionKlikk på en knapp (upscale, vary, zoom osv.)Når du vil utføre en handling på et bilde
POST /mj/submit/modalSend inn ekstra inputKun når status er MODAL

📊 Komplett arbeidsflytdiagram

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

🔑 Nøkkelkonsept: Buttons og customId

Hver vellykkede task returnerer en buttons-array. Hver knapp har en customId som du bruker for å utløse neste handling. Eksempelrespons fra /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": "🔄" }
  ]
}
⚠️ Viktig: customId er IKKE en fast verdi. Den endres for hver task. Hent den alltid fra buttons-arrayen.

📋 Knappeoversikt etter trinn

Etter IMAGINE (4-ruters bilde)

Disse knappene returneres når den opprinnelige bildegenereringen er fullført:
ButtoncustomId PatternActionResult
U1-U4MJ::JOB::upsample::1::xxxOppskaler enkeltbildeEnkeltbilde i høy oppløsning
V1-V4MJ::JOB::variation::1::xxxGenerer variasjonerNytt 4-ruters bilde
🔄MJ::JOB::reroll::0::xxx::SOLOGenerer alle på nyttNytt 4-ruters bilde

Etter UPSCALE (enkeltbilde)

Etter oppskalering får du tilgang til redigeringsverktøy:
LabelNeeds Modal?
Upscale (Subtle) / Upscale (2x)❌ Nei
Upscale (Creative) / Upscale (4x)❌ Nei
Vary (Subtle) 🪄❌ Nei
Vary (Strong) 🪄❌ Nei
Vary (Region) 🖌️✅ Ja (maske)
Zoom Out 2x / 1.5x 🔍❌ Nei
Custom Zoom 🔍✅ Ja (prompt)
⬅️➡️⬆️⬇️ Pan❌ Nei
Animate 🎞️❌ Nei
🔄 Reroll❌ Nei
Merk: Knappetekster og customId-formater kan variere avhengig av MJ-versjonen som er angitt i prompten din (f.eks. --v 6.1 vs --v 5.2). Les alltid knappene fra API-responsen.
⚠️ Inpaint-knappen (Vary Region) vises kun etter Upscale!

⚡ Fullstendig eksempel: Generer og oppskaler

Trinn 1: Send Imagine-forespørsel

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

Trinn 2: Poll oppgavestatus

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

Trinn 3: Klikk U1 for å oppskalere

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

Trinn 4: Poll den nye oppgaven og hent resultatet

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

⚠️ Når kreves Modal?

Når du kaller /mj/submit/action og oppgavestatusen blir MODAL i stedet for SUCCESS, må du kalle /mj/submit/modal for å oppgi ekstra input.

Bekreftede Modal-operasjoner

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

🚀 Valg av hastighetsmodus

Legg til hastighetsprefiks i stien:
ModusStiprefiksEksempel
Fast/mj-fast/mj-fast/mj/submit/imagine
Turbo/mj-turbo/mj-turbo/mj/submit/imagine
Relax(standard)/mj/submit/imagine

🔗 Andre inngangspunkter

Disse API-ene er uavhengige inngangspunkter som ikke følger imagine → action-flyten:
APIFormål
POST /mj/submit/blendBland 2–5 bilder til ett
POST /mj/submit/describeGenerer prompt fra bilde
POST /mj/submit/videoKonverter bilde til video
POST /mj/submit/editsRediger bilde med maske

❓ Feilsøkingstips

Basert på API-designet og arbeidsflyten, her er vanlige problemer du kan støte på:
ProblemSannsynlig årsakLøsning
Finner ikke Vary (Region)-knappenSer på et 4-ruters bildeUpscale først (klikk U1-U4), og sjekk deretter knappene
Oppgavestatus sitter fast på MODALOperasjonen krever ekstra inputKall /mj/submit/modal med nødvendige data
customId fungerer ikkeBruker en utdatert eller hardkodet verdiHent alltid en ny customId fra svaret til /mj/task/\{id\}/fetch
Tom buttons-arrayOppgaven er fortsatt under behandlingVent på status: "SUCCESS" før du bruker knappene