> ## Documentation Index
> Fetch the complete documentation index at: https://api-docs.voicecheap.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Generar una imagen

> Genera una imagen para la cuenta conectada. Aplica la misma cuota multimedia y las mismas medidas de protección que la aplicación web. Guarda el generationId devuelto y usa images_download para recuperar la imagen. Reutiliza requestId al reintentar la misma solicitud.

Genera una imagen para la cuenta conectada. Aplica la misma cuota multimedia y las mismas medidas de protección que la aplicación web. Guarda el generationId devuelto y usa images\_download para recuperar la imagen. Reutiliza requestId al reintentar la misma solicitud.

```http theme={null}
POST https://api.voicecheap.ai/v1/actions/images_generate
```

## Autenticación y permisos

<ParamField header="x-api-key" type="string" required>
  Envía una clave de API de VoiceCheap en esta cabecera. También se admite Authorization: Bearer con la misma clave de API. Los tokens de acceso OAuth
  solo se aceptan en MCP, no en este endpoint REST.
</ParamField>

Permisos necesarios: `images:write`.

Se requiere una suscripción de pago activa. Los permisos no cambian los roles del equipo, la propiedad de los recursos, los créditos multimedia ni los límites del plan.

## Parámetros

<ParamField body="requestId" type="string">
  Opcional en la capa de transporte: el servidor introduce un identificador antes de la validación si se omite. Proporciona tu propio UUID v4 estable para recuperar la solicitud de forma segura si se pierde la respuesta.

  Formato: "uuid". Patrón: `^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$`.
</ParamField>

<ParamField body="prompt" type="string" required>
  Valor de texto.

  Longitud mínima: 10. Longitud máxima: 1200.
</ParamField>

<ParamField body="aspectRatio" type="string">
  Valor de texto.

  Valores permitidos: "square", "landscape", "portrait". Valor predeterminado: "square".
</ParamField>

<ParamField body="referenceImageKey" type="string">
  Clave de un objeto JPG, PNG o WebP subido bajo uploads/\{yourUserId}/. No se aceptan URL remotas.

  Longitud mínima: 1. Longitud máxima: 512.
</ParamField>

<Accordion title="Esquema completo de entrada">
  El JSON Schema siguiente conserva los nombres exactos de los campos, los tipos anidados, los valores predeterminados, los límites y los valores aceptados que expone el descubrimiento. Las reglas adicionales entre campos se indican en las notas de la operación.

  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "requestId": {
        "type": "string",
        "format": "uuid",
        "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$",
        "description": "UUID v4 for this action. Reuse the same ID with identical arguments on retries."
      },
      "prompt": {
        "type": "string",
        "minLength": 10,
        "maxLength": 1200
      },
      "aspectRatio": {
        "default": "square",
        "type": "string",
        "enum": ["square", "landscape", "portrait"]
      },
      "referenceImageKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 512,
        "description": "An uploaded JPG, PNG or WebP object key under uploads/{yourUserId}/. Remote URLs are not accepted."
      }
    },
    "required": ["prompt"],
    "additionalProperties": false
  }
  ```
</Accordion>

## Idempotencia

Usa un UUID v4 en requestId o en la cabecera HTTP Idempotency-Key para cada modificación. Reutiliza el mismo identificador y argumentos idénticos después de un fallo de red. Si proporcionas ambos, deben coincidir. Repetir una solicitud guardada no vuelve a ejecutar la operación ni consume otra llamada mensual. Las solicitudes fallidas o interrumpidas no se reinician automáticamente.

Toda modificación puede devolver HTTP 202 cuando un reintento encuentra la misma solicitud todavía en ejecución, incluso si su primera ejecución suele ser síncrona. Si la ejecución ha terminado pero resultStored es false, un reintento devuelve HTTP 200 con el estado de la solicitud guardada en lugar del resultado original. Recupera la salida mediante la acción de historial, resultado o descarga de su ámbito.

## Ejemplos de solicitud

Sustituye los identificadores de recursos y las claves multimedia de los ejemplos por valores devueltos para tu cuenta. Mantén el identificador de solicitud al reintentar la misma modificación.

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST 'https://api.voicecheap.ai/v1/actions/images_generate' \
    --header "x-api-key: $VOICECHEAP_API_KEY" \
    --header 'Content-Type: application/json' \
    --data '{"requestId":"61becb70-00d6-4de0-9eb1-05829a0d851c","prompt":"A peaceful coastal village at sunrise, with warm natural light.","aspectRatio":"square","referenceImageKey":"uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png"}'
  ```

  ```javascript JavaScript theme={null}
  const input = {
    requestId: '61becb70-00d6-4de0-9eb1-05829a0d851c',
    prompt: 'A peaceful coastal village at sunrise, with warm natural light.',
    aspectRatio: 'square',
    referenceImageKey: 'uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png',
  };
  const response = await fetch('https://api.voicecheap.ai/v1/actions/images_generate', {
    method: 'POST',
    headers: {
      'x-api-key': process.env.VOICECHEAP_API_KEY,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(input),
  });
  const body = await response.json();
  if (!response.ok) throw new Error(body.code + ': ' + body.message);
  console.log(body);
  ```

  ```python Python theme={null}
  import os
  import requests

  response = requests.post(
      "https://api.voicecheap.ai/v1/actions/images_generate",
      headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
      json={"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c", "prompt": "A peaceful coastal village at sunrise, with warm natural light.", "aspectRatio": "square", "referenceImageKey": "uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png"},
      timeout=120,
  )
  body = response.json()
  if not response.ok:
      raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
  print(body)
  ```
