
Instagram Reel Scraper
scrape.ly/store/echofield/instagram-reel-scraperSocial mediaVideos
1 monthly user

Scrape public YouTube videos, channels, playlists, hashtags, and search results. Get titles, views, likes, durations, upload dates, descriptions, and channel details.
Public YouTube videos, channels, playlists, hashtags, and search results — structured in one dataset, without the official Data API quota.
Built for research, competitive tracking, and catalog jobs that need titles, view counts, likes, comment counts, subscriber counts, descriptions, and caption tracks YouTube already publishes.
searchQueries returns videos, Shorts, and streams up to maxResults, maxResultsShorts, and maxResultStreams.sortingOrder, dateFilter, videoType, lengthFilter, and the feature checkboxes (isHD, hasSubtitles, hasCC, is3D, isLive, isBought, is4K, is360, hasLocation, isHDR, isVR180).sortVideosBy follows Latest, Popular, or Oldest when that chip is on the channel tab. oldestPostDate keeps channel videos whose publish time is on or after that date.transcriptionAndSubtitle set to ALWAYS_SUBTITLES when a caption track is present. Language, format (srt, vtt, xml, plaintext), and an optional key-value store copy via saveSubsToKVS.Speech-to-text is not part of this actor. Older inputs that still send aiVideoDescription, aiVideoSummary, ALWAYS_TRANSCRIBE or TRANSCRIPTION_AS_FALLBACK keep working: the AI fields and ALWAYS_TRANSCRIBE are ignored, and TRANSCRIPTION_AS_FALLBACK behaves like ALWAYS_SUBTITLES.
OUTPUT record and status message (never as a dataset row, never charged), and the rest of the run continues. A video id YouTube does not publish adds no row.0 or false stays.{
"maxResults": 10,
"searchQueries": [
"web scraping tutorials"
]
}
One item from a real run of the example input, shortened. Long text is cut and lists show their first entries.
{
"id": "XXXXXXXXXXX",
"title": "Learn Web Scraping in 5 Minutes (NO PRIOR KNOWLEDGE)",
"url": "https://www.youtube.com/watch?v=XXXXXXXXXXX",
"type": "video",
"viewCount": 175059,
"date": "2026-03-05T07:01:30-08:00",
"duration": "00:04:53",
"thumbnailUrl": "https://i.ytimg.com/…",
"channelName": "Example Channel",
"channelId": "UCxxxxxxxxxxxxxxxxxxxxxx",
"channelUsername": "examplechannel",
"channelUrl": "https://www.youtube.com/@examplechannel",
"likes": 6720,
"numberOfSubscribers": 103000,
"input": "web scraping tutorials",
"fromYTUrl": "https://www.youtube.com/results?search_query=web+scraping+tutorials",
"order": 1
}
Send searchQueries or startUrls. When startUrls is set, search terms are ignored.
| Field | Role |
|---|---|
searchQueries | Search terms, one per line. |
maxResults | Regular videos to keep per search, channel, playlist, or hashtag. Default 10. 0 skips them. A direct video URL is still returned. |
maxResultsShorts | Shorts cap. 0 skips Shorts on listings. |
maxResultStreams | Streams cap. 0 skips streams on listings. |
startUrls | YouTube video, channel, playlist, hashtag, or search-results URLs. Other hosts are rejected before the run starts. |
transcriptionAndSubtitle | NONE or ALWAYS_SUBTITLES. ALWAYS_SUBTITLES downloads caption tracks that already exist. |
subtitlesLanguage | any or a language code (en, de, es, fr, it, ja, ko, nl, pt, ru). |
subtitlesFormat | srt, vtt, xml, or plaintext. |
sortingOrder | Search sort: relevance, rating, date, views. |
dateFilter | Search upload window: hour, today, week, month, year. |
videoType | video or movie. |
lengthFilter | under4 (under 4 minutes), between420 (YouTube's 3–20 minute chip), plus20 (over 20 minutes). |
isHD, hasSubtitles, hasCC, is3D, isLive, isBought, is4K, is360, hasLocation, isHDR, isVR180 | Search feature filters. Applied only when set to true. Live hits are streams; with maxResultStreams at 0 they count toward maxResults. |
oldestPostDate | Channel videos published on or after this absolute or relative date. Forces channel sort to newest. |
sortVideosBy | NEWEST, POPULAR, or OLDEST on channel tabs. |
saveSubsToKVS | Also store downloaded subtitle text in the run key-value store. |
preferAutoGeneratedSubtitles | Prefer an automatic caption track when both exist. |
maxResults is required. An input with no search and no URL is rejected before the run starts. A search whose video, Shorts, and stream caps are all 0 stores no rows. A direct video URL is still returned when the listing caps are 0.
Each success item is one public video. Fields appear only when the downloaded page contains them.
Always set when the video was read: id, url, type (video, shorts, or stream), input, order.
Typical watch-page fields: title, viewCount, date, duration, thumbnailUrl, channelName, channelUrl, channelUsername, channelId, text, descriptionLinks, hashtags, likes, commentsCount, commentsTurnedOff, numberOfSubscribers, tags, category, chapters, thumbnails, subtitleLanguages, isFamilySafe, isUnlisted, isLiveContent (plus isLiveNow, isUpcoming, liveStartTime, liveEndTime for streams and premieres), fromYTUrl.
Channel listings can also carry channelDescription, channelLocation, channelJoinedDate, channelTotalVideos, channelTotalViews, channelAvatarUrl, channelBannerUrl, and isChannelVerified when the channel header or About data includes them.
subtitles is an array of {language, type, srt} and, when saveSubsToKVS is on, srtUrl. type is user_generated or auto_generated.
location, translatedTitle, translatedText, isMembersOnly, isPaidContent, and isAgeRestricted are included only when that watch payload says so.
isMonetized, aiVideoDescription, aiVideoSummary, and transcriptionUrl are not emitted. Comment bodies are not scraped. The comment count is.
An input that gave no videos is not a dataset row. It is listed in the run's OUTPUT key-value record as failedInputs and summarised in the status message. A missing channel looks like this there:
{
"inputUrl": "https://www.youtube.com/@this-channel-does-not-exist-xyz",
"error": "CHANNEL_DOES_NOT_EXIST",
"errorDescription": "HTTP 404"
}
Other error codes used here: NOT_FOUND, CHANNEL_HAS_NO_VIDEOS, CHANNEL_HAS_NO_SHORTS, CHANNEL_HAS_NO_LIVE_VIDEOS, NO_VIDEOS, NO_RESULTS, DATE_FILTER_TOO_STRICT, AGE_RESTRICTED.
Pay per event, plus platform usage (compute and residential proxy traffic):
dateFilter (search) or oldestPostDate (channels) filters the results.Example: 1,000 videos with no date filter ≈ $3 in event fees plus about $0.56 of platform usage (measured: 100 search results used $0.056, 10 used $0.007).
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
searchQueriesarrayOptionalSearch terms
Enter search terms just like you would enter it in YouTube's search bar.
startUrlsarrayOptionaldefault []Direct URLs
YouTube video, channel, playlist, hashtag or search results URLs. Search terms are ignored when URLs are set. To get only shorts or streams, set Maximum videos per search term to 0.
maxResultsintegerRequireddefault 10Maximum videos per search term
Limit the number of videos you want to crawl. If you scrape a channel, acts as a limit for regular videos.
Narrow down which videos are returned. The date applies to channels; the other filters apply to search terms.
dateFilterenumOptionalDate filter
Select Youtube upload date filter for search
videoTypeenumOptionalVideo type filter
Select Youtube video type filter for search
lengthFilterenumOptionalLength filter
Select Youtube video length filter for search
isHDbooleanOptionalHD
Will apply the HD filter for search
hasSubtitlesbooleanOptionalSubtitles/CC
Will apply the Subtitles/CC filter for search
hasCCbooleanOptionalCreative Commons
Will apply the Creative Commons filter for search
is3DbooleanOptional3D
Will apply the 3D filter for search
isLivebooleanOptionalLive
Will apply the Live filter for search
isBoughtbooleanOptionalPurchased
Will apply the Purchased filter for search
is4KbooleanOptional4K
Will apply the 4K filter for search
is360booleanOptional360 degrees
Will apply the 360 degrees filter for search
hasLocationbooleanOptionalLocation
Will apply the Location filter for search
isHDRbooleanOptionalHDR
Will apply the HDR filter for search
isVR180booleanOptionalVR180
Will apply the VR180 filter for search
oldestPostDatestringOptionalScrape videos published after [date]
Only videos published on or after this date. A number of days also works: 1 is today only, 2 is today and yesterday, and so on. Setting this switches sorting to newest first.
How results are sorted, and how many shorts and streams to add.
sortingOrderenumOptionalSorting order
Select Youtube sorting parameter for search
sortVideosByenumOptionalSort by
Maps to the sorting buttons on the top of the channel's 'Videos', 'Shorts' and 'Live' pages.
maxResultsShortsintegerOptionaldefault 0Maximum shorts per search term
Limit the number of Shorts videos you want to crawl.
maxResultStreamsintegerOptionaldefault 0Maximum streams per search term
Limit the number of Stream videos you want to crawl.
Download subtitles that are already on the video.
transcriptionAndSubtitleenumOptionaldefault "NONE"Subtitles
Download subtitles that are already on the video.
subtitlesLanguageenumOptionaldefault "en"Subtitle language
Subtitle language. Needs a subtitle option above.
subtitlesFormatenumOptionaldefault "srt"Subtitle format
Select in what format you want to download subtitles
preferAutoGeneratedSubtitlesbooleanOptionaldefault falsePrefer auto-generated subtitles
Use YouTube's auto-generated subtitles when a video has both kinds.
saveSubsToKVSbooleanOptionaldefault falseSave subtitles to key-value store
Also save each subtitle file to the run's key-value store and link it from the video.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| title | string | The title of the YouTube video |
| id | string | The unique YouTube video ID |
| url | string | The full URL of the video |
| viewCount | number | The number of views on the video |
| date | string | The publish date of the video |
| duration | string | The length of the video in time format |
| type | string | The type of video content |
| thumbnailUrl | string | URL of the video thumbnail image |
| input | string | The input provided by the user (URL, channel name, or search query) |
| channelName | string | The name of the channel that published the video |
| channelUrl | string | The URL of the channel |
| channelUsername | string | The @username handle of the channel |
| translatedTitle | string | The translated title if YouTube provided a translation |
| translatedText | string | The translated description if YouTube provided a translation |
| likes | number | The number of likes on the video |
| location | string | Geographic location associated with the video |
| channelId | string | The unique channel ID |
| commentsCount | number | The total number of comments on the video |
| text | string | The video description text |
| descriptionLinks | array | Links found in the video description |
| subtitles | array | Available subtitles for the video |
| aiVideoDescription | array | AI-generated, time-segmented description of the video (only when AI enrichment is enabled) |
| aiVideoSummary | string | AI-generated summary of the video (only when AI enrichment is enabled) |
| transcriptionUrl | string | URL of the AI-generated transcript stored in the key-value store. Present only when a transcription option is selected in 'Transcription & subtitles' |
| fromYTUrl | string | The YouTube URL where this video was found (e.g. search results or channel page) |
| order | number | The position of the video in the list as it appeared on the source page |
| commentsTurnedOff | boolean | Whether comments are disabled on the video |
| isMonetized | boolean | Whether the video is monetized |
| hashtags | array | Hashtags associated with the video |
| isMembersOnly | boolean | Whether the video is restricted to channel members |
| collaborators | array | Collaborators on the video |
| isPaidContent | boolean | Whether the video requires payment to access |
| numberOfSubscribers | number | Number of subscribers to the channel |
| channelTotalVideos | number | Total number of videos on the channel |
| channelDescription | string | The channel's description |
| channelLocation | string | The channel's location |
| channelJoinedDate | string | When the channel was created |
| channelTotalViews | number | Total views across all channel videos |
| isChannelVerified | boolean | Whether the channel is verified |
| channelBannerUrl | string | URL of the channel banner |
| channelAvatarUrl | string | URL of the channel avatar |
| isAgeRestricted | boolean | Whether the channel is age-restricted |
| tags | array | Tags (keywords) the uploader set on the video |
| category | string | YouTube category of the video |
| isFamilySafe | boolean | Whether YouTube marks the video as family safe |
| isUnlisted | boolean | Whether the video is unlisted |
| isLiveContent | boolean | Whether the video is or was a live stream or premiere |
| isLiveNow | boolean | Whether the stream is live right now (live content only) |
| isUpcoming | boolean | Whether the stream or premiere is scheduled and has not started yet |
| liveStartTime | string | Start time (or scheduled start) of the live broadcast |
| liveEndTime | string | End time of the live broadcast |
| thumbnails | array | Every thumbnail size YouTube lists for the video, smallest first |
| chapters | array | Video chapters (the uploader's own, else YouTube's auto chapters) |
| subtitleLanguages | array | Subtitle tracks available on the video |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Date filter | Per result when dateFilter (search) or oldestPostDate (channels) is set and applied | $0.0008 |
| Result | One saved YouTube video, Short or stream row | $0.003 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('echofield/youtube-scraper').call({
"searchQueries": [
"web scraping tutorials"
],
"startUrls": [
{
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
}
],
"maxResults": 10,
"dateFilter": "month",
"videoType": "video",
"lengthFilter": "between420",
"oldestPostDate": "2024-01-01",
"sortingOrder": "relevance",
"sortVideosBy": "NEWEST",
"maxResultsShorts": 0,
"maxResultStreams": 0,
"subtitlesLanguage": "en",
"subtitlesFormat": "srt",
"preferAutoGeneratedSubtitles": false,
"saveSubsToKVS": false
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run echofield/youtube-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=echofield/youtube-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Search results with German subtitles in VTT format.
Latest regular videos from a channel.
Search results sorted by views.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.