Change history
Every change to this page, newest first. Expand an entry to see what changed.
- 1 Oct 2026 · +10 −7 lines
Show changes
⋯ | Field | Type | Description | |---|---|---| - | `id` | string (UUID) | Film ID. Use it as `film_ref` in playback. | + | `id` | string (UUID) | Film ID. It never changes: use it as your primary key, and as `film_ref` in playback. | | `title` | string | Film title. | - | `slug` | string | URL-safe film identifier. Also accepted as `film_ref` in playback. | + | `slug` | string | URL-safe film identifier, unique across films. Wandura does not change it after the film is created. Also accepted as `film_ref` in playback. | | `synopsis_short` | string or null | Short description for cards. Length varies. | | `synopsis_full` | string or null | Full description for detail pages. | | `genres` | array of strings | Genre labels. Can be empty. | - | `language` | string or null | Language of the film. | + | `language` | string or null | Language of the film, as free text written by Wandura's content team (for example `en` or `English`). It is not a fixed list of codes: display it, do not parse it. | | `poster_url` | string or null | Film poster URL. | | `status` | string | Always `published`. | | `display_order` | integer | Display position, smallest first. The array is already sorted by it. | - | `planned_episodes` | integer or null | Total number of episodes planned. | - | `free_until_episode` | integer or null | Episodes with `episode_no` up to and including this number are free. | + | `planned_episodes` | integer or null | Total number of episodes planned. `null` when not set: then the film gets no placeholder rows, and `episodes` lists only its published episodes. | + | `free_until_episode` | integer or null | Episodes with `episode_no` up to and including this number are free. `0` means no free episode. `null` means no number is set for the film: treat every episode as paid, and ask Wandura if you expected free episodes. | | `audience` | string or null | `women`, `men`, `lgbtq`, or `null` if unclassified. | | `form` | string or null | `live_action`, `anime`, or `null` if unclassified. | ⋯ | `stream_ready` | boolean | `true` when a ticket can be issued for the episode. Always `false` on placeholder rows. | - Episodes are grouped by film ID and sorted by `episode_no` within each film. Take the film order from `films`. + Within a film, each `episode_no` appears once, so `film_id` + `episode_no` identifies an episode. Episodes are grouped by film ID and sorted by `episode_no` within each film. Take the film order from `films`. If your organisation has no current licences, both arrays are empty. ⋯ ``` - ## Errors + ## Errors {#errors} | Status | `error_code` | When | ⋯ | 403 | none (`error` is `org_suspended`) | Your organisation's access is suspended. | | 429 | `rate_limited` | The rate limit for the catalog and creatives endpoints was reached. | + | 503 | `service_unavailable` | Wandura could not verify the API key in time. The key is not wrong: retry after `Retry-After` seconds, with backoff. | + The two `403` responses carry no `error_code`. Tell them apart by `error`: it is exactly `org_suspended` when your organisation is suspended, and any other text means the key lacks `metadata:read`. This is the one case where you compare `error`; compare the whole string. + See [Errors](../concepts/errors.md#catalog-errors) for what to do in each case.
- 29 Sept 2026 · Page created