# Creatives

> **TL;DR** — The creatives feed gives your marketing systems a data record for each ad creative your organisation has approved on Wandura: film, episodes and scenes used, format, duration, hook, formula and the end of your rights. Records never contain a media URL. Sync them incrementally with `updated_since` and a cursor.

## What the feed contains
Creatives of your organisation with status `approved` or `pushed` (already delivered). Drafts and other organisations' creatives never appear. `final.ready` says whether the final render exists. Final video files are not delivered through this API: ask Wandura how they reach your systems.

## Endpoints
| Endpoint | Use |
|---|---|
| [`GET /api/delivery/v1/creatives`](https://docs.wandura.ai/v1/developers/reference/creatives-list) | Sync all records, incrementally. |
| [`GET /api/delivery/v1/creatives/{id}`](https://docs.wandura.ai/v1/developers/reference/creatives-get) | Fetch or re-check one record. |

Both need a key with `creatives:export` ([Authentication](https://docs.wandura.ai/v1/developers/authentication#scopes)) and share one rate-limit counter.

## Response envelope
Successful responses are wrapped in an envelope:

```json
{
  "code": 0,
  "message": "ok",
  "data": { "items": [], "next_cursor": null },
  "server_time": 1790679032
}
```

Errors use the same envelope **without** `data` (`code` is then a four-digit error code), except `429` and `400` `unsupported_version`, which use the flat format. Timestamps in this feed, `server_time` included, are Unix epoch seconds. See [Errors](https://docs.wandura.ai/v1/developers/concepts/errors#creatives-envelope).

## Syncing
Records come oldest update first (by `updated_at`, then ID), so updates made during a sync land after the pages you have read. Keep a checkpoint (the largest `updated_at` of your last complete run), pass it as `updated_since`, page with `cursor`, and overwrite records by `creative_id`: a record can arrive twice. The full procedure and code: [Creatives sync](https://docs.wandura.ai/v1/developers/guides/creatives-sync).

### Creatives that leave the feed
There are no deletion events. A creative that is no longer approved stops appearing. To check one you stored, call `GET /creatives/{id}`: `404` with `code` `4040` means it is gone.

## The record
| Field | What it tells you |
|---|---|
| `creative_id` | Stable ID. Your primary key. |
| `creative_code` | Immutable human-readable code; treat it as opaque. |
| `film`, `episodes`, `scenes` | What the creative is made of: film, episode numbers, each clip with its start, end, action and line. |
| `hook` | The action and line of the opening scene. |
| `placement`, `aspect` | `reels_9x16`, `feed_4x5` or `square_1x1`, and the aspect ratio. |
| `duration_ms` | Total length of the clips used. |
| `formula` | The formula it was built with, if any. |
| `rights.ends_at` | 00:00 UTC of the **last day** of your export rights, or `null`. That day is included: stop using the creative at `ends_at + 86400`. |
| `final.ready` | Whether the final render exists. |

Every field: [List creatives](https://docs.wandura.ai/v1/developers/reference/creatives-list#the-creative-record). Each record carries `schema_version` (currently `1`); new fields are added without changing it, so ignore fields you do not recognise.

## Related
- [Creatives sync](https://docs.wandura.ai/v1/developers/guides/creatives-sync)
- [When rights end](https://docs.wandura.ai/v1/developers/production/rights-end)
