Introduction
NextGen Live API supports manifest filtering through playlist groups. This feature allows you to create custom manifests with selected renditions from all the output renditions of your live stream. This is useful for scenarios where you want to deliver different quality tiers to different audiences or devices.
The playlist groups feature enables you to:
- Create multiple custom manifests from a single live channel
- Filter renditions based on video codec, resolution, bitrate, audio codec, and language
- Maintain the default manifest with all renditions while providing filtered alternatives
- Generate playback tokens for specific playlist groups
Workflow Overview
The playlist groups workflow consists of three main steps:
- Create a job with playlist groups - Define filtering criteria in your channel creation request
- Create a playback token - Generate a token for the specific playlist group you want to access
- Create playback URL - Use the token to get the playback URL for the filtered manifest
Step 1: Create Channel with Playlist Groups
To create a job with playlist groups, include the playlist_groups
field in the manifest
section of your job creation request. The playlist_groups
field is an array of objects that define filtering conditions and assign unique names to each custom manifest.
Filtering Options
You can filter renditions based on the following criteria:
Filter | Type | Description | Supported Values |
---|---|---|---|
video_codec |
Array of strings | Filter by video codec | h264 , h265 |
video_height |
Object | Filter by video height range (inclusive) | min : 1-2160, max : 1-2160 |
video_bitrate |
Object | Filter by video bitrate range (inclusive) | min : 0+, max : up to 2147483647 |
audio_codec |
Array of strings | Filter by audio codec | aac |
audio_bitrate |
Object | Filter by audio bitrate range (inclusive) | min : 0+, max : up to 2147483647 |
language_code |
Array of strings | Filter by audio language code | ISO 639 language codes (e.g., eng , spa ) |
Example: Job Creation with Playlist Groups
Here's an example that creates a job with two custom manifests:
playlist-fullhd
: Contains renditions between 721p and 1080p (Full HD and above)playlist-hd
: Contains renditions up to 720p (HD and below)
{
"name": "Test Job with Playlist Groups",
"description": "Live job with manifest filtering",
"long_description": "Live event job with custom playlist groups",
"tags": [
"sports"
],
"input": {
"protocol": "rtp",
"whitelist_cidr_blocks": [
"0.0.0.0/0"
],
"fixed_ingest_ip": false
},
"type": "event",
"live_to_vod": false,
"audio_only": false,
"outputs": {
"video": [
{
"label": "1080p",
"height": 1080,
"width": 1920,
"bitrate": 6000000,
"codec": "h264",
"codec_options": {
"profile": "high",
"level": "4.2"
},
"keyframe_rate": 0.5,
"sample_aspect_ratio": "1:1",
"decoder_buffer_size": 9000000,
"max_bitrate": 7200000
},
{
"label": "720p",
"height": 720,
"width": 1280,
"bitrate": 4000000,
"codec": "h264",
"codec_options": {
"level": "4",
"profile": "main"
}
},
{
"label": "480p",
"height": 480,
"width": 640,
"bitrate": 2000000,
"codec": "h264",
"codec_options": {
"profile": "main"
}
}
],
"audio": [
{
"label": "aac1",
"input_selector_name": "default",
"language_code": "eng",
"codec": "aac",
"bitrate": 128000,
"sample_rate": 44100
}
]
},
"manifest": {
"name": "playlist",
"segment_duration_seconds": 6,
"playlist_window_seconds": 60,
"segment_container_format": "cmaf",
"hls": {},
"playlist_groups": [
{
"name": "playlist-fullhd",
"video_height": {
"min": 721,
"max": 1080
}
},
{
"name": "playlist-hd",
"video_height": {
"min": 1,
"max": 720
}
}
]
},
"region": "",
"maintenance_preferences": {
"day": "MONDAY"
}
}
This configuration creates three manifests:
playlist
: Default manifest with all renditions (1080p, 720p, 480p)playlist-fullhd
: Custom manifest with only the 1080p renditionplaylist-hd
: Custom manifest with 720p and 480p renditions
Step 2: Create Playback Token
To access a specific playlist group, you need to create a playback token that specifies the playlist_name
. If no playlist_name
is specified, the token will use the default manifest.
Endpoint
POST /v2/accounts/{account_id}/playback/{job_id}/token
Example Request
To create a token for the playlist-hd
manifest:
{
"dvr": false,
"low_latency": false,
"manifest_format": "hls",
"playlist_name": "playlist-hd",
"byocdn_id": "",
"ssai": false,
"ad_config_id": "",
}
Example Response
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtbiI6InBsYXlsaXN0LWhkIiwiaXNzIjoiYmxpdmUtcGxheWJhY2stbWFuYWdlbWVudC1hcGkiLCJzdWIiOiJwbGF5YmFja3Rva2VuIiwiYXVkIjpbIjcwNzAyMTgzNTE5MjAyIl0sImp0aSI6IjcwNzUzMDg4MzM4MTEzIn0.c_lxzeGRybNrakEAzaLKS_66b5uiY2C_3B6Q4sVxRX4"
}
Step 3: Create Playback URL
Use the playback token from Step 2 to get the playback URL for your filtered manifest.
Endpoint
GET https://edge.api.brightcove.com/playback/v1/accounts/{account_id}/videos/{job_id}?livePlaybackToken={token}
Example Response
The response will include the playback URLs for the specified playlist group:
[
{
"codecs": "mp4a,avc1",
"ext_x_version": "6",
"key_systems": {
"com.apple.fps.1_0": {
"certificate_url": "https://license.live.qa.brightcove.com/cert/fp?token=...",
"key_request_url": "https://license.live.qa.brightcove.com/lic/fp?token=..."
},
"com.widevine.alpha": {
"license_url": "https://license.live.qa.brightcove.com/lic/wv?token=..."
}
},
"src": "https://fastly.live.qa.brightcove.com/70753088338113/us-east-1/70702183519202/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJob3N0IjoiZGZ4Yzc5LmVncmVzcy5zenkzeHgiLCJhY2NvdW50X2lkIjoiNzA3MDIxODM1MTkyMDIiLCJlaG4iOiJmYXN0bHkubGl2ZS5xYS5icmlnaHRjb3ZlLmNvbSIsImlzcyI6ImJsaXZlLXBsYXliYWNrLXNvdXJjZS1hcGkiLCJzdWIiOiJwYXRobWFwdG9rZW4iLCJhdWQiOlsiNzA3MDIxODM1MTkyMDIiXSwianRpIjoiNzA3NTMwODgzMzgxMTMifQ.GMj5BoRaCtnZdj_HcrKOM6mX3F4ksbAM_SIrmQ9evyw/playlist-hd-hls.m3u8",
"type": "application/x-mpegURL",
"uploaded_at": "2025-08-18T14:04:46.48Z"
}
]
Note that the manifest URL includes the playlist group name (playlist-hd-hls.m3u8
) and will only contain the renditions that match the filtering criteria defined for that playlist group.
Advanced Filtering Examples
Multiple Filter Criteria
You can combine multiple filters in a single playlist group:
{
"name": "mobile-optimized",
"video_height": {
"min": 1,
"max": 720
},
"video_bitrate": {
"min": 0,
"max": 2000000
},
"video_codec": ["h264"]
}
Best Practices
- Descriptive Names: Use clear, descriptive names for your playlist groups that indicate their purpose (e.g.,
mobile-hd
,premium-4k
) - Range Validation: Ensure your min/max ranges are logical and cover the renditions you want to include
- Testing: Test your playlist groups with different device types and network conditions to ensure optimal performance
- Fallback Strategy: Always maintain the default manifest as a fallback option
Limitations
- Playlist groups only affect the manifest content; the actual renditions are still generated based on your channel's output configuration
- The default manifest will always contain all renditions regardless of playlist group settings
- Range filters require both min and max values
- Filtering is applied at manifest generation time, not at encoding time