> ## Documentation Index
> Fetch the complete documentation index at: https://apidoc.cometapi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Comienza con Midjourney API

> Inicio rápido para Midjourney API en CometAPI: envía /mj/submit/imagine, consulta /mj/task/{id}/fetch y luego usa /mj/submit/action y los botones modal.

## Comprende el concepto principal

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 API principales

| API                                                                                      | Propósito                                          | Cuándo usarla                                      |
| ---------------------------------------------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- |
| [`POST /mj/submit/imagine`](/api/image/midjourney/imagine)                               | Generación de texto a imagen                       | Punto de partida para todos los flujos de trabajo  |
| [`GET /mj/task/\{id\}/fetch`](/api/image/midjourney/task-fetching-api/fetch-single-task) | Consultar el estado de la tarea y obtener botones  | Después de cada envío (consulta hasta que termine) |
| [`POST /mj/submit/action`](/api/image/midjourney/action)                                 | Hacer clic en un botón (upscale, vary, zoom, etc.) | Cuando quieras operar sobre una imagen             |
| [`POST /mj/submit/modal`](/api/image/midjourney/modal)                                   | Enviar entrada adicional                           | Solo 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 array `buttons`. Cada botón tiene un `customId` que usas para activar la siguiente acción.

**Ejemplo de respuesta de `/mj/task/\{id\}/fetch`:**

```json theme={null}
{
  "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": "🔄" }
  ]
}
```

<Warning>
  `customId` no es un valor fijo. Cambia en cada tarea. Obtenlo siempre del array `buttons`.
</Warning>

***

## Referencia de botones por etapa

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

Estos botones se devuelven cuando se completa tu generación de imagen inicial:

| Button | customId Pattern                | Action                  | Result                          |
| ------ | ------------------------------- | ----------------------- | ------------------------------- |
| U1-U4  | `MJ::JOB::upsample::1::xxx`     | Ampliar una sola imagen | Imagen única en alta resolución |
| V1-V4  | `MJ::JOB::variation::1::xxx`    | Generar variaciones     | Nueva cuadrícula 4-grid         |
| 🔄     | `MJ::JOB::reroll::0::xxx::SOLO` | Regenerar todo          | Nueva cuadrícula 4-grid         |

### Después de UPSCALE (imagen única)

Después de ampliar la imagen, obtienes acceso a herramientas de edición:

| Label                             | Needs 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.

<Warning>
  El botón Inpaint (Vary Region) solo aparece después de Upscale.
</Warning>

***

## Ejemplo completo: generar y ampliar

### Paso 1: Enviar solicitud imagine

```bash theme={null}
curl -X POST 'https://api.cometapi.com/mj/submit/imagine' \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "botType": "MID_JOURNEY",
    "prompt": "a cute cat --v 6.1",
    "accountFilter": { "modes": ["FAST"] }
  }'
```

**Respuesta:**

```json theme={null}
{ "code": 1, "result": "1768464763141701" }
```

### Paso 2: Consultar el estado de la tarea

```bash theme={null}
curl -X GET 'https://api.cometapi.com/mj/task/1768464763141701/fetch' \
  -H "Authorization: Bearer $COMETAPI_KEY"
```

**Respuesta (cuando se completa):**

```json theme={null}
{
  "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 ampliar

```bash theme={null}
curl -X POST 'https://api.cometapi.com/mj/submit/action' \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "taskId": "1768464763141701",
    "customId": "MJ::JOB::upsample::1::5f20922e-xxx"
  }'
```

**Respuesta:**

```json theme={null}
{ "code": 1, "result": "1768464800000000" }
```

### Paso 4: Consultar la nueva tarea y obtener el resultado

```bash theme={null}
curl -X GET 'https://api.cometapi.com/mj/task/1768464800000000/fetch' \
  -H "Authorization: Bearer $COMETAPI_KEY"
```

***

## ¿Cuándo se requiere Modal?

Cuando llamas a [`/mj/submit/action`](/api/image/midjourney/action) y el estado de la tarea pasa a ser `MODAL` en lugar de `SUCCESS`, debes llamar a [`/mj/submit/modal`](/api/image/midjourney/modal) para proporcionar entrada adicional.

### Operaciones con Modal confirmadas

| Operation   | Button         | What to Submit                            |
| ----------- | -------------- | ----------------------------------------- |
| Inpaint     | Vary (Region)  | `maskBase64` (máscara PNG) + `prompt`     |
| Custom Zoom | 🔍 Custom Zoom | `prompt` (p. ej., "your prompt --zoom 2") |

**Ejemplo: flujo de Inpaint**

```bash theme={null}
# 1. Click Vary (Region) button via Action API
curl -X POST 'https://api.cometapi.com/mj/submit/action' \
  -H "Authorization: Bearer $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 $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:

| Modo   | Prefijo de ruta  | Ejemplo                       |
| ------ | ---------------- | ----------------------------- |
| 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:

| API                                                            | Propósito                             |
| -------------------------------------------------------------- | ------------------------------------- |
| [`POST /mj/submit/blend`](/api/image/midjourney/blend)         | Combinar de 2 a 5 imágenes en una     |
| [`POST /mj/submit/describe`](/api/image/midjourney/describe)   | Generar prompt a partir de una imagen |
| [`POST /mj/submit/video`](/api/image/midjourney/submit-video)  | Convertir imagen en video             |
| [`POST /mj/submit/edits`](/api/image/midjourney/submit-editor) | Editar imagen con máscara             |

***

## Consejos para la resolución de problemas

Según el diseño de la API y el flujo de trabajo, estos son problemas comunes que puedes encontrar:

| Problema                                        | Causa probable                                                  | Solución                                                                                                                                     |
| ----------------------------------------------- | --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| No se puede encontrar el botón Vary (Region)    | Se está viendo la imagen de cuadrícula 4-grid                   | Primero haz upscale (haz clic en U1-U4), luego revisa los botones                                                                            |
| El estado de la tarea queda atascado en `MODAL` | La operación requiere entrada adicional                         | Llama a [`/mj/submit/modal`](/api/image/midjourney/modal) con los datos requeridos                                                           |
| `customId` no funciona                          | Se está usando un valor desactualizado o codificado manualmente | Obtén siempre un `customId` reciente de la respuesta de [`/mj/task/\{id\}/fetch`](/api/image/midjourney/task-fetching-api/fetch-single-task) |
| Array `buttons` vacío                           | La tarea aún está en progreso                                   | Espera a `status: "SUCCESS"` antes de acceder a los botones                                                                                  |
