Skip to main content

Overview

Batch downloads allow you to download all videos from a YouTube playlist or all episodes from a Spotify podcast show with a single API call. Tornado automatically extracts all URLs and creates individual jobs for each — there is no separate batch endpoint, this triggers automatically off the url you send to POST /jobs.
Batch downloads are supported for:
  • YouTube Playlists (list=PL..., and channel-uploads/UU.../course-style OL... playlists)
  • Spotify Shows (podcast episodes)
YouTube’s auto-generated “Radio”/Mix queues (list=RD..., the parameter YouTube’s own UI attaches automatically when you open a video from an autoplay queue, the homepage, or related videos — not a real playlist) are deliberately excluded from auto-detection, along with Watch Later (list=WL) and Liked videos (list=LL). A URL carrying one of these is downloaded as a single video, not a batch. See Playlist Auto-Detection for the full breakdown — getting this wrong (treating a Mix queue as a real playlist) previously caused two production incidents where a single-video request silently turned into thousands of jobs.

How It Works

1

Submit Show URL

Send a Spotify show URL to the /jobs endpoint
2

Episode Extraction

Tornado extracts all episode URLs from the show (can take 30-120 seconds for large shows)
3

Batch Creation

A batch job is created with individual jobs for each episode
4

Parallel Processing

Episodes are downloaded in parallel for maximum speed
5

Progress Tracking

Track overall progress via the batch status endpoint

Create a Batch

YouTube Playlist

Spotify Show

Batch Response

The response shape depends on the source. Spotify shows return episode metadata:
Spotify Show
YouTube playlists return a simpler shape with total_videos and video_jobs (no episodes/total_episodes/paused):
YouTube Playlist
The two shapes differ: read total_episodes/episode_jobs for Spotify shows, and total_videos/video_jobs for YouTube playlists. The Python example below targets Spotify shows.

Check Batch Status

Poll the batch endpoint for progress:

Response

Batch Status Values

Paused Mode (Rename Before Download)

Create a batch in paused mode to review and rename episodes before downloading:

1. Create Paused Batch

The response includes episode metadata (title and URL) so you can decide how to rename them.

2. Rename Episodes (Optional)

3. Start the Batch

Batch Webhook

When a batch completes (all episodes done), a webhook is sent:
The batch webhook fires once when all episodes are done (completed + failed + skipped = total), not for each individual episode. Skipped episodes (e.g. audio-only episodes with Widevine DRM) count toward the failed_episodes counter. The status field is "completed" if all succeeded, or "finished" if some failed.

Folder Structure

All episodes are saved with the folder prefix you specify:

Python Example

Skipped Episodes

Some Spotify episodes are audio-only and protected by Widevine DRM — they have no video stream available. These episodes are automatically skipped instead of failing with retries:
  • Job status is set to Skipped (not Failed)
  • A job_skipped webhook is sent for each skipped episode
  • Skipped episodes count toward the batch failed counter for completion tracking
  • Skipped jobs are classified as warnings, not errors
You can identify skipped episodes by checking individual job statuses or listening for job_skipped webhooks.

Limits & Performance