Yoink’s playlist feature lets you batch-download YouTube playlists as a single ZIP archive. The job runs asynchronously in the background — you start it, poll for status, and download the finished archive when it’s ready. Each video inside the ZIP is named with a zero-padded track number so your files stay in order.Documentation 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.
How playlist downloads work
Behind the scenes, Yoink fetches the full playlist index via yt-dlp’s--flat-playlist mode, then iterates through each video sequentially. YouTube videos are downloaded through yt-dlp first, with Cobalt as a fallback. After each video is processed it is written into a local directory. When all videos have been attempted the entire directory is compressed into a single ZIP and a time-limited download token is issued.
Start the playlist job
Send a Response:
POST /api/playlist/start request with the playlist URL and your desired format options. The server responds immediately with a jobId.Poll for status
Repeatedly call Example in-progress response:When the job finishes,
GET /api/playlist/status/{jobId} until status is complete or error. The response gives you granular per-video progress.status becomes "complete" and a downloadToken field appears in the response alongside fileName and fileSize.Request parameters
| Field | Default | Description |
|---|---|---|
url | — | YouTube playlist URL |
format | video | video or audio |
quality | 1080p | 2160p, 1440p, 1080p, 720p, 480p, 360p |
container | mp4 | mp4, webm, mkv, mov |
audioFormat | mp3 | mp3, m4a, opus, wav, flac |
audioBitrate | 320 | 64, 96, 128, 192, 256, 320 |
clientId | — | Ties the job to a client for concurrency tracking |
resumeFrom | 1 | 1-based video index to start from (see resume support) |
Status response fields
| Field | Type | Description |
|---|---|---|
status | string | starting, downloading, zipping, complete, error |
message | string | Human-readable progress message |
progress | number | 0–100 overall percentage |
totalVideos | number | Total videos found in the playlist |
currentVideo | number | Index of the video currently being downloaded |
currentVideoTitle | string | Title of the video currently being downloaded |
videosCompleted | number | Videos successfully downloaded so far |
failedVideos | array | Objects with num, title, and reason for each failure |
failedCount | number | Total number of failed videos |
downloadToken | string | Present when status === "complete" |
fileName | string | ZIP filename (e.g. My Playlist.zip) |
fileSize | number | ZIP file size in bytes |
Resuming a partial download
If a previous run was interrupted or you want to skip already-downloaded videos, passresumeFrom as the 1-based index of the first video you want to include:
The maximum number of videos processed in a single run is 1,000 (
MaxPlaylistVideos). For playlists larger than 1,000 videos, split the download across multiple runs using resumeFrom.Stopping early
You can signal Yoink to stop downloading and immediately package the videos it has already completed:ZIP file structure
Each video in the ZIP is named using a three-digit zero-padded sequence number followed by its sanitised title:Failed videos
Videos that could not be downloaded (private, geo-blocked, deleted, etc.) are tracked in thefailedVideos array throughout the job. The final complete response includes the full list so you know exactly which items to follow up on manually.
Finish Early
Stop a running job and package whatever has been downloaded so far by calling
POST /api/finish-early/{id}.Download Expiry
The ZIP download link expires 12 hours after the job completes. Download promptly — the file is removed from the server afterwards.