# YouTube Thumbnail Downloader: HD, Bulk, Whole Channel (`s_actors/youtube-thumbnail-downloader`) Actor

Download YouTube thumbnails in bulk: HD 1280x720 and every size, Shorts, whole channels, playlists and searches as files, ZIP or links. See when each thumbnail was changed, catch competitor thumbnail A/B tests and keep old versions. No API key.

- **URL**: https://apify.com/s_actors/youtube-thumbnail-downloader.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Videos, Social media, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 video thumbnails

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### YouTube Thumbnail Downloader: HD, Bulk & Whole Channel

Download **YouTube thumbnails in bulk**: HD 1280x720 and every other size, for video links, Shorts, **whole channels**, playlists and searches. Get the image files in one **ZIP**, a download link per file, or just the links. Each row also shows **when the thumbnail was set** and whether it was **changed after publishing**, so you can spot the thumbnail A/B tests of any channel. Scheduled runs keep a **thumbnail history** with the old versions.

```json
{ "videos": ["https://www.youtube.com/@MrBeast"] }
```

No YouTube API key, no login, no browser extension. Use it as a **YouTube thumbnail API**: one call returns clean JSON.

#### What you get

**One row per video.** Real example, MrBeast, September 2026:

| thumbnail | video | size | thumbnail set | changed after publish | published |
|---|---|---|---|---|---|
| ![](https://i.ytimg.com/vi/Qtl8lJwbd4g/mqdefault.jpg) | Escape 100 Cops, Win $500,000 | 1280x720 | 2026-09-22 | **yes, 24 days later** | 1 month ago |
| ![](https://i.ytimg.com/vi/v9QtM6qnG50/mqdefault.jpg) | I Built A City To Save Kids From Illegal Labor | 1280x720 | 2026-09-24 | **yes, 4 days later** | 8 days ago |
| ![](https://i.ytimg.com/vi/T_SMf9j50uc/mqdefault.jpg) | Can We Build an Entire Village? | 1280x720 | 2026-09-18 | no | 9 days ago |

| Field | Description |
|---|---|
| `thumbnailUrl`, `bestSize`, `width`, `height` | The largest thumbnail the video has (`maxres` 1280x720; old videos: `sd` 640x480 or `hq` 480x360) |
| `fileUrl`, `fileName`, `zipFile` | Download link of the image file, its name in the ZIP and which ZIP part holds it |
| `thumbnails` | Every size you asked for: `size`, `url`, `width`, `height`, `fileUrl`, `fileName`, `fileSizeKB` |
| `frames` | With **Include auto-generated frames**: the 3 frames YouTube picked from the video (1280x720 when available) |
| `thumbnailSetAt` | When the current thumbnail was set (upload or change), to the second |
| `changedAfterPublish`, `daysAfterPublish` | The thumbnail was set more than 2 days after the video went public: the creator changed it (an A/B test winner or re-packaging) |
| `title`, `channelName`, `channelUrl`, `url`, `videoId` | The video |
| `publishedDate`, `publishedText`, `views`, `duration`, `isShort` | As YouTube shows them (exact date for video links) |
| `change`, `previousTitle`, `previousThumbnailSetAt`, `previousThumbnailFileUrl`, `thumbnailHistoryFileUrl` | **Only changes**: `new`, `thumbnail changed`, `title changed`; saved copies of the old and the new thumbnail |
| `status` | `ok` or `not found` (deleted, private or wrong ID; free) |

**Channel inputs** add one row with the channel **avatar (900x900)** and **banner (2560x1440)**: `avatarUrl`, `avatarFileUrl`, `bannerUrl`, `bannerFileUrl`.

**Files** go to the run's key-value store: `thumbnails.zip` (parts of 200 MB, a folder per channel, playlist or search, files named `Video-title_videoID.jpg`, plus `metadata.csv`) and every image separately.

#### How to download the images

The Actor saves the **image files themselves**, not only links to YouTube:

| Way | How |
|---|---|
| **All images at once** | Open the **Output** tab and click **ZIP archive**: `thumbnails.zip` downloads with every image in folders. The run's status message has the same download link |
| **One image** | Click **Download** in the table row: the JPG (or WebP) file is saved to your computer |
| **Every file separately** | **Storage** tab → **Key-value store**: each image is a record you can download |
| **From code** | the `fileUrl` of each row is a direct download link; the ZIP is the record `thumbnails.zip` of the run's key-value store |

Turn off **Download files** only if you want the image links alone (faster, no files).

#### Thumbnail sizes

| Size | Pixels | Exists for |
|---|---|---|
| `maxres` (maxresdefault) | 1280x720 | HD uploads, most videos since ~2013 |
| `sd` (sddefault) | 640x480 | most videos |
| `hq` (hqdefault) | 480x360 | every video |
| `mq` (mqdefault) | 320x180 | every video |
| `default` | 120x90 | every video |
| `vertical` (oardefault) | 1080x1920 | Shorts only (with Thumbnail size = All) |
| `frame1`-`frame3` | 1280x720 or 480x360 | auto-generated frames |

**Best available** (default) takes the largest one the video has. A fixed size falls back to the next smaller one. **All** returns every size. **WebP** files are about half the size of JPG.

#### How it works

1. Add videos, Shorts, channels (`@handle`) or playlists, or search by keyword
2. Choose the size, JPG or WebP, and whether you want files or only links
3. Run, then click **ZIP archive** in the Output tab to download all the images, or export the table as CSV, Excel or JSON

| Input | What it does |
|---|---|
| **Videos, Shorts, channels or playlists** | Any public video; a channel gives its latest videos (up to 5,000), a playlist all its videos |
| **Search videos by keyword** | Thumbnails of the top videos for "minecraft survival": a thumbnail dataset for design research or AI |
| **Thumbnail size** | Best available, all sizes or one fixed size |
| **Include auto-generated frames** | The 3 frames YouTube suggests as thumbnails |
| **Channel avatar and banner** | Profile picture and banner of each channel, full size |
| **Download files / ZIP archive** | Files + ZIP (default), or links only (faster) |
| **Only changes** | Thumbnail history: later runs return only new videos and changed thumbnails or titles |

#### Why this Actor

| | |
|---|---|
| 📦 **Whole channel in one ZIP** | Every thumbnail of a channel, playlist or search, named by title, in folders, with `metadata.csv` |
| 🕒 **When each thumbnail was set** | `thumbnailSetAt` for every video and `changedAfterPublish`: see which videos a channel re-packaged and when, without waiting for a monitor |
| 🔔 **Thumbnail history** | Scheduled runs catch thumbnail and title changes of competitors and keep the old thumbnail files |
| 🖼️ **Every size and frame** | HD, all 5 sizes, WebP, the 1080x1920 vertical image of Shorts, the 3 auto-generated frames, avatars and banners |
| ✅ **Only real files** | Sizes a video does not have are skipped (YouTube's gray placeholder is never saved) |
| 💰 **$0.001 per video** | All sizes and files included; a 50-video channel costs about $0.05 |

#### Pricing

Pay per result, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Video (all chosen sizes, frames, files and links) | $0.001 | $0.0009 | $0.0008 |
| Channel avatar and banner | $0.001 | $0.0009 | $0.0008 |

| Task | Cost |
|---|---|
| Latest 50 thumbnails of a channel, HD, ZIP | ~$0.052 |
| 1,000 video links, every size | ~$1.00 |
| Daily thumbnail change check of 5 channels (50 videos each) for a month | ~$0.28 + new and changed videos |

Videos that are not found and unchanged videos in **Only changes** are free.

#### Ready-made tasks

| Task | What you get |
|---|---|
| [Download All Thumbnails From a YouTube Channel](https://apify.com/s_actors/youtube-thumbnail-downloader/examples/download-all-thumbnails-youtube-channel) | Every thumbnail of a channel in one ZIP |

#### Track competitor thumbnails

1. Add the channels you follow, set **Max videos per channel** (e.g. 30), turn on **Only changes** and give the monitor a name
2. Save as a task and schedule it daily
3. The first run saves a copy of every thumbnail and remembers the titles; later runs return only new videos and `thumbnail changed` / `title changed` rows
4. Open the **Changes (old vs new)** view: the old and the new thumbnail side by side, the old and the new title, and when each thumbnail was set. The copies stay in the key-value store `youtube-thumbnail-history` in your account, so the history grows with every change

YouTube keeps only the current thumbnail, so old versions exist from the first monitoring run on.

Even without monitoring, `changedAfterPublish` on the first run shows which videos already had their thumbnail changed.

#### FAQ

**How do you know when a thumbnail was set?** YouTube's image servers report the time each thumbnail file was created. When that time is later than the video's publish date, the thumbnail was replaced. For very old videos the date can also be a re-generation by YouTube itself (for example "Me at the zoo", 2005, shows 2023).

**Why is there no 1280x720 image for some videos?** YouTube makes HD thumbnails only for HD uploads. Best available then gives 640x480 or 480x360. The Actor never returns YouTube's gray "no thumbnail" placeholder.

**Can I download a Short's thumbnail?** Yes: the horizontal cover as for any video, and with Thumbnail size = All the vertical 1080x1920 image.

**Can I download the video?** No, only images. For titles, views, likes and tags of each video use [YouTube Video Details Scraper](https://apify.com/s_actors/youtube-video-details-scraper).

**Private or deleted videos?** They have no thumbnail: the row says `not found` and is free.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "Download the thumbnails of the last 20 MrBeast videos and tell me which ones he changed after publishing."

#### Other YouTube tools

| Tool | What it does |
|---|---|
| [YouTube Trending & Charts Scraper](https://apify.com/s_actors/youtube-trending-scraper) | Trending music videos and trailers, top songs, artists, Shorts songs, podcasts by country, chart history |
| [YouTube Playlist Scraper](https://apify.com/s_actors/youtube-playlist-scraper) | Every video of playlists to CSV, length at any speed, deleted video finder |
| [YouTube Search Scraper](https://apify.com/s_actors/youtube-search-scraper) | Search results with every filter, newest first, without Shorts |
| [YouTube Channel Scraper](https://apify.com/s_actors/youtube-channel-scraper) | Channel stats, growth history, videos, Shorts and streams |
| [YouTube Channel Email Scraper](https://apify.com/s_actors/youtube-channel-email-scraper) | Public emails, websites and socials of channels, influencer lists by niche |
| [YouTube Video Details Scraper](https://apify.com/s_actors/youtube-video-details-scraper) | Full details and exact stats of any videos, views tracker over time |
| [YouTube Shorts Scraper](https://apify.com/s_actors/youtube-shorts-scraper) | Shorts of channels, searches, hashtags and sounds: exact stats, viral score |
| [YouTube Transcript Scraper](https://apify.com/s_actors/youtube-transcript-scraper) | Transcripts and subtitles of videos, channels and playlists: text, SRT, search |
| [YouTube Comments Scraper](https://apify.com/s_actors/youtube-comments-scraper) | Comments and replies of videos, Shorts and channels, only-new monitoring |
| [YouTube SEO & Rank Tracker](https://apify.com/s_actors/youtube-seo-rank-tracker) | Searches a video ranks for, keyword rankings, tags, suggestions |
| [Google Sheets Import & Export](https://apify.com/s_actors/google-sheets-import-export) | Send the results to a Google Sheet |

#### Is it legal?

The Actor reads only public images and data that YouTube shows to any visitor, without logging in. Thumbnails are the work of their creators: use them for research, analysis, archiving your own channel and reference, and ask the owner before republishing them.

# Actor input Schema

## `videos` (type: `array`):

One per line: video links (youtube.com/watch?v=..., youtu.be/..., /shorts/..., /live/...), 11-character video IDs, channels (youtube.com/@handle, /channel/UC..., @handle) for their latest videos, or playlists (youtube.com/playlist?list=...).

## `searchQueries` (type: `array`):

Optional. YouTube search, e.g. "minecraft survival" or "iphone review": thumbnails of the top videos of each query (a thumbnail dataset for design research or AI).

## `maxVideosPerChannel` (type: `integer`):

For channel and playlist inputs: how many videos, newest first for channels (Shorts and live streams included).

## `maxVideosPerSearch` (type: `integer`):

For search queries: how many videos from the top of the results.

## `quality` (type: `string`):

Best = the largest size the video has (old videos have no HD). A fixed size falls back to the next smaller one when the video has no such size. All = every size the video has, plus the vertical 1080x1920 image of Shorts.

## `format` (type: `string`):

YouTube keeps each thumbnail as JPG and WebP. WebP files are about half as big; JPG is used when a WebP copy is missing.

## `includeFrames` (type: `boolean`):

Also the 3 frames YouTube picked from the video (the auto-generated thumbnail options), 1280x720 when available, else 480x360.

## `includeChannelArt` (type: `boolean`):

For channel inputs: one extra row with the channel's profile picture (900x900) and banner (original, usually 2560x1440).

## `saveFiles` (type: `boolean`):

Save every image to the run's key-value store (a download link per file). Off = only the image links, checked to exist (faster).

## `createZip` (type: `boolean`):

Also pack all files into thumbnails.zip (parts of 200 MB) in the key-value store, with metadata.csv. Files are named by video title and ID, in a folder per channel, playlist or search.

## `onlyChanges` (type: `boolean`):

For scheduled runs: the first run returns every video and remembers its thumbnail and title; later runs return only new videos and videos whose thumbnail or title changed, with the previous title, the previous thumbnail's date and a link to the old thumbnail file.

## `monitorName` (type: `string`):

Name of the memory used by Only changes. Use a different name for each task.

## `maxConcurrency` (type: `integer`):

How many videos are processed at the same time.

## `proxyConfiguration` (type: `object`):

Requests go direct first and switch to Apify datacenter proxies when YouTube refuses them. The default works for most runs.

## `debugLog` (type: `boolean`):

Log every failed request attempt.

## Actor input object example

```json
{
  "videos": [
    "https://www.youtube.com/@MrBeast"
  ],
  "maxVideosPerChannel": 50,
  "maxVideosPerSearch": 20,
  "quality": "best",
  "format": "jpg",
  "includeFrames": false,
  "includeChannelArt": true,
  "saveFiles": true,
  "createZip": true,
  "onlyChanges": false,
  "monitorName": "default",
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "debugLog": false
}
```

# Actor output Schema

## `thumbnails` (type: `string`):

Preview, video, size, date the thumbnail was set, changed after publishing, download link.

## `changes` (type: `string`):

Only changes: old and new thumbnail side by side, old and new title.

## `zip` (type: `string`):

All downloaded files with metadata.csv (larger runs: thumbnails-2.zip and so on in the key-value store).

## `files` (type: `string`):

Every image file of the run.

## `all` (type: `string`):

Every field of every row, including all sizes and frames.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "videos": [
        "https://www.youtube.com/@MrBeast"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/youtube-thumbnail-downloader").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "videos": ["https://www.youtube.com/@MrBeast"] }

# Run the Actor and wait for it to finish
run = client.actor("s_actors/youtube-thumbnail-downloader").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "videos": [
    "https://www.youtube.com/@MrBeast"
  ]
}' |
apify call s_actors/youtube-thumbnail-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s_actors/youtube-thumbnail-downloader"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/2BHqdDmVJNrZ5HUcH/builds/bJHDBSHv9J1DeyW9J/openapi.json
