Saltar para o conteúdo principal

🎯 Entenda o Conceito Central

A API do MidJourney simula interações de botões do Discord. Diferentemente das APIs REST típicas, ela funciona como uma máquina de estados, em que cada operação retorna novos botões para a próxima etapa.

As 4 APIs Principais

APIFinalidadeQuando usar
POST /mj/submit/imagineGeração de texto para imagemPonto de partida para todos os fluxos
GET /mj/task/\{id\}/fetchConsultar status da tarefa e obter botõesApós cada envio (consulte até concluir)
POST /mj/submit/actionClicar em um botão (upscale, vary, zoom etc.)Quando quiser operar em uma imagem
POST /mj/submit/modalEnviar entrada adicionalSomente quando o status for MODAL

📊 Diagrama Completo do Fluxo

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

🔑 Conceito-chave: Botões e customId

Toda tarefa bem-sucedida retorna um array buttons. Cada botão tem um customId que você usa para acionar a próxima ação. Exemplo de resposta 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": "🔄" }
  ]
}
⚠️ Importante: customId NÃO é um valor fixo. Ele muda a cada tarefa. Sempre obtenha-o a partir do array buttons.

📋 Referência de Botões por Etapa

Após IMAGINE (imagem em grade 4x)

Estes botões são retornados quando sua geração inicial de imagem é concluída:
ButtoncustomId PatternActionResult
U1-U4MJ::JOB::upsample::1::xxxAmpliar imagem únicaImagem única em alta resolução
V1-V4MJ::JOB::variation::1::xxxGerar variaçõesNova grade 4x
🔄MJ::JOB::reroll::0::xxx::SOLORegenerar tudoNova grade 4x

Após UPSCALE (imagem única)

Após o upscaling, você passa a ter acesso às ferramentas de edição:
LabelNeeds Modal?
Upscale (Subtle) / Upscale (2x)❌ Não
Upscale (Creative) / Upscale (4x)❌ Não
Vary (Subtle) 🪄❌ Não
Vary (Strong) 🪄❌ Não
Vary (Region) 🖌️✅ Sim (máscara)
Zoom Out 2x / 1.5x 🔍❌ Não
Custom Zoom 🔍✅ Sim (prompt)
⬅️➡️⬆️⬇️ Pan❌ Não
Animate 🎞️❌ Não
🔄 Reroll❌ Não
Nota: Os rótulos dos botões e os formatos de customId podem variar dependendo da versão do MJ especificada no seu prompt (por exemplo, --v 6.1 vs --v 5.2). Sempre leia os botões a partir da resposta da API.
⚠️ O botão Inpaint (Vary Region) só aparece após Upscale!

⚡ Exemplo Completo: Gerar & Ampliar

Etapa 1: Enviar requisição 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"] }
  }'
Resposta:
{ "code": 1, "result": "1768464763141701" }

Etapa 2: Consultar o status da tarefa

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

Etapa 3: Clicar em U1 para ampliar

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

Etapa 4: Consultar a nova tarefa e obter o resultado

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

⚠️ Quando o Modal é necessário?

Quando você chama /mj/submit/action e o status da tarefa se torna MODAL em vez de SUCCESS, você deve chamar /mj/submit/modal para fornecer entrada adicional.

Operações com Modal confirmadas

OperationButtonWhat to Submit
InpaintVary (Region)maskBase64 (máscara PNG) + prompt
Custom Zoom🔍 Custom Zoomprompt (por exemplo, “your prompt —zoom 2”)
Exemplo: Fluxo de 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,..."
  }'

🚀 Seleção do Modo de Velocidade

Adicione o prefixo de velocidade ao caminho:
ModoPrefixo do CaminhoExemplo
Rápido/mj-fast/mj-fast/mj/submit/imagine
Turbo/mj-turbo/mj-turbo/mj/submit/imagine
Relax(padrão)/mj/submit/imagine

🔗 Outros Pontos de Entrada

Estas APIs são pontos de entrada independentes que não seguem o fluxo imagine → action:
APIFinalidade
POST /mj/submit/blendMescla de 2 a 5 imagens em uma
POST /mj/submit/describeGera um prompt a partir de uma imagem
POST /mj/submit/videoConverte imagem em vídeo
POST /mj/submit/editsEdita imagem com máscara

❓ Dicas de Solução de Problemas

Com base no design da API e no fluxo de trabalho, aqui estão alguns problemas comuns que você pode encontrar:
ProblemaCausa ProvávelSolução
Não consegue encontrar o botão Vary (Region)Visualizando uma imagem em grade 4Faça o upscale primeiro (clique em U1-U4) e depois verifique os botões
Status da tarefa travado em MODALA operação requer entrada adicionalChame /mj/submit/modal com os dados necessários
customId não funcionaUso de valor desatualizado ou fixo no códigoSempre obtenha um customId novo na resposta de /mj/task/\{id\}/fetch
Array buttons vazioA tarefa ainda está em andamentoAguarde status: "SUCCESS" antes de acessar os botões