curl --request POST \
--url https://app.trackplay.io/api/v1/playlists \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"video_id": 123,
"playlist_code": "<string>",
"items": [
{
"video_code": "<string>",
"title": "<string>"
}
],
"auto_advance": true,
"loop": true
}
'import requests
url = "https://app.trackplay.io/api/v1/playlists"
payload = {
"video_id": 123,
"playlist_code": "<string>",
"items": [
{
"video_code": "<string>",
"title": "<string>"
}
],
"auto_advance": True,
"loop": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
video_id: 123,
playlist_code: '<string>',
items: [{video_code: '<string>', title: '<string>'}],
auto_advance: true,
loop: true
})
};
fetch('https://app.trackplay.io/api/v1/playlists', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.trackplay.io/api/v1/playlists",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'video_id' => 123,
'playlist_code' => '<string>',
'items' => [
[
'video_code' => '<string>',
'title' => '<string>'
]
],
'auto_advance' => true,
'loop' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.trackplay.io/api/v1/playlists"
payload := strings.NewReader("{\n \"video_id\": 123,\n \"playlist_code\": \"<string>\",\n \"items\": [\n {\n \"video_code\": \"<string>\",\n \"title\": \"<string>\"\n }\n ],\n \"auto_advance\": true,\n \"loop\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.trackplay.io/api/v1/playlists")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"video_id\": 123,\n \"playlist_code\": \"<string>\",\n \"items\": [\n {\n \"video_code\": \"<string>\",\n \"title\": \"<string>\"\n }\n ],\n \"auto_advance\": true,\n \"loop\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trackplay.io/api/v1/playlists")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"video_id\": 123,\n \"playlist_code\": \"<string>\",\n \"items\": [\n {\n \"video_code\": \"<string>\",\n \"title\": \"<string>\"\n }\n ],\n \"auto_advance\": true,\n \"loop\": true\n}"
response = http.request(request)
puts response.read_body{
"playlist": {
"video_id": 123,
"video_code": "<string>",
"title": "<string>",
"playback_mode": "linear",
"playlist_code": "<string>",
"item_count": 123,
"auto_advance": true,
"loop": true,
"lesson_navigation": "sidebar"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"message": "No query results for model [App\\\\Models\\\\WorkspaceVideo] 481"
}{
"message": "The given data was invalid.",
"errors": {}
}Enable a playlist on a video
Turns an existing video into a playlist or course by attaching playlist settings to it. There is no separate playlist resource to create: video_id names the video that becomes the playlist’s anchor, and the anchor is what every other playlist endpoint addresses by its playlist path parameter.
You can seed the playlist’s items in the same call with items, or add them one at a time afterward with POST /playlists/{playlist}/videos.
Requires a token with the videos:write scope.
curl --request POST \
--url https://app.trackplay.io/api/v1/playlists \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"video_id": 123,
"playlist_code": "<string>",
"items": [
{
"video_code": "<string>",
"title": "<string>"
}
],
"auto_advance": true,
"loop": true
}
'import requests
url = "https://app.trackplay.io/api/v1/playlists"
payload = {
"video_id": 123,
"playlist_code": "<string>",
"items": [
{
"video_code": "<string>",
"title": "<string>"
}
],
"auto_advance": True,
"loop": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
video_id: 123,
playlist_code: '<string>',
items: [{video_code: '<string>', title: '<string>'}],
auto_advance: true,
loop: true
})
};
fetch('https://app.trackplay.io/api/v1/playlists', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.trackplay.io/api/v1/playlists",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'video_id' => 123,
'playlist_code' => '<string>',
'items' => [
[
'video_code' => '<string>',
'title' => '<string>'
]
],
'auto_advance' => true,
'loop' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.trackplay.io/api/v1/playlists"
payload := strings.NewReader("{\n \"video_id\": 123,\n \"playlist_code\": \"<string>\",\n \"items\": [\n {\n \"video_code\": \"<string>\",\n \"title\": \"<string>\"\n }\n ],\n \"auto_advance\": true,\n \"loop\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.trackplay.io/api/v1/playlists")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"video_id\": 123,\n \"playlist_code\": \"<string>\",\n \"items\": [\n {\n \"video_code\": \"<string>\",\n \"title\": \"<string>\"\n }\n ],\n \"auto_advance\": true,\n \"loop\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trackplay.io/api/v1/playlists")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"video_id\": 123,\n \"playlist_code\": \"<string>\",\n \"items\": [\n {\n \"video_code\": \"<string>\",\n \"title\": \"<string>\"\n }\n ],\n \"auto_advance\": true,\n \"loop\": true\n}"
response = http.request(request)
puts response.read_body{
"playlist": {
"video_id": 123,
"video_code": "<string>",
"title": "<string>",
"playback_mode": "linear",
"playlist_code": "<string>",
"item_count": 123,
"auto_advance": true,
"loop": true,
"lesson_navigation": "sidebar"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"message": "No query results for model [App\\\\Models\\\\WorkspaceVideo] 481"
}{
"message": "The given data was invalid.",
"errors": {}
}Authorizations
A scoped token minted in Settings → API tokens. Send it as Authorization: Bearer tplt_… or X-API-Key: tplt_….
Headers
Retry-safe key. The first response for a given key is cached for 24 hours and replayed on a repeat, with Idempotency-Replayed: true set.
Body
The video that becomes the playlist's primary video. Required. Playlists have no resource of their own: enabling one turns this video into the playlist's anchor.
Defaults to linear.
linear, course 128Seed the playlist with items in one call, instead of adding them one at a time with POST /playlists/{playlist}/videos.
Show child attributes
Show child attributes
Defaults to true.
Defaults to false.
rail, button Response
The playlist.
Show child attributes
Show child attributes