Playlists


Playlists

A playlist groups a sequence of videos with a public viewer page. Each playlist has an access policy (anyone_with_link or anyone_with_password), an ordered list of videos, branding (custom logo, creator name, optional external button) and a hard cap of 500 videos.

📘

Authorization

Every endpoint in this folder requires an API Key in the Authorization header. Send the key directly — no Bearer prefix.

Exception: Get playlist details with password is public (no auth) — it is the endpoint the public viewer page hits with the visitor's password.

How it works

ConceptDescription
PlaylistContainer bound to a single owner (user_id). name, creator_name and access_type are required at creation.
Access typeanyone_with_link (open) or anyone_with_password (requires password).
PasswordStored AES‑256‑CBC encrypted on the server. Never returned in any response — the API strips it from GET/PUT bodies.
VideosLinked through playlist_videos with an order integer. Order can be set by the client or auto‑incremented by the server.
External buttonOptional { text, url, size } shown on the public page — all three subfields are required if the object is present.
LogoStored as an image_id link to Panda Images (separate upload flow).

Limits & rules

  • name, access_type, creator_name are required on create.
  • password is required when access_type === "anyone_with_password".
  • Maximum 500 videos per playlist (add returns 400 once the limit is crossed).
  • videos[].video_id must be a UUID owned by the same user (cross‑user video IDs return 400).

Endpoints

EndpointOperation
List user playlistsGET /playlists
Create new playlistPOST /playlists
Get playlist detailsGET /playlists/{playlist_id}
Update playlistPUT /playlists/{playlist_id}
Delete playlistDELETE /playlists/{playlist_id}
Get playlist videosGET /playlists/{playlist_id}/videos
Add videos to playlist (canonical)POST /playlists/{playlist_id}/videos
Remove video from playlistDELETE /playlists/{playlist_id}/videos/{video_id}
Get playlist details with password (public)POST /playlist_details/{playlist_id}