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.
AuthorizationEvery endpoint in this folder requires an API Key in the
Authorizationheader. Send the key directly — noBearerprefix.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
| Concept | Description |
|---|---|
| Playlist | Container bound to a single owner (user_id). name, creator_name and access_type are required at creation. |
| Access type | anyone_with_link (open) or anyone_with_password (requires password). |
| Password | Stored AES‑256‑CBC encrypted on the server. Never returned in any response — the API strips it from GET/PUT bodies. |
| Videos | Linked through playlist_videos with an order integer. Order can be set by the client or auto‑incremented by the server. |
| External button | Optional { text, url, size } shown on the public page — all three subfields are required if the object is present. |
| Logo | Stored as an image_id link to Panda Images (separate upload flow). |
Limits & rules
name,access_type,creator_nameare required on create.passwordis required whenaccess_type === "anyone_with_password".- Maximum 500 videos per playlist (
addreturns 400 once the limit is crossed). videos[].video_idmust be a UUID owned by the same user (cross‑user video IDs return 400).
Endpoints
| Endpoint | Operation |
|---|---|
| List user playlists | GET /playlists |
| Create new playlist | POST /playlists |
| Get playlist details | GET /playlists/{playlist_id} |
| Update playlist | PUT /playlists/{playlist_id} |
| Delete playlist | DELETE /playlists/{playlist_id} |
| Get playlist videos | GET /playlists/{playlist_id}/videos |
| Add videos to playlist (canonical) | POST /playlists/{playlist_id}/videos |
| Remove video from playlist | DELETE /playlists/{playlist_id}/videos/{video_id} |
| Get playlist details with password (public) | POST /playlist_details/{playlist_id} |
