# FAQ

Answers to the questions developers ask most often while integrating the Wandura Delivery API. If your question is not here, see [Support](https://docs.wandura.ai/developers/help/support).

## Keys and access

### Can I call the API from a browser or a mobile app?

No. The API is server-to-server: the endpoints send no CORS headers, and your API key must never ship inside a client. Your app talks to your backend, and your backend talks to Wandura.

### Can I create a key with the `playback` scope myself?

Yes. Any **Admin** or **Developer** of your organisation creates it on **Developers** by picking **Stream films in an app**. If a playback key leaks, anyone can stream your licensed films, so keep it on your server and revoke it immediately if you think it has leaked. See [Authentication](https://docs.wandura.ai/developers/authentication#scopes).

### I lost a key. Can Wandura show it to me again?

No. The full key is shown once, when it is created. Rotate it or create a new one on the **Developers** page.

### Does rotating a key cause downtime?

Yes: the old key stops working immediately. For a smooth switch, create a second key, deploy it, then revoke the old one. This works the same for playback keys.

### Is there a sandbox?

No. Every environment calls `https://www.wandura.ai`. You test with your own keys, in the organisation Wandura chooses for testing, and test plays are recorded like any other. See [Test and production](https://docs.wandura.ai/developers/integration-guide#test-and-production).

## Catalog

### A film I licensed is missing from the catalog. Why?

The catalog lists a film only while your streaming licence for it is active, today is inside the licence window (in UTC), and the film is published. Check the licence dates with Wandura.

### Why do some episodes have `"id": null`?

They are placeholders for episodes that are planned but not published yet, so you can show "coming soon" tiles. They always have `"status": "planned"` and `"stream_ready": false`. See [Catalog](https://docs.wandura.ai/developers/concepts/catalog#planned-episodes).

### The catalog said `stream_ready: true`, but playback returned `not_ready`. Is that a bug?

No. `stream_ready` is a snapshot taken when you fetched the catalog. Playback checks again on every request, and a title can be withdrawn in between. Show "not available yet" and refresh your catalog.

### How do I know which episodes are free?

Episodes with `episode_no` less than or equal to the film's `free_until_episode` are free. Read it from the catalog; it differs per film.

## Playback

### Why do I get `409 sdk_required`?

Licensed episodes are encrypted and can only be played through the Player SDK. Send the device values `union_info` and `drm_kek` from the SDK with your request. See [Playback](https://docs.wandura.ai/developers/concepts/playback#send-the-device-values).

### Why do I get `400 invalid_device_info`?

One of the device values looks empty, for example the literal string `"(null)"`. This usually happens when an SDK call returns nothing and your code converts it to text. The `fields` array tells you which value to fix.

### Can I play episodes with a standard HLS player?

No. A standard player loads the playlist and then stalls. Use the Player SDK: Wandura registers your app IDs and issues the Player SDK licence; your organisation pays for it. The setup guide is on partner.wandura.ai → **Developers** → **Player SDK**, available after [onboarding](https://docs.wandura.ai/developers/before-you-start#get-onboarded).

### Can I cache playback tickets?

No. A ticket expires 30 minutes after it is issued. Request one per play start, and request a fresh one if the player fails mid-session.

### Can I request tickets for several episodes in one call?

No. Each request covers one episode. If your app preloads the next episode, request its ticket separately and send `"intent": "prefetch"`.

### Do prefetch requests count as plays?

Not when you send `"intent": "prefetch"`. Without `intent`, or with a value other than `play` or `prefetch`, every successful ticket request counts as a play. Prefetch requests still count toward your rate limit.

### Where do subtitles come from?

Every playback response includes a `subtitles` array of WebVTT files. An empty array means none are attached yet. See [Playback](https://docs.wandura.ai/developers/concepts/playback#subtitles).

## Creatives

### Does the creatives feed include video files?

No. Records describe each creative but never include a media URL. Ask Wandura how final files reach your systems.

### How do I find out a creative was withdrawn?

The feed has no deletion events. Call `GET /creatives/{id}`: a creative that is no longer available returns `404` with `code` `4040`.

### Why did the same creative arrive twice?

Incremental syncs can return a record again. Store records keyed by `creative_id` and overwrite them. See [Creatives](https://docs.wandura.ai/developers/concepts/creatives#syncing-incrementally).
