API reference
On this page
Returns a page of the open videos granted to your organisation, each with signed MP4 links valid for 1 hour. Walk every page and cache the result on your server. See Open video and Open video sync.
GET /api/delivery/v1/videosScope: videos:read, on a key bound to an app
Request parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Authorization |
header | string | Yes | Bearer <API key> for a key with the videos:read scope. |
collection |
query | string | No | Limit the page to one collection, by its code. |
cursor |
query | string | No | Opaque token from a previous next_cursor. Do not construct or parse it. |
limit |
query | integer | No | Rows per page, 1 to 200. Default 50. |
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. |
Request example
curl -s "https://www.wandura.ai/api/delivery/v1/videos?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 |
|---|---|---|
rows |
array | Videos on this page, in collection order. |
next_cursor |
string or null | Pass it as cursor for the next page. null means you have everything. |
expires_at |
string (ISO 8601, UTC) | When every link on this page stops working (1 hour after the response). |
refresh_before |
string (ISO 8601, UTC) | Call the list again before this time (45 minutes after the response). |
links |
object | Ready-made absolute URLs — follow links.next instead of building the next-page URL. |
links.self |
string | This request. |
links.next |
string or null | The next page, or null on the last page. |
Fields of a video (rows[])
| Field | Type | Description |
|---|---|---|
id |
string (UUID) | Video ID. It never changes; sync on it. |
slug |
string | URL-safe video identifier. |
title |
string | Video title. |
order_code |
string or null | Production order code (for example ABS_01_E01), matching your order file character for character, or null for a video that is not in it. Use it to join with the order file once. |
collection |
string | Code of the collection this row comes from. A video in two granted collections appears once under each. |
position |
integer | Position of the video in its collection. Rows come back in collection order. |
duration_ms |
integer or null | Duration in milliseconds. |
muscle_groups |
array of strings | Muscle groups worked. Can be empty. |
equipment |
array of strings | Equipment needed. Can be empty. |
difficulty |
string or null | Difficulty label. |
kcal_est |
integer or null | Estimated calories burned. |
mp4 |
object | Signed MP4 links, valid until expires_at. Play them as received; never cache them in your app. |
mp4.p480 |
string | 480p MP4 link. Play this by default. |
mp4.p720 |
string or null | 720p MP4 link, or null until that rendition exists. |
Stop walking when next_cursor is null, never on a short or empty page: videos not ready to play are skipped.
Response example
{
"rows": [
{
"id": "3f6c1a52-8d0e-4b7a-9c21-5e4f2a7b9d10",
"slug": "core-abs-01",
"title": "Core abs 01",
"order_code": "ABS_01_E01",
"collection": "ABS_01",
"position": 1,
"duration_ms": 42000,
"muscle_groups": ["abs"],
"equipment": [],
"difficulty": "beginner",
"kcal_est": 12,
"mp4": { "p480": "https://cdn.example.com/v/core-abs-01-480.mp4?sign=example", "p720": null }
}
],
"next_cursor": null,
"expires_at": "2026-10-01T13:00:00.000Z",
"refresh_before": "2026-10-01T12:45:00.000Z"
}Response headers
| Header | Responses | Description |
|---|---|---|
Wandura-API-Status |
all | API status. beta today, on every response, success or error. |
Wandura-Version |
all | 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 |
all | 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 |
all | Always no-store. Do not cache these responses in shared caches. |
Deprecation |
200 | Present only when this endpoint, or the dated version serving this response, is deprecated (RFC 9745): @<unix seconds> of the deprecation date. Log it in your monitoring. |
Sunset |
200 | Present only when a deprecated endpoint or dated version has a date when it stops working (RFC 8594), as an HTTP date. |
Link |
200 | Present with Deprecation: <https://docs.wandura.ai/…>; rel="deprecation" (and rel="sunset") pointing to the page that explains what to use instead. |
Retry-After |
429, 503 | Seconds to wait before retrying. Sent with 429 and with retryable 503 responses. |
X-RateLimit-Limit |
429 | Requests (for playback, tickets) allowed per window for this endpoint group and your organisation. |
X-RateLimit-Window |
429 | Window length in seconds. |
Errors
| Status | error_code |
When |
|---|---|---|
| 400 | none | cursor is not a token this endpoint issued, or limit is not an integer between 1 and 200. |
| 400 | unsupported_version |
The Wandura-Version header, or the version pinned to your key, is unknown or retired. The body adds supported_versions and latest_version (and upgrade_to when your pin was retired). |
| 401 | none | The Authorization: Bearer header is missing, or the key is unknown or revoked. |
| 403 | none | The key lacks the videos:read scope. |
| 403 | none (error is app_not_registered) |
The key is not bound to an app. Register the app on the Developers page and use that app's key. |
| 403 | none (error is org_suspended) |
Your organisation's access is suspended. |
| 404 | none (error is collection_not_found) |
The collection is unknown, not published, or not granted to your organisation. |
| 429 | rate_limited |
The rate limit for this endpoint was reached. |
| 500 | none | The video list could not be read. Retry with backoff. |
| 503 | service_unavailable |
Wandura could not verify the API key in time. The key is not wrong: retry after Retry-After seconds, with backoff. |
What to do for each: Errors.
Updated 2 Oct 2026 · Change history (2)