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

# Check Asset Status

> Retrieve the current generation status and result of a previously submitted asset

## Overview

Returns the current state of an asset (generating, completed, or failed) along with its result URL and metadata once ready. Poll this endpoint to wait for a generation to complete.

This endpoint reads the asset state from the database only — it does not poll the underlying provider (FAL/Kie). The asset state is kept up to date by webhooks.

## Authentication

<Info>
  This endpoint requires API key authentication. Include your API key in the `Authorization` header.
</Info>

## Path Parameters

<ParamField path="assetId" type="string" required>
  Asset ID returned by [`/asset/start`](/api-reference/assets/start) in the `asset_ids` array.
</ParamField>

## Response

<ResponseField name="asset_id" type="string">
  The asset ID that was queried.
</ResponseField>

<ResponseField name="status" type="string">
  One of `generating`, `completed`, `failed`, or `pending`.
</ResponseField>

<ResponseField name="type" type="string">
  Media type: `image`, `video`, or `audio`.
</ResponseField>

<ResponseField name="url" type="string">
  URL of the generated media. Present when `status` is `completed`.
</ResponseField>

<ResponseField name="thumbnail_url" type="string">
  Preview thumbnail URL (first frame of the video). **Videos only** — omitted for images, where it would just repeat `url`.
</ResponseField>

<ResponseField name="width" type="number">
  Width in pixels of the generated media (when known).
</ResponseField>

<ResponseField name="height" type="number">
  Height in pixels of the generated media (when known).
</ResponseField>

<ResponseField name="duration_seconds" type="number">
  Duration in seconds (videos only).
</ResponseField>

<ResponseField name="cost" type="number">
  Credits debited for this generation.
</ResponseField>

<ResponseField name="created_at" type="string">
  ISO 8601 creation timestamp.
</ResponseField>

<ResponseField name="generation_params" type="object">
  The parameters used to generate the asset.

  <Expandable title="properties">
    <ResponseField name="model" type="string">
      Model identifier (e.g. `veo-3.1`).
    </ResponseField>

    <ResponseField name="prompt" type="string">
      Original prompt sent.
    </ResponseField>

    <ResponseField name="aspect_ratio" type="string" />

    <ResponseField name="resolution" type="string" />

    <ResponseField name="duration" type="number">
      Duration in seconds.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="error" type="object">
  Present when `status` is `failed`.

  <Expandable title="properties">
    <ResponseField name="code" type="string" />

    <ResponseField name="message" type="string" />
  </Expandable>
</ResponseField>

## Example

<RequestExample>
  ```bash cURL theme={null}
  curl -X GET "https://app.hoox.video/api/public/v1/asset/status/662f8c1d3a4b5e6f70123456" \
    -H "Authorization: Bearer your_api_key"
  ```

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

  asset_id = "662f8c1d3a4b5e6f70123456"
  url = f"https://app.hoox.video/api/public/v1/asset/status/{asset_id}"
  headers = {"Authorization": "Bearer your_api_key"}
  response = requests.get(url, headers=headers)
  print(response.json())
  ```

  ```javascript JavaScript theme={null}
  const assetId = '662f8c1d3a4b5e6f70123456';
  const response = await fetch(`https://app.hoox.video/api/public/v1/asset/status/${assetId}`, {
    headers: { 'Authorization': 'Bearer your_api_key' },
  });
  const data = await response.json();
  console.log(data);
  ```
</RequestExample>

<ResponseExample>
  ```json 200 OK · generating theme={null}
  {
    "asset_id": "662f8c1d3a4b5e6f70123456",
    "status": "generating",
    "type": "video",
    "generation_params": {
      "model": "veo-3.1",
      "prompt": "A cinematic shot of a fox running through autumn leaves at sunrise.",
      "aspect_ratio": "9:16",
      "resolution": "720p",
      "duration": 8
    }
  }
  ```

  ```json 200 OK · completed theme={null}
  {
    "asset_id": "662f8c1d3a4b5e6f70123456",
    "status": "completed",
    "type": "video",
    "url": "https://cdn.hoox.video/spaces/.../video.mp4",
    "thumbnail_url": "https://cdn.hoox.video/spaces/.../thumb.jpg",
    "width": 720,
    "height": 1280,
    "duration_seconds": 8,
    "cost": 60,
    "created_at": "2026-05-22T14:30:00.000Z",
    "generation_params": {
      "model": "veo-3.1",
      "prompt": "A cinematic shot of a fox running through autumn leaves at sunrise.",
      "aspect_ratio": "9:16",
      "resolution": "720p",
      "duration": 8
    }
  }
  ```

  ```json 200 OK · failed theme={null}
  {
    "asset_id": "662f8c1d3a4b5e6f70123456",
    "status": "failed",
    "type": "video",
    "error": {
      "code": "GENERATION_ERROR",
      "message": "The prompt was rejected by the content filter."
    }
  }
  ```

  ```json 404 Not Found theme={null}
  {
    "error": "Asset 662f8c1d3a4b5e6f70123456 not found in space 5e6f7012345...",
    "details": [
      { "code": "asset_not_found", "message": "Asset 662f8c1d3a4b5e6f70123456 not found in space 5e6f7012345..." }
    ]
  }
  ```
</ResponseExample>

## Polling guidance

A typical pattern is to poll every 2–5 seconds until `status` is `completed` or `failed`. Most generations complete in under 2 minutes. If you provided a `webhook_url` when submitting, you can avoid polling entirely.
