Playlist downloads run entirely in the background. You start a job withDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/coah80/yoink/llms.txt
Use this file to discover all available pages before exploring further.
POST /api/playlist/start, receive a jobId, and then poll GET /api/playlist/status/{jobId} until status is complete. At that point a downloadToken is available that you can use to fetch the finished ZIP archive from GET /api/playlist/download/{token}.
Individual video failures within a playlist do not abort the entire job. Failed videos are tracked in the failedVideos array in the status response — the job completes as long as at least one video was downloaded successfully.
Playlist download tokens expire after 12 hours (
PlaylistDownloadExp). Download the ZIP before then. The server enforces a maximum of 1000 videos per playlist run (MaxPlaylistVideos); use resumeFrom to process large playlists in batches.POST /api/playlist/start
Validates the playlist URL, enqueues the download job, and returns ajobId immediately. The actual download begins asynchronously.
Body Fields
URL of the playlist (YouTube, SoundCloud, etc.). Must be fully-qualified (
http:// or https://).Output mode.
video downloads the video stream; audio extracts audio only.Target video resolution. One of
2160p, 1440p, 1080p, 720p, 480p, 360p. Ignored when format=audio.Video container format. One of
mp4, webm, mkv, mov. Ignored when format=audio.Audio codec/container when
format=audio. One of mp3, m4a, opus, wav, flac.Audio bitrate in kbps. One of
64, 96, 128, 192, 256, 320.Session identifier for per-client job limiting (max 3 concurrent per client).
1-based index of the playlist video to start from. Use this to process large playlists in chunks — e.g. set
resumeFrom=51 to process videos 51–1050 in the next run. Must not exceed the total number of videos in the playlist.Response
Errors
| Status | Meaning |
|---|---|
400 | Invalid URL or body |
429 | Too many concurrent jobs for this client |
503 | Server is at playlist job capacity |
GET /api/playlist/status/
Returns the current state of a playlist download job.Response Fields
Current job state. One of:
starting— fetching playlist infodownloading— actively downloading videoszipping— assembling the ZIP archivecomplete— ZIP is ready to downloaderror— job failed
Human-readable status message describing current activity.
Overall completion percentage, 0–100.
Title of the playlist as reported by yt-dlp.
Total number of videos in the playlist (may differ from the number attempted if
resumeFrom was set).1-based index of the first video that was (or will be) downloaded in this run. Reflects the
resumeFrom value.1-based index of the video currently being downloaded.
Title of the video currently being downloaded.
Number of videos successfully downloaded so far.
Array of objects describing videos that failed to download. Each object contains:
num(number) — 1-based index in the playlisttitle(string) — video titlereason(string) — user-friendly error description
Total number of failed videos.
Present only when
status is complete. Pass this to GET /api/playlist/download/{token}.Present only when
status is complete. The ZIP filename (e.g. My Playlist.zip).Present only when
status is complete. ZIP file size in bytes.Current download speed (e.g.
"5.2MiB/s"). Present during active video downloads.Estimated time remaining for the current video (e.g.
"00:01:23"). Present during active video downloads.curl Example
GET /api/playlist/download/
Streams the completed ZIP archive. The token is obtained from thedownloadToken field in the status response.
Response
Streams a ZIP archive (application/zip) with Content-Disposition: attachment; filename="<playlist title>.zip". The ZIP contains one file per successfully downloaded video, named 001 - Video Title.mp4 (zero-padded three-digit index).