Saltar al contenido principal

🎯 Comprende el concepto central

La API de MidJourney simula interacciones de botones de Discord. A diferencia de las API REST típicas, funciona como una máquina de estados donde cada operación devuelve nuevos botones para el siguiente paso.

Las 4 APIs principales

APIPropósitoCuándo usarla
POST /mj/submit/imagineGeneración de texto a imagenPunto de partida para todos los flujos de trabajo
GET /mj/task/\{id\}/fetchConsultar el estado de la tarea y obtener botonesDespués de cada envío (consulta hasta que termine)
POST /mj/submit/actionHacer clic en un botón (upscale, vary, zoom, etc.)Cuando quieras operar sobre una imagen
POST /mj/submit/modalEnviar entrada adicionalSolo cuando el estado es MODAL

📊 Diagrama completo del flujo de trabajo

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

🔑 Concepto clave: botones y customId

Cada tarea completada con éxito devuelve un arreglo buttons. Cada botón tiene un customId que usas para activar la siguiente acción. Ejemplo de respuesta 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 NO es un valor fijo. Cambia en cada tarea. Obténlo siempre del arreglo buttons.

📋 Referencia de botones por etapa

Después de IMAGINE (imagen de cuadrícula 4-grid)

Estos botones se devuelven cuando se completa la generación inicial de tu imagen:
ButtoncustomId PatternActionResult
U1-U4MJ::JOB::upsample::1::xxxMejorar una sola imagenImagen individual en alta resolución
V1-V4MJ::JOB::variation::1::xxxGenerar variacionesNueva cuadrícula 4-grid
🔄MJ::JOB::reroll::0::xxx::SOLORegenerar todoNueva cuadrícula 4-grid

Después de UPSCALE (imagen individual)

Después de hacer upscale, obtienes acceso a herramientas de edición:
LabelNeeds Modal?
Upscale (Subtle) / Upscale (2x)❌ No
Upscale (Creative) / Upscale (4x)❌ No
Vary (Subtle) 🪄❌ No
Vary (Strong) 🪄❌ No
Vary (Region) 🖌️✅ Sí (máscara)
Zoom Out 2x / 1.5x 🔍❌ No
Custom Zoom 🔍✅ Sí (prompt)
⬅️➡️⬆️⬇️ Pan❌ No
Animate 🎞️❌ No
🔄 Reroll❌ No
Nota: Las etiquetas de los botones y los formatos de customId pueden variar según la versión de MJ especificada en tu prompt (por ejemplo, --v 6.1 frente a --v 5.2). Lee siempre los botones desde la respuesta de la API.
⚠️ ¡El botón Inpaint (Vary Region) solo aparece después de Upscale!

⚡ Ejemplo completo: generar y hacer upscale

Paso 1: Enviar solicitud 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"] }
  }'
Respuesta:
{ "code": 1, "result": "1768464763141701" }

Paso 2: Consultar el estado de la tarea

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

Paso 3: Hacer clic en U1 para hacer 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"
  }'
Respuesta:
{ "code": 1, "result": "1768464800000000" }

Paso 4: Consultar la nueva tarea y obtener el resultado

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

⚠️ ¿Cuándo se requiere Modal?

Cuando llamas a /mj/submit/action y el estado de la tarea pasa a ser MODAL en lugar de SUCCESS, debes llamar a /mj/submit/modal para proporcionar información adicional.

Operaciones con Modal confirmadas

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

🚀 Selección del modo de velocidad

Agrega el prefijo de velocidad a la ruta:
ModoPrefijo de rutaEjemplo
Rápido/mj-fast/mj-fast/mj/submit/imagine
Turbo/mj-turbo/mj-turbo/mj/submit/imagine
Relax(predeterminado)/mj/submit/imagine

🔗 Otros puntos de entrada

Estas APIs son puntos de entrada independientes que no siguen el flujo imagine → action:
APIPropósito
POST /mj/submit/blendCombina de 2 a 5 imágenes en una sola
POST /mj/submit/describeGenera un prompt a partir de una imagen
POST /mj/submit/videoConvierte una imagen en video
POST /mj/submit/editsEdita una imagen con una máscara

❓ Consejos de solución de problemas

Según el diseño de la API y el flujo de trabajo, estos son problemas comunes que puedes encontrar:
ProblemaCausa probableSolución
No se encuentra el botón Vary (Region)Se está viendo la imagen en cuadrícula 4-gridPrimero haz upscale (haz clic en U1-U4) y luego revisa los botones
Estado de tarea atascado en MODALLa operación requiere entrada adicionalLlama a /mj/submit/modal con los datos requeridos
customId no funcionaSe está usando un valor desactualizado o codificado de forma fijaObtén siempre un customId reciente de la respuesta de /mj/task/\{id\}/fetch
Arreglo buttons vacíoLa tarea sigue en progresoEspera a status: "SUCCESS" antes de acceder a los botones