> ## 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 miniatura de YouTube

> Genera una miniatura de 1280×720 para la cuenta conectada con la cuota multimedia de la aplicación web. Reutiliza requestId al reintentar la misma solicitud; usa thumbnails_download para recuperar el resultado.

Genera una miniatura de 1280×720 para la cuenta conectada con la cuota multimedia de la aplicación web. Reutiliza requestId al reintentar la misma solicitud; usa thumbnails\_download para recuperar el resultado.

```http theme={null}
POST https://api.voicecheap.ai/v1/actions/thumbnails_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: `thumbnails: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="referenceImageKeys" type="array">
  Lista de valores. Consulta la estructura de sus elementos en el esquema completo de entrada.

  Número máximo de elementos: 3. Valor predeterminado: \[].
</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
      },
      "referenceImageKeys": {
        "default": [],
        "maxItems": 3,
        "type": "array",
        "items": {
          "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/thumbnails_generate' \
    --header "x-api-key: $VOICECHEAP_API_KEY" \
    --header 'Content-Type: application/json' \
    --data '{"requestId":"2fcb6b7f-4e5d-421a-b35b-b68548dfd83e","prompt":"A clean YouTube thumbnail showing a mountain sunrise, with the text “A new adventure”.","referenceImageKeys":["uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png"]}'
  ```

  ```javascript JavaScript theme={null}
  const input = {
    requestId: '2fcb6b7f-4e5d-421a-b35b-b68548dfd83e',
    prompt: 'A clean YouTube thumbnail showing a mountain sunrise, with the text “A new adventure”.',
    referenceImageKeys: ['uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png'],
  };
  const response = await fetch('https://api.voicecheap.ai/v1/actions/thumbnails_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/thumbnails_generate",
      headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
      json={"requestId": "2fcb6b7f-4e5d-421a-b35b-b68548dfd83e", "prompt": "A clean YouTube thumbnail showing a mountain sunrise, with the text “A new adventure”.", "referenceImageKeys": ["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 la miniatura devueltos al finalizar la generación. El resultado es de 1280 × 720 píxeles; no incluye los bytes de la imagen, previewDataUrl ni los tokens de transferencia.

<ResponseExample>
  ```json HTTP 202 theme={null}
  {
    "data": {
      "requestId": "2fcb6b7f-4e5d-421a-b35b-b68548dfd83e",
      "status": "running",
      "pollAction": "action_request_get",
      "pollAfterSeconds": 5
    },
    "requestId": "2fcb6b7f-4e5d-421a-b35b-b68548dfd83e"
  }
  ```

  ```json HTTP 200 theme={null}
  {
    "data": {
      "generationId": "109c61cb35dbdc01a94aabb3b1a128519ed1f8823800a7a327b9d8d8c2c0e10b",
      "status": "completed",
      "width": 1280,
      "height": 720,
      "referenceImageCount": 1,
      "createdAt": 1792144800000,
      "updatedAt": 1792144800000,
      "expiresAt": 1792749600000
    },
    "requestId": "2fcb6b7f-4e5d-421a-b35b-b68548dfd83e"
  }
  ```

  ```json HTTP 202 replay_running theme={null}
  {
    "data": {
      "requestId": "2fcb6b7f-4e5d-421a-b35b-b68548dfd83e",
      "operation": "thumbnails_generate",
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "status": "running",
      "pollAfterSeconds": 5
    },
    "requestId": "2fcb6b7f-4e5d-421a-b35b-b68548dfd83e"
  }
  ```

  ```json HTTP 200 replay_completed_without_result theme={null}
  {
    "data": {
      "requestId": "2fcb6b7f-4e5d-421a-b35b-b68548dfd83e",
      "operation": "thumbnails_generate",
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "status": "completed",
      "resultStored": false,
      "message": "The action completed. Retrieve its output from the corresponding history or resource action."
    },
    "requestId": "2fcb6b7f-4e5d-421a-b35b-b68548dfd83e"
  }
  ```
</ResponseExample>

## Campos del resultado

| Campo | Descripción |
| - | - |
| `data.generationId` | Identificador que se debe pasar sin cambios a thumbnails\_get o thumbnails\_download. |
| `data.status` | completed, expired o deleted. Un registro deleted permanece deleted incluso después de su fecha de caducidad. |
| `data.width` | Ancho de salida en píxeles: 1280. |
| `data.height` | Altura del resultado en píxeles: 720. |
| `data.referenceImageCount` | Número de imágenes de referencia usadas: de 0 a 3. |
| `data.createdAt` | Hora de creación en milisegundos Unix. |
| `data.updatedAt` | Hora de la última actualización en milisegundos Unix. |
| `data.expiresAt` | Hora en milisegundos Unix a partir de la cual no se puede descargar la miniatura 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":"2fcb6b7f-4e5d-421a-b35b-b68548dfd83e","operation":"thumbnails_generate"}'
```

```json HTTP 200 theme={null}
{
  "data": {
    "requestId": "2fcb6b7f-4e5d-421a-b35b-b68548dfd83e",
    "operation": "thumbnails_generate",
    "status": "completed",
    "createdAt": 1792144800000,
    "updatedAt": 1792144820000,
    "resultStored": true,
    "result": {
      "generationId": "109c61cb35dbdc01a94aabb3b1a128519ed1f8823800a7a327b9d8d8c2c0e10b",
      "status": "completed",
      "width": 1280,
      "height": 720,
      "referenceImageCount": 1,
      "createdAt": 1792144800000,
      "updatedAt": 1792144800000,
      "expiresAt": 1792749600000
    }
  }
}
```

## Notas de la operación

* Requiere thumbnails: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. referenceImageKeys tiene como valor predeterminado \[] y acepta como máximo tres claves.
* Esta es una acción de larga duración. La respuesta inicial de API/MCP normalmente indica running; consulta periódicamente action\_request\_get con operation thumbnails\_generate y el mismo requestId para obtener el resultado final que se muestra aquí.
* Usa la cuota diaria habitual de generación de miniaturas de la cuenta. Las nuevas miniaturas 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.
* Una solicitud completada puede devolver la miniatura existente. Una solicitud de integración que haya fallado o se haya interrumpido no se vuelve a ejecutar automáticamente. Revisa el estado de la solicitud y thumbnails\_list antes de iniciar una nueva solicitud.
* Usa thumbnails\_get o thumbnails\_list para los metadatos y thumbnails\_download para los bytes WebP. El identificador de generación es una cadena opaca, no 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 | `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 | `INVALID_REQUEST_ID` | requestId o Idempotency-Key no es un UUID v4. |
| 400 | `REFERENCE_IMAGE_INVALID` | Una clave de referencia o sus bytes no superan las comprobaciones de propiedad, tipo, tamaño, dimensiones o descodificación. |
| 400 | `THUMBNAIL_PROMPT_INVALID` | El prompt normalizado está fuera del intervalo de 10–1200 caracteres. |
| 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 | `THUMBNAIL_GENERATION_IN_PROGRESS` | La solicitud de miniatura ya se está procesando. |
| 409 | `THUMBNAIL_REQUEST_FAILED` | Este intento de miniatura falló anteriormente. Consulta su estado antes de decidir si iniciar una nueva solicitud. |
| 409 | `THUMBNAIL_REQUEST_ID_REUSED` | El identificador de la solicitud de miniatura ya está asociado a una entrada diferente. |
| 410 | `THUMBNAIL_NOT_FOUND` | El resultado completado anteriormente para esta solicitud ha caducado o ya no está disponible. |
| 422 | `THUMBNAIL_REQUEST_REJECTED` | No se puede generar la miniatura a partir de este prompt o referencia. Cambia el contenido para una nueva solicitud. |
| 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. |
| 429 | `THUMBNAIL_DAILY_LIMIT_REACHED` | Se ha agotado la cuota diaria de generación de miniaturas de la cuenta. |
| 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` | Ha fallado la generación o preparación de la miniatura. Revisa el estado de la solicitud antes de decidir si inicias 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 miniaturas o su resultado guardado no está disponible temporalmente. Consulta el estado de la solicitud antes de reintentar. |
| 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": ["thumbnails:write"]
  }
}
```


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