Download OpenAPI specification:
Content Management System and content delivery endpoints for the EncoraStream OTT Platform.
Covers:
Returns published movies available to the authenticated user's territory and subscription.
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| sort | string Sort field and direction. Prefix with |
| q | string <= 200 characters Full-text search query (max 200 characters). |
| genre | string |
| release_year | integer |
| content_rating | string (ContentRating) Enum: "G" "PG" "PG-13" "R" "NC-17" "TV-Y" "TV-G" "TV-PG" "TV-14" "TV-MA" "UNRATED" |
| language | string |
| fields | string Comma-separated list of fields to include in the response (sparse fieldset).
Example: |
| If-None-Match | string ETag from a prior response. Returns |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "tagline": "string",
- "release_year": 1888,
- "runtime_minutes": 1,
- "content_rating": "G",
- "genres": [
- "string"
], - "country_of_origin": [
- "st"
], - "studio": "string",
- "audio_languages": [
- "string"
], - "subtitle_languages": [
- "string"
], - "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}| movie_id required | string <uuid> |
| fields | string Comma-separated list of fields to include in the response (sparse fieldset).
Example: |
| If-None-Match | string ETag from a prior response. Returns |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "tagline": "string",
- "release_year": 1888,
- "runtime_minutes": 1,
- "content_rating": "G",
- "genres": [
- "string"
], - "country_of_origin": [
- "st"
], - "studio": "string",
- "audio_languages": [
- "string"
], - "subtitle_languages": [
- "string"
], - "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "type": "teaser",
- "language": "en",
- "duration_seconds": 1,
- "expires_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}
]
}Returns movies similar to the specified title based on genre, cast, and viewing patterns.
| movie_id required | string <uuid> |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "tagline": "string",
- "release_year": 1888,
- "runtime_minutes": 1,
- "content_rating": "G",
- "genres": [
- "string"
], - "country_of_origin": [
- "st"
], - "studio": "string",
- "audio_languages": [
- "string"
], - "subtitle_languages": [
- "string"
], - "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Returns short-lived signed DASH/HLS manifest URLs.
Requires an active subscription that covers this title.
Device ID header is required and validated against registered devices.
Concurrency is enforced against the plan's max_concurrent_streams limit.
| movie_id required | string <uuid> |
| X-Device-Id required | string <= 128 characters Registered device identifier. |
| X-Profile-Id | string <uuid> Active sub-profile ID for multi-profile accounts. |
{- "data": {
- "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82",
- "expires_at": "2019-08-24T14:15:22Z",
- "token_refresh_before": "2019-08-24T14:15:22Z"
}
}| movie_id required | string <uuid> |
{- "subtitles": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "language": "en-US",
- "language_name": "English",
- "type": "subtitle",
- "format": "vtt",
- "url_expires_at": "2019-08-24T14:15:22Z",
- "is_default": true,
- "is_forced": true
}
], - "audio": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "language": "en-US",
- "language_name": "English",
- "type": "subtitle",
- "format": "vtt",
- "url_expires_at": "2019-08-24T14:15:22Z",
- "is_default": true,
- "is_forced": true
}
]
}| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| sort | string Sort field and direction. Prefix with |
| q | string <= 200 characters Full-text search query (max 200 characters). |
| genre | string |
| status | string Enum: "ongoing" "ended" "canceled" |
| content_rating | string (ContentRating) Enum: "G" "PG" "PG-13" "R" "NC-17" "TV-Y" "TV-G" "TV-PG" "TV-14" "TV-MA" "UNRATED" |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "content_rating": "G",
- "genres": [
- "string"
], - "network": "string",
- "country_of_origin": [
- "st"
], - "language": "en",
- "first_air_date": "2019-08-24",
- "last_air_date": "2019-08-24",
- "total_seasons": 0,
- "total_episodes": 0,
- "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "content_rating": "G",
- "genres": [
- "string"
], - "network": "string",
- "country_of_origin": [
- "st"
], - "language": "en",
- "first_air_date": "2019-08-24",
- "last_air_date": "2019-08-24",
- "total_seasons": 0,
- "total_episodes": 0,
- "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| show_id required | string <uuid> |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "show_id": "503c9125-a11a-4f69-b904-e679735399e2",
- "season_number": 1,
- "title": "string",
- "synopsis": "string",
- "episode_count": 0,
- "images": {
}, - "air_date": "2019-08-24",
- "end_date": "2019-08-24",
- "status": "draft",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}| show_id required | string <uuid> |
| season_number required | integer >= 1 |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "show_id": "503c9125-a11a-4f69-b904-e679735399e2",
- "season_number": 1,
- "title": "string",
- "synopsis": "string",
- "episode_count": 0,
- "images": {
}, - "air_date": "2019-08-24",
- "end_date": "2019-08-24",
- "status": "draft",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "type": "teaser",
- "language": "en",
- "duration_seconds": 1,
- "expires_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}
]
}| show_id required | string <uuid> |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "content_rating": "G",
- "genres": [
- "string"
], - "network": "string",
- "country_of_origin": [
- "st"
], - "language": "en",
- "first_air_date": "2019-08-24",
- "last_air_date": "2019-08-24",
- "total_seasons": 0,
- "total_episodes": 0,
- "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}| show_id required | string <uuid> |
| season_number required | integer >= 1 |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| sort | string Sort field and direction. Prefix with |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "show_id": "503c9125-a11a-4f69-b904-e679735399e2",
- "season_id": "3e93eb58-18e4-4960-a483-d51daf6cd6fd",
- "season_number": 1,
- "episode_number": 0,
- "title": "string",
- "synopsis": "string",
- "runtime_minutes": 1,
- "content_rating": "G",
- "images": {
}, - "status": "draft",
- "air_date": "2019-08-24",
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}| show_id required | string <uuid> |
| season_number required | integer >= 1 |
| episode_number required | integer >= 0 |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "show_id": "503c9125-a11a-4f69-b904-e679735399e2",
- "season_id": "3e93eb58-18e4-4960-a483-d51daf6cd6fd",
- "season_number": 1,
- "episode_number": 0,
- "title": "string",
- "synopsis": "string",
- "runtime_minutes": 1,
- "content_rating": "G",
- "images": {
}, - "status": "draft",
- "air_date": "2019-08-24",
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Same concurrency, geo, and subscription enforcement as movie streaming.
| episode_id required | string <uuid> |
| X-Device-Id required | string <= 128 characters Registered device identifier. |
| X-Profile-Id | string <uuid> Active sub-profile ID for multi-profile accounts. |
{- "data": {
- "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82",
- "expires_at": "2019-08-24T14:15:22Z",
- "token_refresh_before": "2019-08-24T14:15:22Z"
}
}| episode_id required | string <uuid> |
{- "subtitles": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "language": "en-US",
- "language_name": "English",
- "type": "subtitle",
- "format": "vtt",
- "url_expires_at": "2019-08-24T14:15:22Z",
- "is_default": true,
- "is_forced": true
}
], - "audio": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "language": "en-US",
- "language_name": "English",
- "type": "subtitle",
- "format": "vtt",
- "url_expires_at": "2019-08-24T14:15:22Z",
- "is_default": true,
- "is_forced": true
}
]
}| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| q | string <= 200 characters Full-text search query (max 200 characters). |
| category | string |
| language | string |
| status | string Enum: "live" "offline" |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "slug": "string",
- "number": 1,
- "description": "string",
- "category": "News",
- "language": "en",
- "images": {
}, - "status": "live",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "is_premium": true,
- "is_catchup_enabled": true,
- "catchup_days": 30,
- "sort_order": 0,
- "stream_source_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "slug": "string",
- "number": 1,
- "description": "string",
- "category": "News",
- "language": "en",
- "images": {
}, - "status": "live",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "is_premium": true,
- "is_catchup_enabled": true,
- "catchup_days": 30,
- "sort_order": 0,
- "stream_source_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Returns short-lived signed DASH/HLS manifest URLs for a live channel.
The CMS selects the active primary stream source configured by an admin
(via POST /admin/channels/{channel_id}/stream-sources) and signs its
origin_url using the source's signing_key_id and token_ttl_seconds.
The signed URL is what this response returns — the raw origin URL is
never exposed to subscribers.
Validates subscription, geo, device registration, and concurrency before signing. Returns 503 if no active primary stream source is configured.
| channel_id required | string <uuid> |
| X-Device-Id required | string <= 128 characters Registered device identifier. |
| X-Profile-Id | string <uuid> Active sub-profile ID for multi-profile accounts. |
{- "data": {
- "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82",
- "expires_at": "2019-08-24T14:15:22Z",
- "token_refresh_before": "2019-08-24T14:15:22Z"
}
}Returns stream URLs for a previously aired programme (time-shifted replay).
| channel_id required | string <uuid> |
| program_id required | string <uuid> |
| X-Device-Id required | string <= 128 characters Registered device identifier. |
| X-Profile-Id | string <uuid> Active sub-profile ID for multi-profile accounts. |
{- "data": {
- "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82",
- "expires_at": "2019-08-24T14:15:22Z",
- "token_refresh_before": "2019-08-24T14:15:22Z"
}
}Restarts the currently-airing programme from the beginning (start-over).
| channel_id required | string <uuid> |
| X-Device-Id required | string <= 128 characters Registered device identifier. |
| X-Profile-Id | string <uuid> Active sub-profile ID for multi-profile accounts. |
{- "data": {
- "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82",
- "expires_at": "2019-08-24T14:15:22Z",
- "token_refresh_before": "2019-08-24T14:15:22Z"
}
}Returns programme schedule for one or more channels within a time range. Maximum time window: 7 days.
| channel_ids required | Array of strings <uuid> [ 1 .. 50 ] items [ items <uuid > ] |
| start_time required | string <date-time> |
| end_time required | string <date-time> |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "data": {
- "property1": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "title": "string",
- "description": "string",
- "content_rating": "G",
- "language": "en",
- "start_time": "2019-08-24T14:15:22Z",
- "end_time": "2019-08-24T14:15:22Z",
- "duration_minutes": 0,
- "is_live": true,
- "is_catchup_available": true,
- "catchup_expires_at": "2019-08-24T14:15:22Z",
- "season_number": 0,
- "episode_number": 0,
- "categories": [
- "string"
], - "images": {
}, - "linked_vod_id": "657aaad7-6df0-4878-8900-295f294bc20e"
}
], - "property2": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "title": "string",
- "description": "string",
- "content_rating": "G",
- "language": "en",
- "start_time": "2019-08-24T14:15:22Z",
- "end_time": "2019-08-24T14:15:22Z",
- "duration_minutes": 0,
- "is_live": true,
- "is_catchup_available": true,
- "catchup_expires_at": "2019-08-24T14:15:22Z",
- "season_number": 0,
- "episode_number": 0,
- "categories": [
- "string"
], - "images": {
}, - "linked_vod_id": "657aaad7-6df0-4878-8900-295f294bc20e"
}
]
}, - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}Returns the currently-airing programme for each requested channel.
| channel_ids required | Array of strings <uuid> [ 1 .. 50 ] items [ items <uuid > ] |
{- "data": {
- "property1": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "title": "string",
- "description": "string",
- "content_rating": "G",
- "language": "en",
- "start_time": "2019-08-24T14:15:22Z",
- "end_time": "2019-08-24T14:15:22Z",
- "duration_minutes": 0,
- "is_live": true,
- "is_catchup_available": true,
- "catchup_expires_at": "2019-08-24T14:15:22Z",
- "season_number": 0,
- "episode_number": 0,
- "categories": [
- "string"
], - "images": {
}, - "linked_vod_id": "657aaad7-6df0-4878-8900-295f294bc20e"
}, - "property2": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "title": "string",
- "description": "string",
- "content_rating": "G",
- "language": "en",
- "start_time": "2019-08-24T14:15:22Z",
- "end_time": "2019-08-24T14:15:22Z",
- "duration_minutes": 0,
- "is_live": true,
- "is_catchup_available": true,
- "catchup_expires_at": "2019-08-24T14:15:22Z",
- "season_number": 0,
- "episode_number": 0,
- "categories": [
- "string"
], - "images": {
}, - "linked_vod_id": "657aaad7-6df0-4878-8900-295f294bc20e"
}
}
}| program_id required | string <uuid> |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "title": "string",
- "description": "string",
- "content_rating": "G",
- "language": "en",
- "start_time": "2019-08-24T14:15:22Z",
- "end_time": "2019-08-24T14:15:22Z",
- "duration_minutes": 0,
- "is_live": true,
- "is_catchup_available": true,
- "catchup_expires_at": "2019-08-24T14:15:22Z",
- "season_number": 0,
- "episode_number": 0,
- "categories": [
- "string"
], - "images": {
}, - "linked_vod_id": "657aaad7-6df0-4878-8900-295f294bc20e"
}
}Returns published collections. Geo-filtered by caller region.
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "title": "string",
- "subtitle": "string",
- "type": "manual",
- "status": "draft",
- "query": "string",
- "item_refs": [
- {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14"
}
], - "item_count": 0,
- "sort_order": 0,
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "images": {
}, - "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}| collection_id required | string <uuid> |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "title": "string",
- "subtitle": "string",
- "type": "manual",
- "status": "draft",
- "query": "string",
- "item_refs": [
- {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14"
}
], - "item_count": 0,
- "sort_order": 0,
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "images": {
}, - "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns the server-driven home screen layout — an ordered list of rails.
Supports If-None-Match for efficient polling (returns 304 when unchanged).
| X-Profile-Id | string <uuid> Active sub-profile ID for multi-profile accounts. |
| If-None-Match | string ETag from a prior response. Returns |
{- "data": {
- "rails": [
- {
- "id": "string",
- "title": "string",
- "type": "standard",
- "layout": "landscape",
- "collection_id": "4bdef85c-3f50-4006-a713-2350da665f80",
- "items": [
- {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "images": {
}
}
]
}
], - "etag": "string"
}
}Returns the full genre taxonomy. Cacheable — changes infrequently.
| content_type | string Enum: "movie" "show" |
| If-None-Match | string ETag from a prior response. Returns |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Science Fiction",
- "slug": "science-fiction",
- "content_types": [
- "movie"
], - "parent_id": "1c6ca187-e61f-4301-8dcb-0e9749e89eef",
- "content_count": 0,
}
]
}Searches across movies, shows, episodes, and channels.
Results are geo-filtered and subscription-aware.
Only published and scheduled content appears.
| q | string <= 200 characters Full-text search query (max 200 characters). |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| content_type | string Enum: "movie" "show" "episode" "channel" |
| genre | string |
| content_rating | string (ContentRating) Enum: "G" "PG" "PG-13" "R" "NC-17" "TV-Y" "TV-G" "TV-PG" "TV-14" "TV-MA" "UNRATED" |
| release_year_min | integer >= 1888 |
| release_year_max | integer <= 2100 |
| language | string |
{- "data": [
- {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "title": "string",
- "synopsis_snippet": "string",
- "images": {
}, - "score": 1,
- "release_year": 0,
- "content_rating": "G",
- "genres": [
- "string"
], - "status": "published"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}Returns type-ahead suggestions as the user types. Results are lightweight (title + type only).
| q required | string [ 1 .. 100 ] characters |
| limit | integer [ 1 .. 20 ] Default: 10 |
{- "data": [
- {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "title": "string",
}
]
}Returns client configuration fetched on app launch: feature flags, minimum app
versions, CDN base URL, and maintenance status.
Supports If-None-Match for efficient polling.
| platform required | string Enum: "ios" "android" "tvos" "web" "roku" "firetv" |
| If-None-Match | string ETag from a prior response. Returns |
{- "data": {
- "minimum_app_version": {
- "property1": "string",
- "property2": "string"
}, - "feature_flags": {
- "property1": true,
- "property2": true
}, - "maintenance": {
- "active": true,
- "message": "string"
}, - "supported_locales": [
- "string"
], - "config_version": "string"
}
}Returns overall platform health and per-component status.
Does not require authentication. Used by load balancers and monitoring systems.
Returns 200 for ok and degraded; returns 503 for down.
{- "data": {
- "status": "ok",
- "version": "2.0.0",
- "timestamp": "2019-08-24T14:15:22Z",
- "components": {
- "property1": {
- "status": "ok",
- "latency_ms": 0,
- "detail": "string"
}, - "property2": {
- "status": "ok",
- "latency_ms": 0,
- "detail": "string"
}
}
}
}Kubernetes-style readiness probe. Returns 200 when all critical dependencies
(database, cache, DRM) are available. Returns 503 otherwise.
Use for traffic routing decisions (not for end-user display).
{- "code": "INTERNAL_ERROR",
- "message": "An unexpected error occurred. Please try again later.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}Returns all movies including drafts, unpublished, and scheduled. Geo-unfiltered.
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| sort | string Sort field and direction. Prefix with |
| q | string <= 200 characters Full-text search query (max 200 characters). |
| status | string Enum: "draft" "published" "scheduled" "unpublished" |
| genre | string |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "tagline": "string",
- "release_year": 1888,
- "runtime_minutes": 1,
- "content_rating": "G",
- "genres": [
- "string"
], - "country_of_origin": [
- "st"
], - "studio": "string",
- "audio_languages": [
- "string"
], - "subtitle_languages": [
- "string"
], - "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}| Idempotency-Key | string <= 255 characters Client-generated unique key (UUIDv7 recommended — time-ordered, collision-resistant) that makes a write request safely retryable. Replaying the same key within 24h returns the original result instead of performing the action twice. Strongly recommended on all payment and subscription mutations. |
| title required | string <= 255 characters |
| original_title | string <= 255 characters Original title if different from localised title. |
| synopsis | string <= 5000 characters |
| tagline | string <= 300 characters |
| release_year | integer [ 1888 .. 2100 ] |
| runtime_minutes | integer >= 1 Total runtime. Required before publishing. |
| content_rating | string (ContentRating) Enum: "G" "PG" "PG-13" "R" "NC-17" "TV-Y" "TV-G" "TV-PG" "TV-14" "TV-MA" "UNRATED" Parental guidance rating. Required before publishing. |
| genres | Array of strings Genre slugs (from |
| country_of_origin | Array of strings[ items = 2 characters ] ISO 3166-1 alpha-2 production country codes. |
| studio | string <= 200 characters Primary production studio or distributor. |
| audio_languages | Array of strings BCP-47 language codes for available dubbed/original audio tracks. |
| subtitle_languages | Array of strings BCP-47 language codes for available subtitle/CC tracks. |
Array of objects (CastMember) | |
object (ImageSet) Content artwork. All URLs are CDN-hosted, immutable, and cache-safe.
Manage individual slots via | |
| status required | string Enum: "draft" "published" "scheduled" "unpublished" |
object (GeoRestrictionRef) Inline geo-restriction summary embedded in content responses. | |
| drm_required required | boolean When true, clients must acquire a DRM licence before playback. |
| available_from | string <date-time> Earliest playback availability datetime (window start). |
| available_until | string <date-time> Last playback availability datetime (window end). Null = indefinite. |
{- "title": "string",
- "original_title": "string",
- "synopsis": "string",
- "tagline": "string",
- "release_year": 1888,
- "runtime_minutes": 1,
- "content_rating": "G",
- "genres": [
- "string"
], - "country_of_origin": [
- "st"
], - "studio": "string",
- "audio_languages": [
- "string"
], - "subtitle_languages": [
- "string"
], - "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "tagline": "string",
- "release_year": 1888,
- "runtime_minutes": 1,
- "content_rating": "G",
- "genres": [
- "string"
], - "country_of_origin": [
- "st"
], - "studio": "string",
- "audio_languages": [
- "string"
], - "subtitle_languages": [
- "string"
], - "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "tagline": "string",
- "release_year": 1888,
- "runtime_minutes": 1,
- "content_rating": "G",
- "genres": [
- "string"
], - "country_of_origin": [
- "st"
], - "studio": "string",
- "audio_languages": [
- "string"
], - "subtitle_languages": [
- "string"
], - "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| movie_id required | string <uuid> |
| If-Match | string ETag of the resource version the client last read. Enables optimistic concurrency on writes:
the request is rejected with |
| title required | string <= 255 characters |
| original_title | string <= 255 characters Original title if different from localised title. |
| synopsis | string <= 5000 characters |
| tagline | string <= 300 characters |
| release_year | integer [ 1888 .. 2100 ] |
| runtime_minutes | integer >= 1 Total runtime. Required before publishing. |
| content_rating | string (ContentRating) Enum: "G" "PG" "PG-13" "R" "NC-17" "TV-Y" "TV-G" "TV-PG" "TV-14" "TV-MA" "UNRATED" Parental guidance rating. Required before publishing. |
| genres | Array of strings Genre slugs (from |
| country_of_origin | Array of strings[ items = 2 characters ] ISO 3166-1 alpha-2 production country codes. |
| studio | string <= 200 characters Primary production studio or distributor. |
| audio_languages | Array of strings BCP-47 language codes for available dubbed/original audio tracks. |
| subtitle_languages | Array of strings BCP-47 language codes for available subtitle/CC tracks. |
Array of objects (CastMember) | |
object (ImageSet) Content artwork. All URLs are CDN-hosted, immutable, and cache-safe.
Manage individual slots via | |
| status required | string Enum: "draft" "published" "scheduled" "unpublished" |
object (GeoRestrictionRef) Inline geo-restriction summary embedded in content responses. | |
| drm_required required | boolean When true, clients must acquire a DRM licence before playback. |
| available_from | string <date-time> Earliest playback availability datetime (window start). |
| available_until | string <date-time> Last playback availability datetime (window end). Null = indefinite. |
{- "title": "string",
- "original_title": "string",
- "synopsis": "string",
- "tagline": "string",
- "release_year": 1888,
- "runtime_minutes": 1,
- "content_rating": "G",
- "genres": [
- "string"
], - "country_of_origin": [
- "st"
], - "studio": "string",
- "audio_languages": [
- "string"
], - "subtitle_languages": [
- "string"
], - "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "tagline": "string",
- "release_year": 1888,
- "runtime_minutes": 1,
- "content_rating": "G",
- "genres": [
- "string"
], - "country_of_origin": [
- "st"
], - "studio": "string",
- "audio_languages": [
- "string"
], - "subtitle_languages": [
- "string"
], - "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Permanently deletes a movie. Only permitted when status is draft or unpublished.
| movie_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}Transitions movie from draft or unpublished to published.
Validates that required fields (runtime, content_rating, at least one video asset) are present.
| movie_id required | string <uuid> |
| If-Match | string ETag of the resource version the client last read. Enables optimistic concurrency on writes:
the request is rejected with |
| available_from | string <date-time> Schedule publication for a future datetime. Omit for immediate publication. |
{- "available_from": "2019-08-24T14:15:22Z"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "tagline": "string",
- "release_year": 1888,
- "runtime_minutes": 1,
- "content_rating": "G",
- "genres": [
- "string"
], - "country_of_origin": [
- "st"
], - "studio": "string",
- "audio_languages": [
- "string"
], - "subtitle_languages": [
- "string"
], - "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Moves movie from published to unpublished.
Immediately removes the title from subscriber catalogue.
Active streams are allowed to finish but no new streams can be started.
| movie_id required | string <uuid> |
| If-Match | string ETag of the resource version the client last read. Enables optimistic concurrency on writes:
the request is rejected with |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "tagline": "string",
- "release_year": 1888,
- "runtime_minutes": 1,
- "content_rating": "G",
- "genres": [
- "string"
], - "country_of_origin": [
- "st"
], - "studio": "string",
- "audio_languages": [
- "string"
], - "subtitle_languages": [
- "string"
], - "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| sort | string Sort field and direction. Prefix with |
| q | string <= 200 characters Full-text search query (max 200 characters). |
| status | string Enum: "draft" "published" "ongoing" "ended" "canceled" |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "content_rating": "G",
- "genres": [
- "string"
], - "network": "string",
- "country_of_origin": [
- "st"
], - "language": "en",
- "first_air_date": "2019-08-24",
- "last_air_date": "2019-08-24",
- "total_seasons": 0,
- "total_episodes": 0,
- "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}| Idempotency-Key | string <= 255 characters Client-generated unique key (UUIDv7 recommended — time-ordered, collision-resistant) that makes a write request safely retryable. Replaying the same key within 24h returns the original result instead of performing the action twice. Strongly recommended on all payment and subscription mutations. |
| title required | string <= 255 characters |
| original_title | string <= 255 characters |
| synopsis | string <= 5000 characters |
| content_rating | string (ContentRating) Enum: "G" "PG" "PG-13" "R" "NC-17" "TV-Y" "TV-G" "TV-PG" "TV-14" "TV-MA" "UNRATED" Parental guidance rating. Required before publishing. |
| genres | Array of strings Genre slugs (from |
| network | string <= 200 characters Original broadcaster or streaming network (e.g. HBO, Netflix). |
| country_of_origin | Array of strings[ items = 2 characters ] ISO 3166-1 alpha-2 production country codes. |
| language | string Primary audio language (BCP-47). |
| first_air_date | string <date> Date the first episode aired. |
| last_air_date | string <date> Date the most recent episode aired. |
Array of objects (CastMember) | |
object (ImageSet) Content artwork. All URLs are CDN-hosted, immutable, and cache-safe.
Manage individual slots via | |
| status required | string Enum: "draft" "published" "ongoing" "ended" "canceled" |
object (GeoRestrictionRef) Inline geo-restriction summary embedded in content responses. | |
| drm_required required | boolean |
{- "title": "string",
- "original_title": "string",
- "synopsis": "string",
- "content_rating": "G",
- "genres": [
- "string"
], - "network": "string",
- "country_of_origin": [
- "st"
], - "language": "en",
- "first_air_date": "2019-08-24",
- "last_air_date": "2019-08-24",
- "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "content_rating": "G",
- "genres": [
- "string"
], - "network": "string",
- "country_of_origin": [
- "st"
], - "language": "en",
- "first_air_date": "2019-08-24",
- "last_air_date": "2019-08-24",
- "total_seasons": 0,
- "total_episodes": 0,
- "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "content_rating": "G",
- "genres": [
- "string"
], - "network": "string",
- "country_of_origin": [
- "st"
], - "language": "en",
- "first_air_date": "2019-08-24",
- "last_air_date": "2019-08-24",
- "total_seasons": 0,
- "total_episodes": 0,
- "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| show_id required | string <uuid> |
| If-Match | string ETag of the resource version the client last read. Enables optimistic concurrency on writes:
the request is rejected with |
| title required | string <= 255 characters |
| original_title | string <= 255 characters |
| synopsis | string <= 5000 characters |
| content_rating | string (ContentRating) Enum: "G" "PG" "PG-13" "R" "NC-17" "TV-Y" "TV-G" "TV-PG" "TV-14" "TV-MA" "UNRATED" Parental guidance rating. Required before publishing. |
| genres | Array of strings Genre slugs (from |
| network | string <= 200 characters Original broadcaster or streaming network (e.g. HBO, Netflix). |
| country_of_origin | Array of strings[ items = 2 characters ] ISO 3166-1 alpha-2 production country codes. |
| language | string Primary audio language (BCP-47). |
| first_air_date | string <date> Date the first episode aired. |
| last_air_date | string <date> Date the most recent episode aired. |
Array of objects (CastMember) | |
object (ImageSet) Content artwork. All URLs are CDN-hosted, immutable, and cache-safe.
Manage individual slots via | |
| status required | string Enum: "draft" "published" "ongoing" "ended" "canceled" |
object (GeoRestrictionRef) Inline geo-restriction summary embedded in content responses. | |
| drm_required required | boolean |
{- "title": "string",
- "original_title": "string",
- "synopsis": "string",
- "content_rating": "G",
- "genres": [
- "string"
], - "network": "string",
- "country_of_origin": [
- "st"
], - "language": "en",
- "first_air_date": "2019-08-24",
- "last_air_date": "2019-08-24",
- "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "content_rating": "G",
- "genres": [
- "string"
], - "network": "string",
- "country_of_origin": [
- "st"
], - "language": "en",
- "first_air_date": "2019-08-24",
- "last_air_date": "2019-08-24",
- "total_seasons": 0,
- "total_episodes": 0,
- "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Permanently deletes a show and all its seasons/episodes. Only permitted when status is draft.
| show_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}| show_id required | string <uuid> |
| If-Match | string ETag of the resource version the client last read. Enables optimistic concurrency on writes:
the request is rejected with |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "content_rating": "G",
- "genres": [
- "string"
], - "network": "string",
- "country_of_origin": [
- "st"
], - "language": "en",
- "first_air_date": "2019-08-24",
- "last_air_date": "2019-08-24",
- "total_seasons": 0,
- "total_episodes": 0,
- "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| show_id required | string <uuid> |
| If-Match | string ETag of the resource version the client last read. Enables optimistic concurrency on writes:
the request is rejected with |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "original_title": "string",
- "slug": "string",
- "synopsis": "string",
- "content_rating": "G",
- "genres": [
- "string"
], - "network": "string",
- "country_of_origin": [
- "st"
], - "language": "en",
- "first_air_date": "2019-08-24",
- "last_air_date": "2019-08-24",
- "total_seasons": 0,
- "total_episodes": 0,
- "cast": [
- {
- "name": "string",
- "role": "actor",
- "character": "string",
- "display_order": 0
}
], - "images": {
}, - "average_rating": 5,
- "rating_count": 0,
- "status": "draft",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "show_id": "503c9125-a11a-4f69-b904-e679735399e2",
- "season_number": 1,
- "title": "string",
- "synopsis": "string",
- "episode_count": 0,
- "images": {
}, - "air_date": "2019-08-24",
- "end_date": "2019-08-24",
- "status": "draft",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}| show_id required | string <uuid> |
| season_number required | integer >= 1 |
| title | string <= 255 characters Optional explicit season title (e.g. "Chapter One"). Null = "Season {N}" by default. |
| synopsis | string <= 2000 characters |
object (ImageSet) Content artwork. All URLs are CDN-hosted, immutable, and cache-safe.
Manage individual slots via | |
| air_date | string <date> Date the first episode of this season aired. |
| end_date | string <date> Date the final episode aired (null if season is ongoing). |
| status required | string Enum: "draft" "published" "completed" completed = all episodes aired and available; published = actively airing; draft = not yet visible to subscribers. |
{- "season_number": 1,
- "title": "string",
- "synopsis": "string",
- "images": {
}, - "air_date": "2019-08-24",
- "end_date": "2019-08-24",
- "status": "draft"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "show_id": "503c9125-a11a-4f69-b904-e679735399e2",
- "season_number": 1,
- "title": "string",
- "synopsis": "string",
- "episode_count": 0,
- "images": {
}, - "air_date": "2019-08-24",
- "end_date": "2019-08-24",
- "status": "draft",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| show_id required | string <uuid> |
| season_number required | integer >= 1 |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "show_id": "503c9125-a11a-4f69-b904-e679735399e2",
- "season_number": 1,
- "title": "string",
- "synopsis": "string",
- "episode_count": 0,
- "images": {
}, - "air_date": "2019-08-24",
- "end_date": "2019-08-24",
- "status": "draft",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| show_id required | string <uuid> |
| season_number required | integer >= 1 |
| If-Match | string ETag of the resource version the client last read. Enables optimistic concurrency on writes:
the request is rejected with |
| season_number required | integer >= 1 |
| title | string <= 255 characters Optional explicit season title (e.g. "Chapter One"). Null = "Season {N}" by default. |
| synopsis | string <= 2000 characters |
object (ImageSet) Content artwork. All URLs are CDN-hosted, immutable, and cache-safe.
Manage individual slots via | |
| air_date | string <date> Date the first episode of this season aired. |
| end_date | string <date> Date the final episode aired (null if season is ongoing). |
| status required | string Enum: "draft" "published" "completed" completed = all episodes aired and available; published = actively airing; draft = not yet visible to subscribers. |
{- "season_number": 1,
- "title": "string",
- "synopsis": "string",
- "images": {
}, - "air_date": "2019-08-24",
- "end_date": "2019-08-24",
- "status": "draft"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "show_id": "503c9125-a11a-4f69-b904-e679735399e2",
- "season_number": 1,
- "title": "string",
- "synopsis": "string",
- "episode_count": 0,
- "images": {
}, - "air_date": "2019-08-24",
- "end_date": "2019-08-24",
- "status": "draft",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Soft-deletes the season and all its episodes. Only permitted when none of the season's episodes have been published. Audit-logged.
| show_id required | string <uuid> |
| season_number required | integer >= 1 |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}| show_id required | string <uuid> |
| season_number required | integer >= 1 |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "show_id": "503c9125-a11a-4f69-b904-e679735399e2",
- "season_id": "3e93eb58-18e4-4960-a483-d51daf6cd6fd",
- "season_number": 1,
- "episode_number": 0,
- "title": "string",
- "synopsis": "string",
- "runtime_minutes": 1,
- "content_rating": "G",
- "images": {
}, - "status": "draft",
- "air_date": "2019-08-24",
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}| show_id required | string <uuid> |
| season_number required | integer >= 1 |
| season_number required | integer >= 1 |
| episode_number required | integer >= 0 0 indicates a special/bonus episode. |
| title required | string <= 255 characters |
| synopsis | string <= 2000 characters |
| runtime_minutes | integer >= 1 Runtime in minutes. Required before publishing. |
| content_rating | string (ContentRating) Enum: "G" "PG" "PG-13" "R" "NC-17" "TV-Y" "TV-G" "TV-PG" "TV-14" "TV-MA" "UNRATED" Inherits from show if not set; must be set before publishing. |
object (ImageSet) Content artwork. All URLs are CDN-hosted, immutable, and cache-safe.
Manage individual slots via | |
| status required | string Enum: "draft" "published" "scheduled" "unpublished" |
| air_date | string <date> Original broadcast air date. |
| available_from | string <date-time> |
| available_until | string <date-time> |
{- "season_number": 1,
- "episode_number": 0,
- "title": "string",
- "synopsis": "string",
- "runtime_minutes": 1,
- "content_rating": "G",
- "images": {
}, - "status": "draft",
- "air_date": "2019-08-24",
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "show_id": "503c9125-a11a-4f69-b904-e679735399e2",
- "season_id": "3e93eb58-18e4-4960-a483-d51daf6cd6fd",
- "season_number": 1,
- "episode_number": 0,
- "title": "string",
- "synopsis": "string",
- "runtime_minutes": 1,
- "content_rating": "G",
- "images": {
}, - "status": "draft",
- "air_date": "2019-08-24",
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| show_id required | string <uuid> |
| season_number required | integer >= 1 |
| episode_number required | integer >= 0 |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "show_id": "503c9125-a11a-4f69-b904-e679735399e2",
- "season_id": "3e93eb58-18e4-4960-a483-d51daf6cd6fd",
- "season_number": 1,
- "episode_number": 0,
- "title": "string",
- "synopsis": "string",
- "runtime_minutes": 1,
- "content_rating": "G",
- "images": {
}, - "status": "draft",
- "air_date": "2019-08-24",
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| show_id required | string <uuid> |
| season_number required | integer >= 1 |
| episode_number required | integer >= 0 |
| If-Match | string ETag of the resource version the client last read. Enables optimistic concurrency on writes:
the request is rejected with |
| season_number required | integer >= 1 |
| episode_number required | integer >= 0 0 indicates a special/bonus episode. |
| title required | string <= 255 characters |
| synopsis | string <= 2000 characters |
| runtime_minutes | integer >= 1 Runtime in minutes. Required before publishing. |
| content_rating | string (ContentRating) Enum: "G" "PG" "PG-13" "R" "NC-17" "TV-Y" "TV-G" "TV-PG" "TV-14" "TV-MA" "UNRATED" Inherits from show if not set; must be set before publishing. |
object (ImageSet) Content artwork. All URLs are CDN-hosted, immutable, and cache-safe.
Manage individual slots via | |
| status required | string Enum: "draft" "published" "scheduled" "unpublished" |
| air_date | string <date> Original broadcast air date. |
| available_from | string <date-time> |
| available_until | string <date-time> |
{- "season_number": 1,
- "episode_number": 0,
- "title": "string",
- "synopsis": "string",
- "runtime_minutes": 1,
- "content_rating": "G",
- "images": {
}, - "status": "draft",
- "air_date": "2019-08-24",
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "show_id": "503c9125-a11a-4f69-b904-e679735399e2",
- "season_id": "3e93eb58-18e4-4960-a483-d51daf6cd6fd",
- "season_number": 1,
- "episode_number": 0,
- "title": "string",
- "synopsis": "string",
- "runtime_minutes": 1,
- "content_rating": "G",
- "images": {
}, - "status": "draft",
- "air_date": "2019-08-24",
- "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| show_id required | string <uuid> |
| season_number required | integer >= 1 |
| episode_number required | integer >= 0 |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| q | string <= 200 characters Full-text search query (max 200 characters). |
| status | string Enum: "live" "offline" "scheduled_maintenance" |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "slug": "string",
- "number": 1,
- "description": "string",
- "category": "News",
- "language": "en",
- "images": {
}, - "status": "live",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "is_premium": true,
- "is_catchup_enabled": true,
- "catchup_days": 30,
- "sort_order": 0,
- "stream_source_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}Creates a new channel. After creation, add one or more stream sources
(origin URLs) via POST /admin/channels/{channel_id}/stream-sources and
promote the primary with POST .../activate.
| Idempotency-Key | string <= 255 characters Client-generated unique key (UUIDv7 recommended — time-ordered, collision-resistant) that makes a write request safely retryable. Replaying the same key within 24h returns the original result instead of performing the action twice. Strongly recommended on all payment and subscription mutations. |
| name required | string <= 100 characters |
| number | integer >= 1 Logical Channel Number (LCN) for EPG display. |
| description | string <= 1000 characters |
| category | string <= 100 characters |
| language | string Primary broadcast language (BCP-47). |
object (ImageSet) Content artwork. All URLs are CDN-hosted, immutable, and cache-safe.
Manage individual slots via | |
| status required | string Enum: "live" "offline" "scheduled_maintenance" |
object (GeoRestrictionRef) Inline geo-restriction summary embedded in content responses. | |
| drm_required required | boolean |
| is_premium required | boolean |
| is_catchup_enabled required | boolean |
| catchup_days | integer [ 0 .. 30 ] |
| sort_order | integer Default: 0 |
| website_url | string <uri> |
{- "name": "string",
- "number": 1,
- "description": "string",
- "category": "News",
- "language": "en",
- "images": {
}, - "status": "live",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "is_premium": true,
- "is_catchup_enabled": true,
- "catchup_days": 30,
- "sort_order": 0,
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "slug": "string",
- "number": 1,
- "description": "string",
- "category": "News",
- "language": "en",
- "images": {
}, - "status": "live",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "is_premium": true,
- "is_catchup_enabled": true,
- "catchup_days": 30,
- "sort_order": 0,
- "stream_source_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| channel_id required | string <uuid> |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "slug": "string",
- "number": 1,
- "description": "string",
- "category": "News",
- "language": "en",
- "images": {
}, - "status": "live",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "is_premium": true,
- "is_catchup_enabled": true,
- "catchup_days": 30,
- "sort_order": 0,
- "stream_source_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Partial update — send only the fields that should change. To add, rotate, or
remove stream sources use /admin/channels/{channel_id}/stream-sources.
| channel_id required | string <uuid> |
| If-Match | string ETag of the resource version the client last read. Enables optimistic concurrency on writes:
the request is rejected with |
| name | string <= 100 characters |
| number | integer >= 1 |
| description | string <= 1000 characters |
| category | string <= 100 characters |
| language | string |
object (ImageSet) Content artwork. All URLs are CDN-hosted, immutable, and cache-safe.
Manage individual slots via | |
| status | string Enum: "live" "offline" "scheduled_maintenance" |
object (GeoRestrictionRef) Inline geo-restriction summary embedded in content responses. | |
| drm_required | boolean |
| is_premium | boolean |
| is_catchup_enabled | boolean |
| catchup_days | integer [ 0 .. 30 ] |
| sort_order | integer |
| website_url | string <uri> |
{- "name": "string",
- "number": 1,
- "description": "string",
- "category": "string",
- "language": "string",
- "images": {
}, - "status": "live",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "is_premium": true,
- "is_catchup_enabled": true,
- "catchup_days": 30,
- "sort_order": 0,
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "slug": "string",
- "number": 1,
- "description": "string",
- "category": "News",
- "language": "en",
- "images": {
}, - "status": "live",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "is_premium": true,
- "is_catchup_enabled": true,
- "catchup_days": 30,
- "sort_order": 0,
- "stream_source_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "slug": "string",
- "number": 1,
- "description": "string",
- "category": "News",
- "language": "en",
- "images": {
}, - "status": "live",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "is_premium": true,
- "is_catchup_enabled": true,
- "catchup_days": 30,
- "sort_order": 0,
- "stream_source_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "slug": "string",
- "number": 1,
- "description": "string",
- "category": "News",
- "language": "en",
- "images": {
}, - "status": "live",
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "drm_required": true,
- "is_premium": true,
- "is_catchup_enabled": true,
- "catchup_days": 30,
- "sort_order": 0,
- "stream_source_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Returns all stream sources configured for a channel, ordered by failover_priority.
The raw origin_url is never included in responses.
| channel_id required | string <uuid> |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "label": "Primary HLS",
- "provider": "Mux",
- "external_id": "FNRPaVDy5AMW9iJ4b00YTW1bWkKLfIKmA",
- "protocol": "hls",
- "drm_system": "widevine",
- "signing_key_id": "key_prod_live_01",
- "token_ttl_seconds": 300,
- "failover_priority": 1,
- "is_primary": true,
- "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}Adds a new stream source to a channel. The origin_url is stored encrypted
and never returned after this call. If is_primary: true, any existing primary
source is automatically demoted.
| channel_id required | string <uuid> |
| Idempotency-Key | string <= 255 characters Client-generated unique key (UUIDv7 recommended — time-ordered, collision-resistant) that makes a write request safely retryable. Replaying the same key within 24h returns the original result instead of performing the action twice. Strongly recommended on all payment and subscription mutations. |
| label required | string <= 100 characters |
| provider | string <= 100 characters Name of the 3rd party platform that provided this URL. |
| external_id | string <= 255 characters Stream or asset ID in the 3rd party platform. |
| protocol required | string Enum: "hls" "dash" "rtmp" "srt" |
| origin_url required | string <uri> Stream URL from the 3rd party platform. |
| drm_system required | string Enum: "widevine" "fairplay" "playready" "none" |
| signing_key_id | string CMS signing key reference. Omit if the 3rd party platform handles its own access control. |
| token_ttl_seconds | integer [ 30 .. 86400 ] Default: 300 |
| failover_priority | integer >= 1 Default: 10 |
| is_primary | boolean Default: false |
| is_active | boolean Default: true |
{- "label": "Primary HLS",
- "provider": "Mux",
- "external_id": "FNRPaVDy5AMW9iJ4b00YTW1bWkKLfIKmA",
- "protocol": "hls",
- "drm_system": "widevine",
- "signing_key_id": "key_prod_live_01",
- "token_ttl_seconds": 300,
- "failover_priority": 10,
- "is_primary": false,
- "is_active": true
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "label": "Primary HLS",
- "provider": "Mux",
- "external_id": "FNRPaVDy5AMW9iJ4b00YTW1bWkKLfIKmA",
- "protocol": "hls",
- "drm_system": "widevine",
- "signing_key_id": "key_prod_live_01",
- "token_ttl_seconds": 300,
- "failover_priority": 1,
- "is_primary": true,
- "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| channel_id required | string <uuid> |
| source_id required | string <uuid> |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "label": "Primary HLS",
- "provider": "Mux",
- "external_id": "FNRPaVDy5AMW9iJ4b00YTW1bWkKLfIKmA",
- "protocol": "hls",
- "drm_system": "widevine",
- "signing_key_id": "key_prod_live_01",
- "token_ttl_seconds": 300,
- "failover_priority": 1,
- "is_primary": true,
- "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Update labels, DRM config, priority, or active status. To rotate the origin URL,
include origin_url in the request body — it will be re-encrypted and stored.
is_primary cannot be changed directly; use the activate endpoint instead.
| channel_id required | string <uuid> |
| source_id required | string <uuid> |
| If-Match | string ETag of the resource version the client last read. Enables optimistic concurrency on writes:
the request is rejected with |
| label | string <= 100 characters |
| provider | string <= 100 characters Update the 3rd party platform name. |
| external_id | string <= 255 characters Update the stream/asset ID in the 3rd party platform. |
| origin_url | string <uri> New stream URL from the 3rd party platform (replaces the stored URL). |
| drm_system | string Enum: "widevine" "fairplay" "playready" "none" |
| signing_key_id | string or null Set to null to disable CMS signing (use 3rd party access control instead). |
| token_ttl_seconds | integer [ 30 .. 86400 ] |
| failover_priority | integer >= 1 |
| is_active | boolean |
{- "label": "string",
- "provider": "string",
- "external_id": "string",
- "drm_system": "widevine",
- "signing_key_id": "string",
- "token_ttl_seconds": 30,
- "failover_priority": 1,
- "is_active": true
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "label": "Primary HLS",
- "provider": "Mux",
- "external_id": "FNRPaVDy5AMW9iJ4b00YTW1bWkKLfIKmA",
- "protocol": "hls",
- "drm_system": "widevine",
- "signing_key_id": "key_prod_live_01",
- "token_ttl_seconds": 300,
- "failover_priority": 1,
- "is_primary": true,
- "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Permanently removes a stream source. Cannot delete the primary source while other active sources exist — promote another source first.
| channel_id required | string <uuid> |
| source_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}Promotes this source to primary, atomically demoting the previous primary.
The source must be active (is_active: true). Subsequent calls to
GET /channels/{channel_id}/stream will sign URLs from this source.
| channel_id required | string <uuid> |
| source_id required | string <uuid> |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "label": "Primary HLS",
- "provider": "Mux",
- "external_id": "FNRPaVDy5AMW9iJ4b00YTW1bWkKLfIKmA",
- "protocol": "hls",
- "drm_system": "widevine",
- "signing_key_id": "key_prod_live_01",
- "token_ttl_seconds": 300,
- "failover_priority": 1,
- "is_primary": true,
- "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Returns the full schedule for a channel (past and future). No time window restriction.
| channel_id required | string <uuid> |
| start_time | string <date-time> |
| end_time | string <date-time> |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "title": "string",
- "description": "string",
- "content_rating": "G",
- "language": "en",
- "start_time": "2019-08-24T14:15:22Z",
- "end_time": "2019-08-24T14:15:22Z",
- "duration_minutes": 0,
- "is_live": true,
- "is_catchup_available": true,
- "catchup_expires_at": "2019-08-24T14:15:22Z",
- "season_number": 0,
- "episode_number": 0,
- "categories": [
- "string"
], - "images": {
}, - "linked_vod_id": "657aaad7-6df0-4878-8900-295f294bc20e"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}| channel_id required | string <uuid> |
| channel_id required | string <uuid> |
| title required | string <= 255 characters |
| description | string <= 2000 characters |
| content_rating | string (ContentRating) Enum: "G" "PG" "PG-13" "R" "NC-17" "TV-Y" "TV-G" "TV-PG" "TV-14" "TV-MA" "UNRATED" |
| language | string Programme broadcast language (BCP-47). |
| start_time required | string <date-time> |
| end_time required | string <date-time> |
| is_live required | boolean True while the programme is currently airing. |
| is_catchup_available required | boolean True when this past programme is available for catch-up replay via |
| catchup_expires_at | string <date-time> When catch-up availability expires. Null if not available. |
| season_number | integer or null Season number for episodic content broadcast on live TV. |
| episode_number | integer or null Episode number within the season. |
| categories | Array of strings Genre/category tags. |
object (ImageSet) Content artwork. All URLs are CDN-hosted, immutable, and cache-safe.
Manage individual slots via | |
| linked_vod_id | string <uuid> Linked VOD asset ID — allows direct navigation to the VOD version. |
{- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "title": "string",
- "description": "string",
- "content_rating": "G",
- "language": "en",
- "start_time": "2019-08-24T14:15:22Z",
- "end_time": "2019-08-24T14:15:22Z",
- "is_live": true,
- "is_catchup_available": true,
- "catchup_expires_at": "2019-08-24T14:15:22Z",
- "season_number": 0,
- "episode_number": 0,
- "categories": [
- "string"
], - "images": {
}, - "linked_vod_id": "657aaad7-6df0-4878-8900-295f294bc20e"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "title": "string",
- "description": "string",
- "content_rating": "G",
- "language": "en",
- "start_time": "2019-08-24T14:15:22Z",
- "end_time": "2019-08-24T14:15:22Z",
- "duration_minutes": 0,
- "is_live": true,
- "is_catchup_available": true,
- "catchup_expires_at": "2019-08-24T14:15:22Z",
- "season_number": 0,
- "episode_number": 0,
- "categories": [
- "string"
], - "images": {
}, - "linked_vod_id": "657aaad7-6df0-4878-8900-295f294bc20e"
}
}| program_id required | string <uuid> |
| channel_id required | string <uuid> |
| title required | string <= 255 characters |
| description | string <= 2000 characters |
| content_rating | string (ContentRating) Enum: "G" "PG" "PG-13" "R" "NC-17" "TV-Y" "TV-G" "TV-PG" "TV-14" "TV-MA" "UNRATED" |
| language | string Programme broadcast language (BCP-47). |
| start_time required | string <date-time> |
| end_time required | string <date-time> |
| is_live required | boolean True while the programme is currently airing. |
| is_catchup_available required | boolean True when this past programme is available for catch-up replay via |
| catchup_expires_at | string <date-time> When catch-up availability expires. Null if not available. |
| season_number | integer or null Season number for episodic content broadcast on live TV. |
| episode_number | integer or null Episode number within the season. |
| categories | Array of strings Genre/category tags. |
object (ImageSet) Content artwork. All URLs are CDN-hosted, immutable, and cache-safe.
Manage individual slots via | |
| linked_vod_id | string <uuid> Linked VOD asset ID — allows direct navigation to the VOD version. |
{- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "title": "string",
- "description": "string",
- "content_rating": "G",
- "language": "en",
- "start_time": "2019-08-24T14:15:22Z",
- "end_time": "2019-08-24T14:15:22Z",
- "is_live": true,
- "is_catchup_available": true,
- "catchup_expires_at": "2019-08-24T14:15:22Z",
- "season_number": 0,
- "episode_number": 0,
- "categories": [
- "string"
], - "images": {
}, - "linked_vod_id": "657aaad7-6df0-4878-8900-295f294bc20e"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "title": "string",
- "description": "string",
- "content_rating": "G",
- "language": "en",
- "start_time": "2019-08-24T14:15:22Z",
- "end_time": "2019-08-24T14:15:22Z",
- "duration_minutes": 0,
- "is_live": true,
- "is_catchup_available": true,
- "catchup_expires_at": "2019-08-24T14:15:22Z",
- "season_number": 0,
- "episode_number": 0,
- "categories": [
- "string"
], - "images": {
}, - "linked_vod_id": "657aaad7-6df0-4878-8900-295f294bc20e"
}
}Submits an XMLTV or JSON programme schedule for one or more channels.
Returns a job ID for status polling. Large feeds should use source_url.
| format required | string Enum: "xmltv" "json" Encoding of the submitted schedule feed. |
| source required | string The schedule payload. For |
| source_url | string <uri> Allow-listed URL the platform will fetch the feed from (alternative to inline |
| channel_ids | Array of strings <uuid> [ items <uuid > ] Channels this import applies to. If omitted, channels are resolved from the feed. |
| replace_window | boolean Default: true When true, existing programmes within the feed's time range are replaced. |
{- "format": "xmltv",
- "source": "string",
- "channel_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "replace_window": true
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "status": "queued",
- "programs_imported": 0,
- "errors": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "completed_at": "2019-08-24T14:15:22Z"
}| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| status | string Enum: "draft" "published" "scheduled" "archived" |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "title": "string",
- "subtitle": "string",
- "type": "manual",
- "status": "draft",
- "query": "string",
- "item_refs": [
- {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14"
}
], - "item_count": 0,
- "sort_order": 0,
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "images": {
}, - "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}| slug required | string <= 120 characters ^[a-z0-9-]+$ |
| title required | string <= 200 characters |
| subtitle | string or null <= 300 characters |
| type required | string Enum: "manual" "dynamic" "editorial" "franchise" manual = hand-picked items; dynamic = rule/query-driven. |
| status required | string Enum: "draft" "published" "scheduled" "archived" |
| query | string or null For dynamic collections, the catalogue filter expression that populates items. |
Array of objects For manual collections, ordered content references. | |
| sort_order | integer Display weight for ordering collections relative to one another. |
object (GeoRestrictionRef) Inline geo-restriction summary embedded in content responses. | |
object (ImageSet) Content artwork. All URLs are CDN-hosted, immutable, and cache-safe.
Manage individual slots via | |
| available_from | string <date-time> |
| available_until | string <date-time> |
{- "slug": "string",
- "title": "string",
- "subtitle": "string",
- "type": "manual",
- "status": "draft",
- "query": "string",
- "item_refs": [
- {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14"
}
], - "sort_order": 0,
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "images": {
}, - "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "title": "string",
- "subtitle": "string",
- "type": "manual",
- "status": "draft",
- "query": "string",
- "item_refs": [
- {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14"
}
], - "item_count": 0,
- "sort_order": 0,
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "images": {
}, - "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}| collection_id required | string <uuid> |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "title": "string",
- "subtitle": "string",
- "type": "manual",
- "status": "draft",
- "query": "string",
- "item_refs": [
- {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14"
}
], - "item_count": 0,
- "sort_order": 0,
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "images": {
}, - "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}| collection_id required | string <uuid> |
| If-Match | string ETag of the resource version the client last read. Enables optimistic concurrency on writes:
the request is rejected with |
| slug required | string <= 120 characters ^[a-z0-9-]+$ |
| title required | string <= 200 characters |
| subtitle | string or null <= 300 characters |
| type required | string Enum: "manual" "dynamic" "editorial" "franchise" manual = hand-picked items; dynamic = rule/query-driven. |
| status required | string Enum: "draft" "published" "scheduled" "archived" |
| query | string or null For dynamic collections, the catalogue filter expression that populates items. |
Array of objects For manual collections, ordered content references. | |
| sort_order | integer Display weight for ordering collections relative to one another. |
object (GeoRestrictionRef) Inline geo-restriction summary embedded in content responses. | |
object (ImageSet) Content artwork. All URLs are CDN-hosted, immutable, and cache-safe.
Manage individual slots via | |
| available_from | string <date-time> |
| available_until | string <date-time> |
{- "slug": "string",
- "title": "string",
- "subtitle": "string",
- "type": "manual",
- "status": "draft",
- "query": "string",
- "item_refs": [
- {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14"
}
], - "sort_order": 0,
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "images": {
}, - "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "title": "string",
- "subtitle": "string",
- "type": "manual",
- "status": "draft",
- "query": "string",
- "item_refs": [
- {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14"
}
], - "item_count": 0,
- "sort_order": 0,
- "geo_restrictions": {
- "policy": "allow_all",
- "territories": [
- "st"
]
}, - "images": {
}, - "available_from": "2019-08-24T14:15:22Z",
- "available_until": "2019-08-24T14:15:22Z",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Science Fiction",
- "slug": "science-fiction",
- "content_types": [
- "movie"
], - "parent_id": "1c6ca187-e61f-4301-8dcb-0e9749e89eef",
- "content_count": 0,
}
]
}| name required | string <= 100 characters |
| slug required | string <= 100 characters ^[a-z0-9-]+$ |
| content_types required | Array of strings Items Enum: "movie" "show" Which content types use this genre. |
| parent_id | string <uuid> Parent genre UUID for hierarchical taxonomy (e.g. Action → Superhero). |
| image_url | string <uri> CDN URL for genre artwork. |
{- "name": "Science Fiction",
- "slug": "science-fiction",
- "content_types": [
- "movie"
], - "parent_id": "1c6ca187-e61f-4301-8dcb-0e9749e89eef",
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Science Fiction",
- "slug": "science-fiction",
- "content_types": [
- "movie"
], - "parent_id": "1c6ca187-e61f-4301-8dcb-0e9749e89eef",
- "content_count": 0,
}
}| genre_id required | string <uuid> |
| name required | string <= 100 characters |
| slug required | string <= 100 characters ^[a-z0-9-]+$ |
| content_types required | Array of strings Items Enum: "movie" "show" Which content types use this genre. |
| parent_id | string <uuid> Parent genre UUID for hierarchical taxonomy (e.g. Action → Superhero). |
| image_url | string <uri> CDN URL for genre artwork. |
{- "name": "Science Fiction",
- "slug": "science-fiction",
- "content_types": [
- "movie"
], - "parent_id": "1c6ca187-e61f-4301-8dcb-0e9749e89eef",
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Science Fiction",
- "slug": "science-fiction",
- "content_types": [
- "movie"
], - "parent_id": "1c6ca187-e61f-4301-8dcb-0e9749e89eef",
- "content_count": 0,
}
}Fails if any published content references this genre.
| genre_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}Image upload for content artwork — direct multipart upload per slot, or two-step pre-signed URL for direct-to-CDN delivery
Uploads and replaces the image for the given slot. The file is processed
(resized, converted) and served from the CDN. The response contains the
updated ImageSet with the new CDN URL.
Accepted formats: JPEG, PNG, WebP. Maximum size: 10 MB.
| movie_id required | string <uuid> |
| slot required | string (ImageSlot) Enum: "poster" "portrait" "backdrop" "banner" "thumbnail" "logo" Valid slots: |
| file required | string <binary> Image file (JPEG, PNG, or WebP; max 10 MB). |
{- "data": {
}
}Removes the image from the given slot. Returns the updated ImageSet.
| movie_id required | string <uuid> |
| slot required | string (ImageSlot) Enum: "poster" "portrait" "backdrop" "banner" "thumbnail" "logo" Valid slots: |
{- "data": {
}
}Uploads and replaces the image for the given slot. Accepted formats — JPEG, PNG, WebP; max 10 MB.
| show_id required | string <uuid> |
| slot required | string (ImageSlot) Enum: "poster" "portrait" "backdrop" "banner" "thumbnail" "logo" Valid slots: |
| file required | string <binary> |
{- "data": {
}
}| show_id required | string <uuid> |
| slot required | string (ImageSlot) Enum: "poster" "portrait" "backdrop" "banner" "thumbnail" "logo" Valid slots: |
{- "data": {
}
}Uploads the poster artwork for a season. Accepted formats — JPEG, PNG, WebP; max 10 MB.
| show_id required | string <uuid> |
| season_number required | integer |
| slot required | string (ImageSlot) Enum: "poster" "portrait" "backdrop" "banner" "thumbnail" "logo" Valid slot: |
| file required | string <binary> |
{- "data": {
}
}| show_id required | string <uuid> |
| season_number required | integer |
| slot required | string (ImageSlot) Enum: "poster" "portrait" "backdrop" "banner" "thumbnail" "logo" Valid slot: |
{- "data": {
}
}Uploads artwork for an episode. Accepted formats — JPEG, PNG, WebP; max 10 MB.
| show_id required | string <uuid> |
| season_number required | integer |
| episode_number required | integer |
| slot required | string (ImageSlot) Enum: "poster" "portrait" "backdrop" "banner" "thumbnail" "logo" Valid slots: |
| file required | string <binary> |
{- "data": {
}
}| show_id required | string <uuid> |
| season_number required | integer |
| episode_number required | integer |
| slot required | string (ImageSlot) Enum: "poster" "portrait" "backdrop" "banner" "thumbnail" "logo" Valid slots: |
{- "data": {
}
}Uploads artwork for a live channel. Accepted formats — JPEG, PNG, WebP; max 10 MB.
| channel_id required | string <uuid> |
| slot required | string (ImageSlot) Enum: "poster" "portrait" "backdrop" "banner" "thumbnail" "logo" Valid slots: |
| file required | string <binary> |
{- "data": {
}
}| channel_id required | string <uuid> |
| slot required | string (ImageSlot) Enum: "poster" "portrait" "backdrop" "banner" "thumbnail" "logo" Valid slots: |
{- "data": {
}
}Issues a pre-signed URL so the client can upload an image file directly to CDN/object storage — bypassing the API server for large binary payloads.
Two-step flow:
upload_url and upload_id.upload_url using the specified upload_method./admin/images/confirm with the upload_id to associate the
processed CDN URL with the resource.Alternatively, use PUT /admin/{resource}/{id}/images/{slot} for a
single-step multipart upload through the API server.
| resource_type required | string Enum: "movie" "show" "season" "episode" "channel" "collection" |
| resource_id required | string <uuid> UUID of the target resource. |
| slot required | string (ImageSlot) Enum: "poster" "portrait" "backdrop" "banner" "thumbnail" "logo" Named artwork slot within an
|
| content_type required | string Enum: "image/jpeg" "image/png" "image/webp" MIME type of the file you intend to upload. |
{- "resource_type": "movie",
- "resource_id": "4d5215ed-38bb-48ed-879a-fdb9ca58522f",
- "slot": "poster",
- "content_type": "image/jpeg"
}{- "data": {
- "upload_id": "f2ef591b-135b-46fa-a604-3d4fda5bfbfb",
- "upload_method": "PUT",
- "upload_fields": {
- "property1": "string",
- "property2": "string"
}, - "max_size_bytes": 10485760,
- "allowed_content_types": [
- "image/jpeg",
- "image/png",
- "image/webp"
], - "expires_at": "2019-08-24T14:15:22Z"
}
}Confirms that a direct-to-CDN upload has completed and associates the
processed CDN URL with the target resource's ImageSet. Call this after
successfully uploading to the upload_url returned by /admin/images/upload-url.
Triggers image processing (resizing, format conversion, CDN propagation).
| upload_id required | string <uuid> The |
{- "upload_id": "f2ef591b-135b-46fa-a604-3d4fda5bfbfb"
}{- "data": {
}
}Uploads artwork for a collection or rail. Accepted formats — JPEG, PNG, WebP; max 10 MB.
| collection_id required | string <uuid> |
| slot required | string (ImageSlot) Enum: "poster" "portrait" "backdrop" "banner" "thumbnail" "logo" Valid slots: |
| file required | string <binary> |
{- "data": {
}
}| collection_id required | string <uuid> |
| slot required | string (ImageSlot) Enum: "poster" "portrait" "backdrop" "banner" "thumbnail" "logo" Valid slots: |
{- "data": {
}
}Creates a media upload session and returns a signed upload URL.
Upload the source file directly to the URL using a resumable PUT.
After upload, call /complete to trigger transcoding.
| asset_type required | string Enum: "video_master" "trailer" "image" "subtitle" "audio_track" |
| filename required | string <= 255 characters |
| content_type required | string MIME type (e.g. video/mp4, image/jpeg). |
| size_bytes required | integer <int64> >= 1 |
object or null Content entity to attach the asset to after processing. |
{- "asset_type": "video_master",
- "filename": "string",
- "content_type": "string",
- "size_bytes": 1,
- "target": {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14"
}
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "asset_type": "video_master",
- "filename": "string",
- "content_type": "video/mp4",
- "size_bytes": 1,
- "upload_url_expires_at": "2019-08-24T14:15:22Z",
- "status": "awaiting_upload",
- "transcode_status": "pending",
- "asset_id": "b4695157-0d1d-4da0-8f9e-5c53149389e4",
- "target": {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14"
}, - "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| upload_id required | string <uuid> |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "asset_type": "video_master",
- "filename": "string",
- "content_type": "video/mp4",
- "size_bytes": 1,
- "upload_url_expires_at": "2019-08-24T14:15:22Z",
- "status": "awaiting_upload",
- "transcode_status": "pending",
- "asset_id": "b4695157-0d1d-4da0-8f9e-5c53149389e4",
- "target": {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14"
}, - "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Cancels a pending or in-progress upload. Cannot cancel a completed transcode.
| upload_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}Signals that the source file upload is finished and triggers the transcoding pipeline.
| upload_id required | string <uuid> |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "asset_type": "video_master",
- "filename": "string",
- "content_type": "video/mp4",
- "size_bytes": 1,
- "upload_url_expires_at": "2019-08-24T14:15:22Z",
- "status": "awaiting_upload",
- "transcode_status": "pending",
- "asset_id": "b4695157-0d1d-4da0-8f9e-5c53149389e4",
- "target": {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14"
}, - "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "description": "string",
- "policy": "allow_list",
- "territories": [
- "st"
], - "applies_to": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}| name required | string <= 100 characters Human-readable rule name for admin display. |
| description | string <= 500 characters |
| policy required | string Enum: "allow_list" "block_list" |
| territories required | Array of strings non-empty [ items = 2 characters ] ISO 3166-1 alpha-2 country codes. |
| applies_to | Array of strings <uuid> [ items <uuid > ] Content asset UUIDs this rule is applied to. Empty = rule is unattached. |
{- "name": "string",
- "description": "string",
- "policy": "allow_list",
- "territories": [
- "st"
], - "applies_to": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "description": "string",
- "policy": "allow_list",
- "territories": [
- "st"
], - "applies_to": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| rule_id required | string <uuid> |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "description": "string",
- "policy": "allow_list",
- "territories": [
- "st"
], - "applies_to": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| rule_id required | string <uuid> |
| name required | string <= 100 characters Human-readable rule name for admin display. |
| description | string <= 500 characters |
| policy required | string Enum: "allow_list" "block_list" |
| territories required | Array of strings non-empty [ items = 2 characters ] ISO 3166-1 alpha-2 country codes. |
| applies_to | Array of strings <uuid> [ items <uuid > ] Content asset UUIDs this rule is applied to. Empty = rule is unattached. |
{- "name": "string",
- "description": "string",
- "policy": "allow_list",
- "territories": [
- "st"
], - "applies_to": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "description": "string",
- "policy": "allow_list",
- "territories": [
- "st"
], - "applies_to": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Test whether a given country code can access a specific content asset.
| content_id required | string <uuid> |
| content_type required | string Enum: "movie" "show" "episode" "channel" |
| country_code required | string = 2 characters |
{- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "content_type": "movie",
- "country_code": "st"
}{- "allowed": true,
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60"
}| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "description": "string",
- "events": [
- "subscription.created"
], - "status": "active",
- "signing_secret_hint": "stri",
- "failure_count": 0,
- "last_delivery_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}Registers a new webhook URL.
The system generates an HMAC-SHA256 signing secret; only its last 4 characters are returned in
subsequent GET responses. Store the full secret securely on first creation — it cannot be recovered.
All deliveries include X-Encora-Signature-256: sha256=<HMAC> header.
| url required | string <uri> HTTPS endpoint. HTTP is rejected. |
| description | string <= 255 characters |
| events required | Array of strings (WebhookEventType) non-empty Items Enum: "subscription.created" "subscription.updated" "subscription.canceled" "subscription.payment_failed" "subscription.trial_ending" "user.created" "user.deleted" "user.suspended" "user.email_verified" "device.registered" "device.removed" "content.published" "content.unpublished" "profile.created" "profile.deleted" "stream.started" "stream.ended" "stream.concurrency_exceeded" |
{- "description": "string",
- "events": [
- "subscription.created"
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "description": "string",
- "events": [
- "subscription.created"
], - "status": "active",
- "signing_secret_hint": "stri",
- "failure_count": 0,
- "last_delivery_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "signing_secret": "string"
}| webhook_id required | string <uuid> |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "description": "string",
- "events": [
- "subscription.created"
], - "status": "active",
- "signing_secret_hint": "stri",
- "failure_count": 0,
- "last_delivery_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| webhook_id required | string <uuid> |
| url | string <uri> |
| description | string <= 255 characters |
| events | Array of strings (WebhookEventType) Items Enum: "subscription.created" "subscription.updated" "subscription.canceled" "subscription.payment_failed" "subscription.trial_ending" "user.created" "user.deleted" "user.suspended" "user.email_verified" "device.registered" "device.removed" "content.published" "content.unpublished" "profile.created" "profile.deleted" "stream.started" "stream.ended" "stream.concurrency_exceeded" |
| status | string Enum: "active" "disabled" |
{- "description": "string",
- "events": [
- "subscription.created"
], - "status": "active"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "description": "string",
- "events": [
- "subscription.created"
], - "status": "active",
- "signing_secret_hint": "stri",
- "failure_count": 0,
- "last_delivery_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Sends a synthetic ping event to the endpoint and returns the delivery result.
| webhook_id required | string <uuid> |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "endpoint_id": "e9ce0d4f-d433-423d-9497-4c000544106c",
- "event_type": "subscription.created",
- "event_id": "a7a26ff2-e851-45b6-9634-d595f45458b7",
- "status": "pending",
- "http_status": 0,
- "response_snippet": "string",
- "attempt_count": 1,
- "next_retry_at": "2019-08-24T14:15:22Z",
- "delivered_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}
}| webhook_id required | string <uuid> |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| status | string Enum: "pending" "delivered" "failed" "retrying" |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "endpoint_id": "e9ce0d4f-d433-423d-9497-4c000544106c",
- "event_type": "subscription.created",
- "event_id": "a7a26ff2-e851-45b6-9634-d595f45458b7",
- "status": "pending",
- "http_status": 0,
- "response_snippet": "string",
- "attempt_count": 1,
- "next_retry_at": "2019-08-24T14:15:22Z",
- "delivered_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}Manually triggers re-delivery of a failed event. Subject to retry rate limits.
| webhook_id required | string <uuid> |
| delivery_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}Returns high-level KPIs — active subscribers, MRR, ARPU, churn, and stream hours.
| period required | string Enum: "today" "last_7d" "last_30d" "last_90d" |
| currency | string = 3 characters Default: "USD" |
{- "data": {
- "period": "today",
- "currency": "str",
- "total_active_subscribers": 0,
- "new_subscribers": 0,
- "churned_subscribers": 0,
- "net_subscriber_change": 0,
- "total_stream_hours": 0.1,
- "avg_daily_active_users": 0.1,
- "mrr": 0.1,
- "arpu": 0.1,
- "churn_rate": 0.1
}
}Returns play counts, unique viewers, and completion rates. Sortable by total_plays or unique_viewers.
| period required | string Enum: "today" "last_7d" "last_30d" "last_90d" |
| content_type | string Enum: "movie" "show" "episode" "channel" |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| cursor | string Opaque pagination cursor from |
| sort | string Sort field and direction. Prefix with |
{- "data": [
- {
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "content_type": "movie",
- "title": "string",
- "period": "today",
- "total_plays": 0,
- "unique_viewers": 0,
- "avg_completion_rate": 1,
- "total_watch_hours": 0.1,
- "avg_watch_duration_minutes": 0.1
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}Returns trial conversion rates and revenue breakdown by plan.
| period required | string Enum: "today" "last_7d" "last_30d" "last_90d" |
{- "data": {
- "period": "today",
- "trial_conversion_rate": 1,
- "by_plan": [
- {
- "plan_id": "00713021-9aea-41da-9a88-87760c08fa72",
- "plan_name": "string",
- "active_count": 0,
- "new_count": 0,
- "churned_count": 0,
- "revenue": 0.1
}
]
}
}Immutable, append-only audit log. Supports filtering by actor, resource, action, and time range. Results are always sorted newest-first.
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| actor_id | string <uuid> |
| action | string <= 100 characters Filter by action prefix (e.g. |
| resource_type | string <= 100 characters |
| resource_id | string <uuid> |
| from | string <date-time> |
| to | string <date-time> |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "action": "content.published",
- "actor_id": "04f37679-bfbf-4906-b749-01756515cecf",
- "actor_role": "subscriber",
- "resource_type": "movie",
- "resource_id": "4d5215ed-38bb-48ed-879a-fdb9ca58522f",
- "ip_address": "203.0.113.0",
- "user_agent": "string",
- "request_id": "266ea41d-adf5-480b-af50-15b940c2b846",
- "metadata": { },
- "created_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "action": "content.published",
- "actor_id": "04f37679-bfbf-4906-b749-01756515cecf",
- "actor_role": "subscriber",
- "resource_type": "movie",
- "resource_id": "4d5215ed-38bb-48ed-879a-fdb9ca58522f",
- "ip_address": "203.0.113.0",
- "user_agent": "string",
- "request_id": "266ea41d-adf5-480b-af50-15b940c2b846",
- "metadata": { },
- "created_at": "2019-08-24T14:15:22Z"
}
}{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "device_type": "smart_tv",
- "platform": "Android 14",
- "os_version": "14.0.1",
- "app_version": "3.5.2",
- "is_trusted": true,
- "last_active_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "limit": 0
}Registers a new device. Returns 409 if device limit is reached for the plan.
The fingerprint field must be a hashed, non-reversible value — never send raw hardware IDs.
| name required | string <= 100 characters |
| device_type required | string Enum: "smart_tv" "mobile" "tablet" "desktop" "console" "stb" "other" |
| platform | string <= 100 characters OS name and version (e.g. "Android 14"). |
| os_version | string <= 50 characters OS version string. |
| app_version | string <= 50 characters App version initiating registration. |
| fingerprint required | string <= 512 characters Opaque hardware/software fingerprint (hashed client-side using SHA-256). Never send raw device identifiers such as IMEI, MAC address, or serial numbers. |
{- "name": "string",
- "device_type": "smart_tv",
- "platform": "string",
- "os_version": "string",
- "app_version": "string",
- "fingerprint": "string"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "device_type": "smart_tv",
- "platform": "Android 14",
- "os_version": "14.0.1",
- "app_version": "3.5.2",
- "is_trusted": true,
- "last_active_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "device_type": "smart_tv",
- "platform": "Android 14",
- "os_version": "14.0.1",
- "app_version": "3.5.2",
- "is_trusted": true,
- "last_active_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| device_id required | string <uuid> |
| name | string <= 100 characters |
{- "name": "string"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "device_type": "smart_tv",
- "platform": "Android 14",
- "os_version": "14.0.1",
- "app_version": "3.5.2",
- "is_trusted": true,
- "last_active_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Removes the device and terminates any active streams on it.
| device_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}Accepts a CDM licence challenge and returns a signed DRM licence.
Security Notes
| X-Device-Id required | string <= 128 characters Registered device identifier. |
| content_id required | string <uuid> |
| content_type required | string Enum: "movie" "episode" "channel" |
| drm_system required | string Enum: "widevine" "fairplay" "playready" |
| license_request_bytes required | string <byte> Base64-encoded DRM licence challenge from the CDM. |
{- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "content_type": "movie",
- "drm_system": "widevine",
- "license_request_bytes": "string"
}{- "data": {
- "license_bytes": "string",
- "drm_system": "widevine",
- "expires_at": "2019-08-24T14:15:22Z",
- "offline_enabled": true,
- "renewal_before": "2019-08-24T14:15:22Z"
}
}Must be called every 30 seconds to maintain an active stream session. Reports current playback position, updates concurrency slot keepalive, and renews the manifest URLs when they approach expiry.
| session_id required | string <uuid> Stream session UUID from the stream response. |
| position_seconds required | integer >= 0 Current playback position in seconds. |
| is_paused | boolean Default: false |
{- "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82",
- "position_seconds": 0,
- "is_paused": false
}{- "refreshed_urls": {
- "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82",
- "expires_at": "2019-08-24T14:15:22Z",
- "token_refresh_before": "2019-08-24T14:15:22Z"
}, - "session_expires_at": "2019-08-24T14:15:22Z"
}Gracefully terminates a stream session and releases the concurrency slot.
| session_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}Returns all currently active stream sessions for the account.
{- "data": [
- {
- "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82",
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940",
- "profile_id": "bfcb6779-b1f9-41fc-92d7-88f8bc1d12e8",
- "status": "active",
- "position_seconds": 0,
- "started_at": "2019-08-24T14:15:22Z",
- "last_heartbeat_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z"
}
]
}| profile_id required | string <uuid> |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| sort | string Sort field and direction. Prefix with |
| content_type | string Enum: "movie" "show" "episode" |
| completed | boolean |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "watch_progress_seconds": 0,
- "watch_progress_percent": 100,
- "completed": false,
- "added_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}| profile_id required | string <uuid> |
| content_type required | string Enum: "movie" "show" "episode" |
| content_id required | string <uuid> |
{- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "watch_progress_seconds": 0,
- "watch_progress_percent": 100,
- "completed": false,
- "added_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Updates the playback position for resume functionality.
| profile_id required | string <uuid> |
| item_id required | string <uuid> |
| watch_progress_seconds | integer >= 0 |
| completed | boolean |
{- "watch_progress_seconds": 0,
- "completed": true
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "watch_progress_seconds": 0,
- "watch_progress_percent": 100,
- "completed": false,
- "added_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}| profile_id required | string <uuid> |
| item_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}| profile_id required | string <uuid> |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| content_type | string Enum: "movie" "episode" "channel" |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "watch_duration_seconds": 0,
- "progress_seconds": 0,
- "completed": true,
- "device_type": "smart_tv",
- "watched_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}Irreversibly deletes all watch history entries for the profile. Supports GDPR right-to-erasure. Requires confirmation field to prevent accidental deletion. Audit-logged.
| profile_id required | string <uuid> |
| confirmation required | string Value: "CLEAR_HISTORY" Must send this exact string to confirm the destructive operation. |
{- "confirmation": "CLEAR_HISTORY"
}{- "code": "BAD_REQUEST",
- "message": "Request body is malformed JSON.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}| profile_id required | string <uuid> |
| item_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}Returns ML-driven content recommendations for the profile. Results are geo-filtered and subscription-aware.
| profile_id required | string <uuid> |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| content_type | string Default: "mixed" Enum: "movie" "show" "mixed" |
| context | string Enum: "home" "continue_watching" "because_you_watched" "trending" "new_releases" |
{- "data": [
- {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "rank": 1,
- "score": 1,
- "reason": "Because you watched Inception",
- "context": "home"
}
]
}Platform-wide trending titles. Geo-filtered by caller's region.
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| content_type | string Default: "mixed" Enum: "movie" "show" "mixed" |
| window | string Default: "this_week" Enum: "today" "this_week" "this_month" |
{- "data": [
- {
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "rank": 1,
- "score": 1,
- "reason": "Because you watched Inception",
- "context": "home"
}
]
}| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| status | string Enum: "scheduled" "recording" "recorded" "failed" "expired" |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "program_id": "70c1146b-e933-4cb2-a789-bbca5312b517",
- "profile_id": "bfcb6779-b1f9-41fc-92d7-88f8bc1d12e8",
- "title": "string",
- "status": "scheduled",
- "quality": "sd",
- "start_time": "2019-08-24T14:15:22Z",
- "end_time": "2019-08-24T14:15:22Z",
- "duration_seconds": 0,
- "size_bytes": 0,
- "expires_at": "2019-08-24T14:15:22Z",
- "requested_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}| channel_id required | string <uuid> |
| program_id | string <uuid> EPG programme ID. If provided, start/end times are derived from it. |
| start_time required | string <date-time> |
| end_time required | string <date-time> |
| quality | string Default: "hd" Enum: "sd" "hd" "fhd" "uhd" |
{- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "program_id": "70c1146b-e933-4cb2-a789-bbca5312b517",
- "start_time": "2019-08-24T14:15:22Z",
- "end_time": "2019-08-24T14:15:22Z",
- "quality": "sd"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "program_id": "70c1146b-e933-4cb2-a789-bbca5312b517",
- "profile_id": "bfcb6779-b1f9-41fc-92d7-88f8bc1d12e8",
- "title": "string",
- "status": "scheduled",
- "quality": "sd",
- "start_time": "2019-08-24T14:15:22Z",
- "end_time": "2019-08-24T14:15:22Z",
- "duration_seconds": 0,
- "size_bytes": 0,
- "expires_at": "2019-08-24T14:15:22Z",
- "requested_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "channel_id": "bbe8aa76-a4bb-46f6-a785-df8e831cc459",
- "program_id": "70c1146b-e933-4cb2-a789-bbca5312b517",
- "profile_id": "bfcb6779-b1f9-41fc-92d7-88f8bc1d12e8",
- "title": "string",
- "status": "scheduled",
- "quality": "sd",
- "start_time": "2019-08-24T14:15:22Z",
- "end_time": "2019-08-24T14:15:22Z",
- "duration_seconds": 0,
- "size_bytes": 0,
- "expires_at": "2019-08-24T14:15:22Z",
- "requested_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| profile_id required | string <uuid> |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "profile_id": "bfcb6779-b1f9-41fc-92d7-88f8bc1d12e8",
- "target_type": "epg_program",
- "target_id": "d3bcdc92-4191-401b-ad0c-42056c6efab9",
- "status": "scheduled",
- "notify_before_minutes": 10,
- "remind_at": "2019-08-24T14:15:22Z",
- "channels": [
- "push"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}| profile_id required | string <uuid> |
| target_type required | string Enum: "epg_program" "live_channel" "upcoming_release" |
| target_id required | string <uuid> |
| notify_before_minutes | integer >= 0 Default: 10 |
| remind_at required | string <date-time> |
| channels | Array of strings Items Enum: "push" "email" |
{- "target_type": "epg_program",
- "target_id": "d3bcdc92-4191-401b-ad0c-42056c6efab9",
- "notify_before_minutes": 10,
- "remind_at": "2019-08-24T14:15:22Z",
- "channels": [
- "push"
]
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "profile_id": "bfcb6779-b1f9-41fc-92d7-88f8bc1d12e8",
- "target_type": "epg_program",
- "target_id": "d3bcdc92-4191-401b-ad0c-42056c6efab9",
- "status": "scheduled",
- "notify_before_minutes": 10,
- "remind_at": "2019-08-24T14:15:22Z",
- "channels": [
- "push"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| profile_id required | string <uuid> |
| reminder_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}| profile_id required | string <uuid> |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
| status | string Enum: "queued" "downloading" "ready" "expired" "failed" |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "quality": "SD",
- "status": "queued",
- "progress_percent": 100,
- "error_code": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "file_size_bytes": 0,
- "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}Queues a movie or episode for offline download on the requesting device. Requires an active subscription with download entitlement and available storage quota.
| profile_id required | string <uuid> |
| X-Device-Id required | string <= 128 characters Registered device identifier. |
| content_type required | string Enum: "movie" "episode" |
| content_id required | string <uuid> |
| quality required | string Enum: "SD" "HD" "FHD" |
{- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "quality": "SD"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "quality": "SD",
- "status": "queued",
- "progress_percent": 100,
- "error_code": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "file_size_bytes": 0,
- "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| profile_id required | string <uuid> |
| download_id required | string <uuid> |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "quality": "SD",
- "status": "queued",
- "progress_percent": 100,
- "error_code": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "file_size_bytes": 0,
- "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Cancels a queued/in-progress download or removes a completed one from the device.
| profile_id required | string <uuid> |
| download_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}| profile_id required | string <uuid> |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "value": 1,
- "review": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}| profile_id required | string <uuid> |
| content_type required | string Enum: "movie" "show" "episode" |
| content_id required | string <uuid> |
| value required | integer [ 1 .. 5 ] |
| review | string <= 2000 characters |
{- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "value": 1,
- "review": "string"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "value": 1,
- "review": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| profile_id required | string <uuid> |
| rating_id required | string <uuid> |
| value | integer [ 1 .. 5 ] |
| review | string <= 2000 characters |
{- "value": 1,
- "review": "string"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content_type": "movie",
- "content_id": "713e4c61-5a69-43fb-a600-2e2699462e14",
- "value": 1,
- "review": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| profile_id required | string <uuid> |
| rating_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}Returns all resource-level content grants. Filter by resource type/ID or grantee to audit who can do what to specific assets.
| resource_type | string Enum: "movie" "show" "channel" "collection" "epg_channel" Filter by content resource type. |
| resource_id | string <uuid> Filter by content asset ID. |
| grantee_type | string Enum: "user" "role" |
| grantee_id | string <uuid> Filter by user or role ID. |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "resource_type": "movie",
- "resource_id": "4d5215ed-38bb-48ed-879a-fdb9ca58522f",
- "grantee_type": "user",
- "grantee_id": "97e4ba58-efa7-4ea9-9f1b-7100b3a3aa86",
- "actions": [
- "update",
- "publish"
], - "granted_by": "a8e4a498-f971-4203-a849-4967743579d4",
- "granted_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}Grants a user or role specific actions on a single content asset. Idempotent on (resource_id, grantee_id, actions) — use PATCH to extend actions on an existing grant.
| resource_type required | string Enum: "movie" "show" "channel" "collection" "epg_channel" |
| resource_id required | string <uuid> |
| grantee_type required | string Enum: "user" "role" |
| grantee_id required | string <uuid> |
| actions required | Array of strings (ContentGrantAction) non-empty Items Enum: "read" "update" "delete" "publish" "unpublish" "manage_epg" "manage_media" |
| expires_at | string or null <date-time> |
{- "resource_type": "movie",
- "resource_id": "4d5215ed-38bb-48ed-879a-fdb9ca58522f",
- "grantee_type": "user",
- "grantee_id": "97e4ba58-efa7-4ea9-9f1b-7100b3a3aa86",
- "actions": [
- "read"
], - "expires_at": "2019-08-24T14:15:22Z"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "resource_type": "movie",
- "resource_id": "4d5215ed-38bb-48ed-879a-fdb9ca58522f",
- "grantee_type": "user",
- "grantee_id": "97e4ba58-efa7-4ea9-9f1b-7100b3a3aa86",
- "actions": [
- "update",
- "publish"
], - "granted_by": "a8e4a498-f971-4203-a849-4967743579d4",
- "granted_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z"
}
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "resource_type": "movie",
- "resource_id": "4d5215ed-38bb-48ed-879a-fdb9ca58522f",
- "grantee_type": "user",
- "grantee_id": "97e4ba58-efa7-4ea9-9f1b-7100b3a3aa86",
- "actions": [
- "update",
- "publish"
], - "granted_by": "a8e4a498-f971-4203-a849-4967743579d4",
- "granted_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z"
}
}Replaces the action list or adjusts expiry on an existing grant.
| grant_id required | string <uuid> |
| actions | Array of strings (ContentGrantAction) non-empty Items Enum: "read" "update" "delete" "publish" "unpublish" "manage_epg" "manage_media" |
| expires_at | string or null <date-time> |
{- "actions": [
- "read"
], - "expires_at": "2019-08-24T14:15:22Z"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "resource_type": "movie",
- "resource_id": "4d5215ed-38bb-48ed-879a-fdb9ca58522f",
- "grantee_type": "user",
- "grantee_id": "97e4ba58-efa7-4ea9-9f1b-7100b3a3aa86",
- "actions": [
- "update",
- "publish"
], - "granted_by": "a8e4a498-f971-4203-a849-4967743579d4",
- "granted_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z"
}
}Permanently removes the grant. The grantee immediately loses the associated actions on that asset.
| grant_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}Returns all CMS roles (system and custom), optionally filtered by type or active status.
| type | string Enum: "system" "custom" |
| is_active | boolean |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "content_publisher",
- "display_name": "Content Publisher",
- "description": "Can create, update, and publish content. Cannot delete.",
- "type": "system",
- "parent_role_id": "7ea77ce3-4218-4d39-ad84-02444a2f4ee7",
- "permissions": [
- "content.publish",
- "content.write"
], - "inherited_permissions": [
- "string"
], - "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}Creates a new custom CMS role. name must be unique across all CMS roles. All permission keys must exist in the CMS catalogue. Requires superadmin scope.
| name required | string^[a-z][a-z0-9_]{1,63}$ |
| display_name | string |
| description | string |
| parent_role_id | string or null <uuid> Optional parent role for permission inheritance. Max depth 3. |
| permissions required | Array of strings non-empty |
{- "name": "epg_editor",
- "display_name": "string",
- "description": "string",
- "parent_role_id": "7ea77ce3-4218-4d39-ad84-02444a2f4ee7",
- "permissions": [
- "epg.write"
]
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "content_publisher",
- "display_name": "Content Publisher",
- "description": "Can create, update, and publish content. Cannot delete.",
- "type": "system",
- "parent_role_id": "7ea77ce3-4218-4d39-ad84-02444a2f4ee7",
- "permissions": [
- "content.publish",
- "content.write"
], - "inherited_permissions": [
- "string"
], - "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "content_publisher",
- "display_name": "Content Publisher",
- "description": "Can create, update, and publish content. Cannot delete.",
- "type": "system",
- "parent_role_id": "7ea77ce3-4218-4d39-ad84-02444a2f4ee7",
- "permissions": [
- "content.publish",
- "content.write"
], - "inherited_permissions": [
- "string"
], - "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Updates a custom CMS role. System roles are immutable — returns 403. Changing permissions replaces the full set; use GET /admin/roles/{role_id} to read the current set first. Requires superadmin scope.
| role_id required | string <uuid> |
| display_name | string |
| description | string |
| parent_role_id | string or null <uuid> |
| permissions | Array of strings non-empty |
| is_active | boolean |
{- "display_name": "string",
- "description": "string",
- "parent_role_id": "7ea77ce3-4218-4d39-ad84-02444a2f4ee7",
- "permissions": [
- "string"
], - "is_active": true
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "content_publisher",
- "display_name": "Content Publisher",
- "description": "Can create, update, and publish content. Cannot delete.",
- "type": "system",
- "parent_role_id": "7ea77ce3-4218-4d39-ad84-02444a2f4ee7",
- "permissions": [
- "content.publish",
- "content.write"
], - "inherited_permissions": [
- "string"
], - "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Permanently deletes a custom CMS role and revokes all existing assignments. System roles cannot be deleted. Requires superadmin scope. All deletions are audit-logged.
| role_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}Returns the paginated list of users who currently hold this role.
| role_id required | string <uuid> |
| cursor | string Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items per page (1–100, default 20). |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "role_id": "ac4e70c8-d5be-48af-93eb-760f58fc91a9",
- "role_name": "content_publisher",
- "granted_by": "a8e4a498-f971-4203-a849-4967743579d4",
- "granted_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}Returns all CMS roles currently assigned to the specified user.
| user_id required | string <uuid> |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "role_id": "ac4e70c8-d5be-48af-93eb-760f58fc91a9",
- "role_name": "content_publisher",
- "granted_by": "a8e4a498-f971-4203-a849-4967743579d4",
- "granted_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z"
}
]
}Grants the specified CMS role to a user. Assigning superadmin requires superadmin scope. All assignments are audit-logged.
| user_id required | string <uuid> |
| role_id required | string <uuid> |
| expires_at | string or null <date-time> Optional expiry. Omit for a permanent assignment. |
{- "role_id": "ac4e70c8-d5be-48af-93eb-760f58fc91a9",
- "expires_at": "2019-08-24T14:15:22Z"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "role_id": "ac4e70c8-d5be-48af-93eb-760f58fc91a9",
- "role_name": "content_publisher",
- "granted_by": "a8e4a498-f971-4203-a849-4967743579d4",
- "granted_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z"
}
}Removes the CMS role assignment immediately. The user loses all CMS permissions granted exclusively by that role. All revocations are audit-logged.
| user_id required | string <uuid> |
| role_id required | string <uuid> |
{- "code": "UNAUTHORIZED",
- "message": "Access token is missing or invalid.",
- "request_id": "018fde1a-9b2c-7f3e-8d4a-2b5c6e7f8a9b"
}Permission catalogue, grouping, synchronous permission checks, and per-user effective permission resolution
Returns the full CMS permission catalogue. Filterable by resource.
| resource | string Enum: "content" "channels" "epg" "media" "collections" "genres" "analytics" "webhooks" "geo_restrictions" "grants" "roles" Filter by resource, e.g. |
{- "data": [
- {
- "key": "content.publish",
- "display_name": "Publish Content",
- "description": "Allows publishing movies, shows, and episodes to subscribers.",
- "resource": "content",
- "action": "publish",
- "group": "content_management",
- "is_deprecated": false
}
], - "meta": {
- "total": 2450,
- "count": 20,
- "limit": 20,
- "has_more": true,
- "next_cursor": "eyJpZCI6IjEyMyJ9",
- "prev_cursor": null
}
}Returns the full CMS permission catalogue organised into groups. Use this to build a role-editor UI.
{- "data": [
- {
- "key": "user_management",
- "display_name": "User Management",
- "description": "string",
- "permissions": [
- "users.read",
- "users.write"
]
}
]
}Synchronously evaluates whether a user holds a given permission, optionally scoped to a specific resource.
Intended for internal service-to-service authorisation checks. Responses include evaluated_at to support
short-lived client-side caching. Always returns 200; use the allowed field to branch logic.
Rate limit: 600 req / min per calling service.
| subject_id required | string <uuid> ID of the user whose access is being checked. |
| permission required | string The permission key to evaluate, e.g. |
| resource_type | string Optional resource type for resource-scoped checks. |
| resource_id | string <uuid> Optional ID of the specific resource for resource-scoped checks. |
{- "subject_id": "80e197be-61ad-4068-b4ff-a483fb5c18f9",
- "permission": "users.suspend",
- "resource_type": "movie",
- "resource_id": "4d5215ed-38bb-48ed-879a-fdb9ca58522f"
}{- "data": {
- "allowed": true,
- "subject_id": "80e197be-61ad-4068-b4ff-a483fb5c18f9",
- "permission": "users.suspend",
- "resource_type": "string",
- "resource_id": "4d5215ed-38bb-48ed-879a-fdb9ca58522f",
- "matched_role": "string",
- "evaluated_at": "2019-08-24T14:15:22Z"
}
}Returns the complete, deduplicated set of CMS permissions a user holds, resolved across all assigned roles and their inheritance chains. Useful for access-control debugging and UI personalisation.
| user_id required | string <uuid> |
{- "data": {
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "roles": [
- "content_editor",
- "epg_manager"
], - "permissions": [
- "content.read",
- "content.write",
- "epg.read",
- "epg.write"
], - "evaluated_at": "2019-08-24T14:15:22Z"
}
}Returns all publicly visible subscription plans.
| currency | string = 3 characters Example: currency=USD |
| billing_cycle | string Enum: "monthly" "quarterly" "semi_annual" "annual" |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Standard HD",
- "description": "string",
- "price": 9.99,
- "currency": "USD",
- "billing_cycle": "monthly",
- "max_profiles": 1,
- "max_concurrent_streams": 1,
- "max_devices": 1,
- "max_quality": "SD",
- "has_downloads": true,
- "allow_download_count": 0,
- "has_ads": true,
- "has_hdr": true,
- "has_dolby_atmos": true,
- "trial_days": 0,
- "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Standard HD",
- "description": "string",
- "price": 9.99,
- "currency": "USD",
- "billing_cycle": "monthly",
- "max_profiles": 1,
- "max_concurrent_streams": 1,
- "max_devices": 1,
- "max_quality": "SD",
- "has_downloads": true,
- "allow_download_count": 0,
- "has_ads": true,
- "has_hdr": true,
- "has_dolby_atmos": true,
- "trial_days": 0,
- "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}