YouTube Thumbnail Extractor: all sizes, best available, bulk
Pricing
from $0.65 / 1,000 video thumbnails
YouTube Thumbnail Extractor: all sizes, best available, bulk
Thumbnail URLs of YouTube videos, up to 500 per run: every size from default to maxresdefault, which ones exist with their file size, the best available one with width and height, WebP variants, the three frame stills, plus video title, channel and watch URL. No downloads, no API key. Pay per video.
Pricing
from $0.65 / 1,000 video thumbnails
Rating
0.0
(0)
Developer
Steadydata Team
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
11 hours ago
Last modified
Categories
Share
Thumbnail URLs of YouTube videos, up to 500 per run: every size from default to maxresdefault, which ones exist with their file size, the best available one with width and height, WebP variants, the three frame stills, plus video title, channel and watch URL. No downloads, no API key. Pay per video.
Why this scraper
- Only delivered results are charged. Inputs that fail come back as clear error records at no cost.
- One official oEmbed call plus five lightweight HEAD checks per video, nothing downloaded, no API key, no browser. Measured on the platform: three videos in 5 seconds for a tenth of a cent; a tenth of the price of the busiest alternative in this niche.
- Not just URLs but the truth about them: YouTube's thumbnail addresses are predictable, but the 1280 and 640 pixel versions exist only for videos uploaded in enough resolution. Each size is verified and delivered with its byte size, and
bestUrlis the largest one that really exists, with width and height (measured: the 2005 video Me at the zoo tops out at 480 pixels, a 4K remaster has all five). - Everything a thumbnail workflow needs on one row: the five JPEG sizes, the WebP variants, the three frame stills YouTube generates, the video title, channel name and link, and the watch URL.
Who this is for
Paste video URLs (watch, youtu.be, shorts, embed) or 11-character ids in videos (up to 500 per run). Leave checkSizes on to know which sizes exist and how large they are; switch it off for URLs only with a single request per video. Built for content pipelines, newsletters, link previews, thumbnail A/B research and archiving that need the right image address without scraping the watch page.
Who this is not for
The images are not downloaded; you get their addresses and sizes and fetch them yourself. Private, unlisted-and-not-embeddable and removed videos come back as a free NOT_FOUND row, because oEmbed answers nothing for them. Custom thumbnails and auto-generated ones look the same to this actor; it cannot tell which the creator chose. Byte sizes are what the image host reports at the moment of the run. Titles and channel names come from oEmbed and are not localised.
Input fields
| Field | Type | Required or default | What it does |
|---|---|---|---|
videos | list of text | required | One per row, up to 500: a YouTube video URL (watch, youtu.be, shorts, embed) or an 11-character video id. |
checkSizes | true/false | true | On: each size is verified with a HEAD request and its byte size delivered. Off: URLs only, one request per video. |
Input example
{"videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","jNQXAC9IVRw"],"checkSizes": true}
Output example
| Field | Type | What it holds | Example |
|---|---|---|---|
videoId | text | The eleven-character YouTube id of the video, the key to join other data on. | jNQXAC9IVRw |
title | text | The title as the uploader set it. | Me at the zoo |
channelName | text | The channel that published the video. | jawed |
channelUrl | text | The channel page on YouTube. | https://www.youtube.com/@jawed |
videoUrl | text | The watch page of the video. | https://www.youtube.com/watch?v=jNQXAC9IVRw |
bestUrl | text | The largest thumbnail that really exists for this video; take this one when you want a single image. | https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg |
bestSize | text | The name of that largest size: maxres, sd, hq, mq or default. | hqdefault |
bestWidth | number | The width of the largest existing thumbnail, in pixels. | 480 |
bestHeight | number | The height of the largest existing thumbnail, in pixels. | 360 |
hasMaxres | true/false | True when YouTube holds the 1280x720 image; older and low-resolution uploads often do not. | False |
maxresUrl | text | The 1280x720 image; empty when the video has no maxres version. | https://i.ytimg.com/vi/jNQXAC9IVRw/maxresdefault.jpg |
sdUrl | text | The 640x480 image, present on nearly every video. | https://i.ytimg.com/vi/jNQXAC9IVRw/sddefault.jpg |
hqUrl | text | The 480x360 image, a safe middle size. | https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg |
mqUrl | text | The 320x180 image, small and quick to load. | https://i.ytimg.com/vi/jNQXAC9IVRw/mqdefault.jpg |
defaultUrl | text | The 120x90 image, the smallest one YouTube keeps. | https://i.ytimg.com/vi/jNQXAC9IVRw/default.jpg |
sizes | list | Every size that exists for this video, each with its name, width, height and link. | [{"size": "maxresdefault", "url": "https://i.ytimg.com/vi... |
webpMaxresUrl | text | The maxres image in WebP, which downloads smaller than the JPEG. | https://i.ytimg.com/vi_webp/jNQXAC9IVRw/maxresdefault.webp |
webpHqUrl | text | The 480x360 image in WebP. | https://i.ytimg.com/vi_webp/jNQXAC9IVRw/hqdefault.webp |
frameUrls | list | The three storyboard frames YouTube cuts from the video itself, often more telling than the cover image. | ["https://i.ytimg.com/vi/jNQXAC9IVRw/1.jpg", "https://i.y... |
oembedThumbnailUrl | text | The thumbnail YouTube's own oEmbed endpoint names, handy as a cross-check. | https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg |
Error codes: INVALID_VIDEO, NOT_FOUND, BLOCKED.
One delivered row looks like this:
{"videoId": "dQw4w9WgXcQ","title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","channelName": "Rick Astley","channelUrl": "https://www.youtube.com/@RickAstleyYT","videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","bestUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg","bestSize": "maxresdefault","bestWidth": 1280,"bestHeight": 720,"hasMaxres": true,"maxresUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg","sdUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/sddefault.jpg","hqUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg","mqUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/mqdefault.jpg","defaultUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/default.jpg","webpMaxresUrl": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/maxresdefault.webp","webpHqUrl": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/hqdefault.webp","frameUrls": ["https://i.ytimg.com/vi/dQw4w9WgXcQ/1.jpg","https://i.ytimg.com/vi/dQw4w9WgXcQ/2.jpg","https://i.ytimg.com/vi/dQw4w9WgXcQ/3.jpg"],"sizes": [{"size": "maxresdefault","url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg","width": 1280,"height": 720,"exists": true,"bytes": 65324},{"size": "sddefault","url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/sddefault.jpg","width": 640,"height": 480,"exists": true,"bytes": 31029},{"size": "hqdefault","url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg","width": 480,"height": 360,"exists": true,"bytes": 21011},{"size": "mqdefault","url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/mqdefault.jpg","width": 320,"height": 180,"exists": true,"bytes": 10303},{"size": "default","url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/default.jpg","width": 120,"height": 90,"exists": true,"bytes": 2888}],"oembedThumbnailUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg","status": "ok"}
Related actors from steadydata
- youtube-video-details: the metadata behind the same videos
- youtube-channel-videos: every video of a channel, to feed this actor a list
- image-ocr-text: the text inside a thumbnail
Pricing
Pay per event: one video-thumbnails event per delivered result. No charge for inputs
that fail, no separate platform-usage surcharge.
Free Apify plan: this actor delivers up to 25 rows per run for accounts on the Apify free plan, and then stops with a message. That limit is set by us, not by Apify. It exists so the actor keeps paying for itself for the people who do pay. Any paid Apify plan runs it at full size, billed per delivered row, with failed rows never charged.
Reviews: if this actor saves you time, a short review on this page is the one thing that helps most. Ratings are what other buyers look at first, and we have no other way to ask.
Use with AI agents
AI assistants such as Claude, ChatGPT or Cursor can run this actor through Apify's own MCP server. Ask for the actor steadydata/youtube-thumbnail-extractor by its full name, so the assistant does not pick a different one, and start from this minimal input:
{"videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","jNQXAC9IVRw"]}
The assistant can read the price per event from the Pricing section above before the first paid run. Failed input comes back as an error row, as described above.
FAQ
Is personal data collected? Only the public video title and channel name that YouTube itself returns through oEmbed; no viewer or commenter data is touched.
Which URL should I use?
bestUrl: the largest size that exists. For a fixed layout use the size columns directly; hqUrl (480x360) exists for every public video.
Why is hasMaxres false for some videos?
YouTube only renders the 1280x720 thumbnail for uploads of at least 720p; older or low-resolution videos have no such file, and the actor tells you rather than handing you a URL that 404s.
What are the frame stills?
frameUrls are the three automatic stills YouTube takes at the start, middle and end of a video (1.jpg, 2.jpg, 3.jpg), handy as alternatives when the main thumbnail is not suitable.
What does a run cost when a video is gone?
Nothing. NOT_FOUND, INVALID_VIDEO and BLOCKED rows are free; only delivered videos are charged.
What happens when the source changes? Sources change from time to time; that is the nature of this work. The actor is monitored daily and fixed fast, and while it is broken you are not charged, because only delivered results cost anything.