---
title: Resultado de la generación
description: GET /v1/requests/{request_id} — obtenga el resultado terminado con enlaces a la imagen, el vídeo o el audio; mientras el trabajo sigue en curso, la API devuelve 202.
icon: PackageCheck
---

Obtenga la generación terminada con enlaces a sus medios. Mientras el trabajo está en cola o en ejecución, la llamada devuelve `202`: vuelva a intentarlo más tarde.

## Playground

<ApiPlayground path="/v1/requests/{request_id}" method="get" />

`GET /v1/requests/:id` devuelve el resultado con un campo `output` y el código `200` cuando el trabajo alcanza un estado terminal (`COMPLETED`, `FAILED` o `CANCELED`). Todos los enlaces apuntan a la CDN `media.clipia.ai`. No se necesita ningún permiso adicional de la clave.

<Method name="GET" path="/v1/requests/:id" />

## Solicitud

<TypeTable
  type={{
    id: { type: 'string', description: 'El request_id de la respuesta de submit.', required: true }
  }}
/>

<Tabs items={['cURL', 'TypeScript', 'Python']}>
<Tab value="cURL">

```bash
curl https://api.clipia.ai/v1/requests/764cabcf-b745-4b3e-ae38-1200304cf45b \
  -H "Authorization: Bearer $CLIPIA_KEY"
```

</Tab>
<Tab value="TypeScript">

```ts
const result = await clipia.queue.result('764cabcf-b745-4b3e-ae38-1200304cf45b');

// Mientras el trabajo está en ejecución, la API devuelve 202 y el SDK establece pending: true.
if (result.pending) {
  console.log('still running:', result.status);
} else {
  console.log(result.output?.images?.[0]?.url);
}
```

</Tab>
<Tab value="Python">

```python
result = client.result("764cabcf-b745-4b3e-ae38-1200304cf45b")

# Mientras el trabajo está en ejecución, la API devuelve 202 y el SDK establece pending = True.
if result.pending:
    print("still running:", result.status)
else:
    print(result.output["images"][0]["url"])
```

</Tab>
</Tabs>

## Imagen

```json
{
  "request_id": "764cabcf-b745-4b3e-ae38-1200304cf45b",
  "status": "COMPLETED",
  "model": "nano-banana-2",
  "output": {
    "images": [
      {
        "url": "https://media.clipia.ai/....webp",
        "original_url": "https://media.clipia.ai/....png"
      }
    ]
  },
  "cost": 12,
  "created_at": "2026-10-09T12:00:00Z",
  "completed_at": "2026-10-09T12:00:18Z"
}
```

`output.images` es una matriz. `url` es una copia WebP optimizada para mostrarla; `original_url` es el archivo original a máxima calidad. Solo la primera imagen de la matriz tiene `original_url`.

## Vídeo

```json
{
  "request_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
  "status": "COMPLETED",
  "model": "seedance-2-fast-i2v",
  "output": {
    "video": {
      "url": "https://media.clipia.ai/....mp4",
      "original_url": "https://media.clipia.ai/....mp4",
      "thumbnail_url": "https://media.clipia.ai/....webp"
    }
  },
  "cost": 40,
  "created_at": "2026-10-09T12:00:00Z",
  "completed_at": "2026-10-09T12:00:42Z"
}
```

`output.video` es un objeto con `url`. Los campos `original_url` y `thumbnail_url` (un fotograma de vista previa) pueden faltar.

## Audio

```json
{
  "output": {
    "audio": { "url": "https://media.clipia.ai/....mp3" }
  }
}
```

<Callout type="info" title="Sin dimensiones ni duración">
Las respuestas reales no tienen los campos `width`, `height` ni `duration`. Si los necesita, léalos del propio archivo. En el [entorno de pruebas](/es/docs/getting-started/sandbox), las muestras sí incluyen dimensiones: no base su lógica en ellas.
</Callout>

## Campos de la respuesta

<TypeTable
  type={{
    request_id: { type: 'string', description: 'Identificador de la solicitud' },
    status: { type: 'string', description: 'COMPLETED, FAILED o CANCELED' },
    model: { type: 'string', description: 'Slug del modelo' },
    output: { type: 'object', description: 'images: [{ url, original_url? }], video: { url, original_url?, thumbnail_url? } o audio: { url }' },
    cost: { type: 'integer', description: 'Coste en créditos' },
    created_at: { type: 'string', description: 'Cuándo se creó la solicitud, ISO 8601' },
    completed_at: { type: 'string', description: 'Cuándo terminó, ISO 8601' },
    error: { type: 'object', description: '{ code, message }, solo cuando status = FAILED' },
    warnings: { type: 'array', description: '[{ code, parameter, message }]: parámetros que el servidor descartó al ejecutar la solicitud. Se omite cuando no hay nada que avisar' }
  }}
/>

## Avisos

Si pediste sonido, pero la pista de audio no superó la comprobación de seguridad del modelo, el servidor repite la generación una vez sin sonido. La solicitud termina como `COMPLETED` y la respuesta incluye además el array `warnings`:

```json
{
  "status": "COMPLETED",
  "output": { "video": { "url": "https://media.clipia.ai/....mp4" } },
  "warnings": [
    {
      "code": "audio_dropped",
      "parameter": "generate_audio",
      "message": "The audio track did not pass the model's safety check, so the video is generated without sound. The price of the request is unchanged."
    }
  ]
}
```

El coste de la solicitud no cambia. El campo `warnings` se omite cuando no hay nada que avisar, y también en `FAILED` y `CANCELED`. El mismo array llega con la respuesta `202` y con el [estado de la solicitud](/es/docs/api-reference/status) mientras el vídeo sin sonido se sigue generando. De momento es el único motivo; interpreta un `code` desconocido como «el parámetro no se aplicó».

## Códigos de respuesta

| HTTP | Cuándo | Cuerpo |
|------|--------|--------|
| `200` | `COMPLETED` | resultado con `output` |
| `200` | `FAILED` | `error: { code, message }`, `code` es `"GENERATION_FAILED"` por defecto |
| `200` | `CANCELED` | respuesta terminal; `output` suele estar vacío |
| `202` | `IN_QUEUE` / `IN_PROGRESS` | `{ request_id, status }`: vuelva a intentarlo más tarde |
| `400` | identificador mal formado | `message: invalid_request_id` |
| `404` | no existe la solicitud | `code: not_found`, `message: request_not_found` |

<Callout type="info" title="El código 202 es previsible">
`202` solo aparece mientras el trabajo no ha terminado. `FAILED` y `CANCELED` son respuestas finales con el código `200`. En caso de `FAILED`, los créditos reservados se reembolsan íntegramente. `error.code` suele ser `GENERATION_FAILED`, y `error.message` es una descripción breve sin detalles internos. Base su lógica en `status`, no en el texto del mensaje.
</Callout>
