# Generation object

What `POST /v1/generations`, `GET /v1/generations/{id}` and each row of `GET /v1/generations` return, inside `data`.

```json
{
  "id": "gen_4Fq9xT2mLr7Kd1sV8bN3pZ0c",
  "object": "generation",
  "status": "succeeded",
  "model": "seedance-2.5",
  "variant": "720p",
  "units": 5,
  "price_usd": 1.05,
  "outputs": [{ "url": "https://...", "mime": "video/mp4" }],
  "created_at": "2026-11-01T18:04:11.000Z",
  "finished_at": "2026-11-01T18:06:02.000Z",
  "outputs_kept_until": "2026-12-01T18:06:02.000Z"
}
```

| Field | Type | What it is |
| - | - | - |
| `id` | string | `gen_` and 24 letters and digits. |
| `object` | string | Always `generation`. |
| `status` | string | `queued`, `running`, `succeeded` or `failed`. See [Statuses](https://docs.vidlab.ai/statuses). |
| `model` | string | The model id. |
| `variant` | string | The priced option used, for example `720p` or `720p+audio`. |
| `units` | number | How many units the price counts (seconds, images, characters ...). |
| `price_usd` | number | The price: reserved while it runs, charged only on success. A failed generation is charged nothing, and `price_usd` still shows what it would have cost. |
| `outputs` | array | `{ url, mime }` for each file. Empty until `succeeded`. Download them with [`/content`](https://docs.vidlab.ai/get-the-result#download-the-file). |
| `error` | object | Only when `failed`: `{ code, message, retryable }`, and `reason` for a `content_policy` block. See [Why a generation failed](https://docs.vidlab.ai/why-a-generation-failed). |
| `created_at` | string | ISO 8601 time. |
| `finished_at` | string | ISO 8601 time, once final. |
| `outputs_kept_until` | string | Only when `succeeded`: we keep the files until then, 30 days after the generation finished. Every read gives fresh links. |
| `status_url`, `result_url` | string | Only on the submit answer: where to poll. |