</RequestExample>

## Respuesta

Esta operación devuelve HTTP 202 mientras se ejecuta. Guarda requestId y consulta action\_request\_get con ese identificador y el nombre de la operación original. Los estados de consulta son running, completed, failed e interrupted. Un resultado completado puede apuntar a un trabajo multimedia independiente; continúa con la acción de estado o de salida específica de la operación.

Metadatos finales de generación devueltos por el controlador cuando termina la generación de imágenes. No se incluyen bytes de imagen, previewDataUrl ni URL de descarga.

<ResponseExample>
  ```json HTTP 202 theme={null}
  {
    "data": {
      "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
      "status": "running",
      "pollAction": "action_request_get",
      "pollAfterSeconds": 5
    },
    "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
  }
  ```

  ```json HTTP 200 theme={null}
  {
    "data": {
      "generationId": "6224018c7635dcb933ce5c8f7804aea73738dd1c",
      "status": "completed",
      "aspectRatio": "square",
      "width": 1024,
      "height": 1024,
      "referenceImageCount": 1,
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "expiresAt": 1792749600000
    },
    "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
  }
  ```

  ```json HTTP 202 replay_running theme={null}
  {
    "data": {
      "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
      "operation": "images_generate",
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "status": "running",
      "pollAfterSeconds": 5
    },
    "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
  }
  ```

  ```json HTTP 200 replay_completed_without_result theme={null}
  {
    "data": {
      "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
      "operation": "images_generate",
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "status": "completed",
      "resultStored": false,
      "message": "The action completed. Retrieve its output from the corresponding history or resource action."
    },
    "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
  }
  ```
</ResponseExample>

## Campos del resultado

| Campo | Descripción |
| - | - |
| `data.generationId` | Identificador que se debe pasar sin cambios a images\_get o images\_download. |
| `data.status` | pending, completed, failed o expired. La caducidad tiene prioridad sobre el estado guardado. |
| `data.aspectRatio` | square, landscape o portrait. |
| `data.width` | Ancho de salida en píxeles, o null antes de que las dimensiones estén disponibles. |
| `data.height` | Altura de salida en píxeles, o null antes de que las dimensiones estén disponibles. |
| `data.referenceImageCount` | Número de imágenes de referencia usadas: 0 o 1. |
| `data.createdAt` | Hora de creación en milisegundos Unix. |
| `data.updatedAt` | Hora de la última actualización en milisegundos Unix. |
| `data.expiresAt` | Tiempo en milisegundos Unix a partir del cual no se puede descargar la imagen generada. |

## Recuperar y consultar esta solicitud

Usa el mismo identificador incluso después de perder la conexión. Si resultStored es false, recupera la salida mediante la acción correspondiente de historial, resultado o descarga. Nunca inicies una segunda generación solo para comprobar el progreso.

