# Create and monitor a generation

> Submit an estimated request with an API key, then read the generation until it reaches a terminal state.

Canonical: https://entirefeed.com/docs/generate/create-and-monitor

Creation is the first paid step. It requires an organization API key and enough available balance for the current estimate. Running a request in Playground is optional; direct API integrations can create it through REST.

## Create one intended generation

Send a stable `Idempotency-Key` with the same payload you estimated. A successful request returns `201`, a `gen_...` identifier, the queued status, the estimated cost, and a `links.self` URL.

## Read until terminal

Poll `links.self` while status is `queued` or `running`. Stop when status becomes `succeeded`, `failed`, `cancelled`, or `manual_review`.

Successful output contains an ordered `assets` array. Tasks that return structured results also include `output.data`. Asset URLs can expire, so persist finished media according to your own retention requirements.

Read [Statuses](/docs/reference/statuses) before automating terminal handling.

## Submit the generation

Creation requires an organization API key and sufficient balance. Send a stable `Idempotency-Key` to make uncertain retries safe.

### cURL

```bash
curl https://api.entirefeed.com/v1/generations \
  -X POST \
  -H "Authorization: Bearer $ENTIREFEED_API_KEY" \
  -H "Idempotency-Key: quickstart-video-001" \
  -H "Content-Type: application/json" \
  -d '{
  "task": "video.create",
  "model": "seedance-2",
  "input": {
    "prompt": "A crisp product reveal on a clean studio set",
    "duration_seconds": 8,
    "aspect_ratio": "9:16",
    "resolution": "720p"
  }
}'
```

### TypeScript

```typescript
const response = await fetch("https://api.entirefeed.com/v1/generations", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.ENTIREFEED_API_KEY}`,
    "Idempotency-Key": "quickstart-video-001",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "task": "video.create",
    "model": "seedance-2",
    "input": {
      "prompt": "A crisp product reveal on a clean studio set",
      "duration_seconds": 8,
      "aspect_ratio": "9:16",
      "resolution": "720p"
    }
  }),
});

if (!response.ok) throw new Error(await response.text());
console.log(await response.json());
```

### Python

```python
import os
import requests

response = requests.request(
    "POST",
    "https://api.entirefeed.com/v1/generations",
    headers={"Authorization": f"Bearer {os.environ['ENTIREFEED_API_KEY']}", "Idempotency-Key": "quickstart-video-001", "Content-Type": "application/json"},
    json={
      "task": "video.create",
      "model": "seedance-2",
      "input": {
        "prompt": "A crisp product reveal on a clean studio set",
        "duration_seconds": 8,
        "aspect_ratio": "9:16",
        "resolution": "720p",
      },
    },
    timeout=30,
)
response.raise_for_status()
print(response.json())
```

```json
{
  "id": "gen_0123456789abcdef0123456789abcdef",
  "object": "generation",
  "status": "queued",
  "model": "seedance-2",
  "task": "video.create",
  "created_at": "2026-07-12T08:30:00Z",
  "estimated_cost": {
    "amount_usd": "1.64"
  },
  "links": {
    "self": "https://api.entirefeed.com/v1/generations/gen_0123456789abcdef0123456789abcdef"
  }
}
```

## Poll the generation resource

### cURL

```bash
curl https://api.entirefeed.com/v1/generations/gen_0123456789abcdef0123456789abcdef \
  -X GET \
  -H "Authorization: Bearer $ENTIREFEED_API_KEY"
```

### TypeScript

```typescript
const response = await fetch("https://api.entirefeed.com/v1/generations/gen_0123456789abcdef0123456789abcdef", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${process.env.ENTIREFEED_API_KEY}`,
  },
});

if (!response.ok) throw new Error(await response.text());
console.log(await response.json());
```

### Python

```python
import os
import requests

response = requests.request(
    "GET",
    "https://api.entirefeed.com/v1/generations/gen_0123456789abcdef0123456789abcdef",
    headers={"Authorization": f"Bearer {os.environ['ENTIREFEED_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())
```

```json
{
  "id": "gen_0123456789abcdef0123456789abcdef",
  "object": "generation",
  "status": "succeeded",
  "model": "seedance-2",
  "task": "video.create",
  "created_at": "2026-07-12T08:30:00Z",
  "completed_at": "2026-07-12T08:31:14Z",
  "output": {
    "assets": [
      {
        "id": "asset_0123456789abcdef0123456789abcdef",
        "type": "video",
        "url": "https://cdn.entirefeed.com/examples/product-reveal.mp4",
        "mime_type": "video/mp4",
        "expires_at": null
      }
    ]
  },
  "usage": {
    "amount_usd": "1.64",
    "line_items": [
      {
        "type": "video_generation",
        "model": "seedance-2",
        "quantity": 1,
        "unit": "operation",
        "amount_usd": "1.64"
      }
    ],
    "billing_status": "settled"
  },
  "error": null,
  "metadata": null
}
```

## Read output and final usage

- Preserve `output.assets` order when a task returns more than one file.
- Processing tasks can add machine-readable results under `output.data`.
- Read `usage.amount_usd` and `usage.billing_status` together after terminal completion.
