On this page
Returns a page of the series your organisation is licensed for, each with a content_version. Use it in a CMS sync job: when content_version equals the value you stored, nothing changed and you can skip Get series metadata.
GET /api/delivery/v1/seriesScope: metadata:read
Description
Lists your licensed series, oldest change first. Pass updated_since (Unix epoch seconds) to get only the series changed after that moment. A series whose licence ended stays in the list as withdrawn for 30 days, so your sync job sees it. Successful responses are wrapped in the {code, message, data, server_time} envelope; errors use the same envelope without data, except 429 and 400 unsupported_version, which use the flat format. This endpoint shares its rate-limit counter with the catalog.
Your CMS may override any field. Wandura never overwrites your edits: store the content_version you imported and keep your own edits.
Request parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Authorization |
header | string | Yes | Bearer <API key> for a key with the metadata:read scope. |
updated_since |
query | integer | No | Optional. Unix epoch seconds; only series changed after this moment are returned. |
limit |
query | integer | No | Optional. Items per page, 1 to 100. Default 50. |
cursor |
query | string | No | Optional. next_cursor of the previous page, passed back unchanged. |
Wandura-Version |
header | string | No | Optional. A dated API version (YYYY-MM-DD) to use for this request instead of the version pinned to your API key. Unknown or retired values answer 400 with error_code unsupported_version. |
Keep the same updated_since on every page of one sync, and follow next_cursor until it is null.
Request example
curl -s "https://www.wandura.ai/api/delivery/v1/series?updated_since=1790390000&limit=50" \
-H "Authorization: Bearer $WANDURA_API_KEY"Response
200 OK. New fields may be added at any time: ignore the ones you do not recognise.
| Field | Type | Description |
|---|---|---|
code |
integer | 0. |
message |
string | "ok". |
data.next_cursor |
string or null | Pass it back as cursor; null on the last page. |
server_time |
integer | Server time in Unix epoch seconds. |
links |
object | Ready-made absolute URLs of a list response. Follow them instead of building URLs. |
Fields of a series (data.items[])
| Field | Type | Description |
|---|---|---|
code |
string | Series code, for example WD000016. |
status |
string | active: you may stream it now. withdrawn: your licence ended or was suspended, or Wandura took the series down; it stays in this list for 30 days so your sync job sees it. New values may be added. |
updated_at |
integer | Last change in Unix epoch seconds (metadata, licence or episodes in your media space). |
content_version |
string or null | Hash of everything GET /series/{code} returns for you. Unchanged = no need to fetch the detail. null when withdrawn. |
episode_count |
integer or null | Published episodes. null when withdrawn. |
withdrawn_at |
integer or null | When it was withdrawn (epoch seconds), or null. |
film_status |
string or null | Production state of the film in Wandura's catalogue: published (released), draft (in progress, not released yet) or archived (taken down). Not the same as status, which says whether you may stream it. Whether every planned episode is out is is_completed. New values may be added. |
tier |
string or null | Wandura's quality tier of the film, S highest to F lowest, or null when not rated yet. It is not an age rating (see content_rating). |
Response example
{
"code": 0,
"message": "ok",
"data": {
"items": [
{
"code": "WD000016",
"status": "active",
"updated_at": 1790390000,
"content_version": "c3f1a9e07b2d4c5e8f9a0b1c2d3e4f50",
"episode_count": 60,
"withdrawn_at": null,
"film_status": "published",
"tier": "A"
},
{
"code": "WD000021",
"status": "withdrawn",
"updated_at": 1790395000,
"content_version": null,
"episode_count": null,
"withdrawn_at": 1790395000,
"film_status": "archived",
"tier": null
}
],
"next_cursor": null
},
"server_time": 1790400000
}Response headers
| Header | Responses | Description |
|---|---|---|
Wandura-API-Status |
all | API status. beta today, on every response, success or error. |
Wandura-Version |
200 | The dated API version (YYYY-MM-DD) this response was produced in: the version pinned to your API key, or the one you sent in the Wandura-Version request header. Keys created before dated versions existed use 2026-10-02. |
Wandura-Request-Id |
200 | An opaque id for this request (req_ followed by 26 characters). Every response carries it, errors included, and error bodies repeat it as request_id. Log it, and quote it when you contact Wandura about a request: it finds the exact request in our logs. Do not parse it. |
Cache-Control |
200 | Always no-store. Do not cache these responses in shared caches. |
Retry-After |
429 | Seconds to wait before retrying. Sent with 429 and with retryable 503 responses. |
Errors
| Status | code |
When |
|---|---|---|
| 400 | none | The Wandura-Version header, or the version pinned to your key, is unknown or retired. |
| 401 | 4010 | The Authorization: Bearer header is missing. |
| 401 | 4011 | The key is unknown or revoked. |
| 403 | 4030 | The key lacks the metadata:read scope. |
| 403 | 4031 | Your organisation's access is suspended. |
| 422 | 4220 | limit is not 1 to 100, updated_since is not epoch seconds, or cursor is not a value this endpoint returned. |
| 429 | none | Rate limit reached. |
| 503 | 5030 | The list is temporarily unavailable. |
| 503 | 5031 | Wandura could not verify the API key in time. |
What to do for each: Errors.
Updated 5 Oct 2026 · Change history (2)