```bash theme={null}
curl --request POST 'https://api.voicecheap.ai/v1/actions/action_request_get' \
  --header "x-api-key: $VOICECHEAP_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{"requestId":"61becb70-00d6-4de0-9eb1-05829a0d851c","operation":"images_generate"}'
```

```json HTTP 200 theme={null}
{
  "data": {
    "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
    "operation": "images_generate",
    "status": "completed",
    "createdAt": 1792144800000,
    "updatedAt": 1792144820000,
    "resultStored": true,
    "result": {
      "generationId": "6224018c7635dcb933ce5c8f7804aea73738dd1c",
      "status": "completed",
      "aspectRatio": "square",
      "width": 1024,
      "height": 1024,
      "referenceImageCount": 1,
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "expiresAt": 1792749600000
    }
  }
}
```

## Notas de la operación

* Requiere images:write. Se eliminan los espacios de los extremos del prompt, que debe contener entre 10 y 1200 caracteres; también se normaliza antes de la generación. aspectRatio tiene como valor predeterminado square y también acepta landscape o portrait. Se acepta como máximo un referenceImageKey.
* Esta es una acción de larga duración. La respuesta inicial de API/MCP suele indicar running; consulta action\_request\_get con operation images\_generate y el mismo requestId para obtener el resultado final mostrado aquí.
* Usa la cuota diaria normal de generación de imágenes de la cuenta. Las imágenes generadas de la cuenta caducan siete días después de su creación; descarga el resultado antes de expiresAt.
* Esta acción usa las creaciones y cargas propias del usuario conectado, también cuando la credencial está conectada en un contexto de equipo.
* Las claves de referencia deben apuntar a cargas completadas en uploads/\{yourUserId}/ y terminar en .jpg, .jpeg, .png o .webp. Se rechazan las URL remotas, las claves de otros usuarios, los segmentos de recorrido de rutas, las barras invertidas, las secuencias de escape con porcentaje, las cadenas de consulta, los fragmentos y los caracteres de control.
* Cada referencia debe tener contenido, ocupar como máximo 8 MiB (8,388,608 bytes), descodificarse como el tipo de imagen indicado por su extensión y medir entre 128–4096 píxeles en cada lado. El número de píxeles descodificados también está limitado. Una referencia cargada sigue siendo reutilizable; estas acciones de generación no consumen ni eliminan su archivo cargado.
* Usa un requestId UUID v4 o la cabecera HTTP Idempotency-Key, y reutilízalo con entradas idénticas al reintentar. La capa de integración registra cada modificación y devuelve su estado o resultado registrado sin volver a ejecutarla. Una solicitud fallida o interrumpida no se reintenta automáticamente.
* Solo se puede generar una imagen a la vez para este usuario. Usa images\_list e images\_get para revisar el estado de creación, e images\_download para obtener los bytes PNG. El identificador de generación es una cadena opaca; no lo sustituyas por requestId.

## Uso

Cada invocación correcta consume una llamada mensual de API/MCP. También se aplican los créditos multimedia y las cuotas de generación propias de la operación.

## Errores

| Estado HTTP | Código | Significado o solución |
| - | - | - |
| 400 | `BAD_REQUEST` | El servidor no pudo determinar el contexto de red de confianza de la solicitud. |
| 400 | `CREDENTIAL_IN_QUERY` | Se han proporcionado credenciales en un parámetro de consulta access\_token o api\_key. Envía las credenciales en las cabeceras. |
| 400 | `IDEMPOTENCY_CONFLICT` | La cabecera Idempotency-Key y el campo requestId del cuerpo deben coincidir. |
| 400 | `IMAGE_PROMPT_INVALID` | El prompt normalizado está fuera del intervalo de 10–1200 caracteres. |
| 400 | `IMAGE_REFERENCE_INVALID` | Los bytes de referencia no cumplen los requisitos de tipo de imagen compatible, límite de bytes, dimensiones o descodificación. |
| 400 | `INVALID_REQUEST_ID` | requestId o Idempotency-Key no es un UUID v4. |
| 400 | `REFERENCE_IMAGE_INVALID` | La clave de referencia no es segura, no es propia, no es compatible, no está disponible o supera 8 MiB. |
| 400 | `VALIDATION_ERROR` | Falta un argumento, tiene un valor no compatible, supera su límite o no forma parte del esquema de entrada estricto. |
| 401 | `API_KEY_EXPIRED` | La clave API ha caducado. |
| 401 | `INVALID_API_KEY` | Proporciona una clave de API válida que no haya caducado. |
| 401 | `INVALID_CREDENTIAL` | La cabecera Authorization tiene un formato incorrecto o entra en conflicto con x-api-key. |
| 401 | `MISSING_CREDENTIAL` | No se proporcionó ninguna credencial de cabecera utilizable o superaba 4096 caracteres. |
| 401 | `USER_NOT_FOUND` | La cuenta de la credencial ya no existe. |
| 403 | `ACCOUNT_UNAVAILABLE` | La cuenta que realiza la acción o la cuenta de facturación no está disponible o se está eliminando. |
| 403 | `AMBIGUOUS_TEAM_API_KEY` | El usuario de la credencial pertenece a más de un equipo, por lo que el contexto de facturación es ambiguo. |
| 403 | `INSUFFICIENT_SCOPE` | Concede todos los permisos necesarios o elige otra credencial. |
| 403 | `INTEGRATION_PLAN_UNSUPPORTED` | No se han podido verificar los límites de integración de la cuenta. |
| 403 | `SUBSCRIPTION_REQUIRED` | Usa una suscripción de pago activa. |
| 403 | `TEAM_OWNER_NOT_FOUND` | No se pudo encontrar la cuenta del propietario efectivo del equipo. |
| 409 | `CONCURRENT_ACTION_LIMIT_REACHED` | Esta cuenta ya tiene 10 acciones de integración en ejecución. Consulta una solicitud existente antes de iniciar otra. |
| 409 | `IDEMPOTENCY_CONFLICT` | El identificador de solicitud ya se ha usado con argumentos distintos; una discrepancia entre los identificadores del encabezado y del cuerpo devuelve HTTP 400 con el mismo código. |
| 409 | `IMAGE_GENERATION_IN_PROGRESS` | Esta solicitud de imagen u otra imagen del usuario conectado sigue en curso. |
| 409 | `IMAGE_REQUEST_ID_REUSED` | El identificador de solicitud de imagen ya está asociado a una entrada distinta. |
| 422 | `IMAGE_REQUEST_REJECTED` | No se puede generar la imagen a partir de este prompt o referencia. Cambia el contenido para una nueva solicitud. |
| 429 | `IMAGE_DAILY_LIMIT_REACHED` | Se ha agotado el límite diario de generación de imágenes de la cuenta. |
| 429 | `INTEGRATION_MONTHLY_LIMIT_REACHED` | Espera al restablecimiento mensual o cambia de plan. |
| 429 | `INTEGRATION_RATE_LIMIT_REACHED` | Espera el tiempo indicado en Retry-After cuando esté presente y aplica esperas progresivas. |
| 500 | `INTERNAL_ERROR` | Comprueba el estado de la solicitud guardada y el historial del recurso antes de decidir si reintentas una modificación. |
| 502 | `INTERNAL_ERROR` | La generación o preparación de la imagen ha fallado. Consulta el estado de la solicitud antes de decidir iniciar otra generación. |
| 503 | `ACTION_RESULT_UNAVAILABLE` | La acción se ejecutó, pero no se pudo guardar su resultado. Revisa el estado de la solicitud guardada y el historial del recurso antes de iniciar una nueva generación. |
| 503 | `INTERNAL_ERROR` | La generación de imágenes o su resultado almacenado no están disponibles temporalmente. Consulta el estado de la solicitud antes de volver a intentarlo. |
| 503 | `SERVER_RESTARTING` | El servidor se está reiniciando. Reinténtalo en breve y conserva el mismo identificador de solicitud para una modificación. |

```json theme={null}
{
  "code": "INSUFFICIENT_SCOPE",
  "message": "This credential does not permit the requested action.",
  "status": 403,
  "details": {
    "requiredScopes": ["images:write"]
  }
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.