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

Scrape public YouTube Shorts from one or more channels: titles, view and like counts, comment counts, durations, publish dates, hashtags, and captions when YouTube provides them.
Pull public Shorts from any YouTube channel into a clean dataset: the video, the counts YouTube shows, and the channel behind them.
Built for research, social, and competitive-intelligence teams who need Shorts in a spreadsheet or a pipeline without burning an official API quota.
nasa) or a channel URL (channels).maxResultsShorts.NEWEST, POPULAR, or OLDEST (sortChannelShortsBy).2 days (oldestPostDate). A date filter uses newest order.title, url, id, thumbnailUrl, text, duration, date, viewCount, likes, commentsCount, and commentsTurnedOff.hashtags when they appear in the title or caption, and descriptionLinks when the caption contains URLs.subtitles when YouTube exposes caption tracks. Each track has language and type.includeCaptions): srt is filled for one track, English when YouTube offers it, and only when that download returns cues. Off by default.channelName, channelUrl, channelId, channelUsername, channelDescription, channelJoinedDate, channelDescriptionLinks, channelAvatarUrl, channelBannerUrl, channelTotalVideos, channelTotalViews, numberOfSubscribers, and isChannelVerified.isAgeRestricted when the public metadata says so, and isMembersOnly when YouTube marks that video as members-only.location, collaborators, translatedTitle, and translatedText only when YouTube includes them.input, inputChannelUrl, fromYTUrl, fromChannelListPage, and order.Fields YouTube does not send are left off the item. A real 0 or false stays.
With includeCaptions on, the first subtitles track also carries the caption text:
"subtitles": [
{
"language": "en",
"type": "asr",
"srt": "1\n00:00:00,390 --> 00:00:11,919\n[Music]\n\n2\n00:00:12,080 --> 00:00:19,960\nUh-oh. Uh-oh.\n…"
}
]
1 day.{
"channels": [
"rainbowicecream9780"
],
"maxResultsShorts": 10
}
One item from a real run of the example input, shortened. Long text is cut and lists show their first entries.
{
"title": "ASRM Satisfying sounds #asmr #music #funny #animation #shortvideo #shorts #satisfying",
"type": "shorts",
"id": "HKs9NvVRi5s",
"url": "https://www.youtube.com/shorts/HKs9NvVRi5s",
"thumbnailUrl": "https://i.ytimg.com/…",
"viewCount": 175239,
"date": "2025-08-04T10:00:33.000Z",
"likes": 1252,
"isAgeRestricted": false,
"duration": "00:00:51",
"commentsCount": 0,
"subtitles": [
{
"language": "en",
"type": "asr"
}
],
"order": 0,
"commentsTurnedOff": false,
"hashtags": [
"#asmr",
"#music"
],
"input": "rainbowicecream9780",
"fromYTUrl": "https://www.youtube.com/@rainbowicecream9780/shorts",
"fromChannelListPage": "shorts",
"channelName": "Coco Creator Rainbow",
"channelUrl": "https://www.youtube.com/channel/UC3N1VbltR6aREupzvJ8y-sw",
"channelId": "UC3N1VbltR6aREupzvJ8y-sw",
"channelUsername": "rainbowicecream9780",
"channelDescription": "Thank you so much! I appreciate you all watching the videos.",
"channelJoinedDate": "Aug 9, 2021",
"channelLocation": "United States"
}
| Field | What to send |
|---|---|
channels | Required. A handle (3–30 characters) or a channel link: https://www.youtube.com/@NASA, /channel/UC…, /c/…, or /user/…. Watch URLs are rejected before the run starts. |
maxResultsShorts | How many Shorts to keep per channel. Default 10. |
oldestPostDate | Absolute date (2024-01-01) or a relative window (1 day, 2 days, 3 weeks). Shorts on or after that moment are kept, and sorting is reset to newest. |
sortChannelShortsBy | NEWEST, POPULAR, or OLDEST. Ignored when oldestPostDate is set. |
includeCaptions | true to also save caption text as SRT in subtitles[].srt. Default false: subtitles lists the caption tracks without the text. |
{
"channels": ["nasa", "https://www.youtube.com/@NASA"],
"maxResultsShorts": 25,
"sortChannelShortsBy": "NEWEST"
}
Successful rows are one Short each. type is shorts and fromChannelListPage is shorts. The JSON below is the field shape, not a measured sample.
{
"title": "string",
"type": "shorts",
"id": "video id",
"url": "https://www.youtube.com/shorts/…",
"thumbnailUrl": "https://i.ytimg.com/…",
"viewCount": 0,
"date": "2026-01-15T12:00:00.000Z",
"likes": 0,
"channelName": "string",
"channelUrl": "https://www.youtube.com/channel/UC…",
"channelId": "UC…",
"channelUsername": "handle",
"numberOfSubscribers": 0,
"isChannelVerified": false,
"duration": "00:00:26",
"commentsCount": 0,
"commentsTurnedOff": false,
"text": "caption",
"order": 0,
"input": "nasa",
"fromYTUrl": "https://www.youtube.com/@NASA/shorts",
"fromChannelListPage": "shorts"
}
aboutChannelInfo repeats the channel fields that were actually present. subtitles is an array of {language, type} when caption tracks exist; with includeCaptions one track also carries srt. channelDescriptionLinks and descriptionLinks are {text, url}.
Every dataset row is a Short. A channel that does not exist, has no Shorts, or could not be loaded is skipped and listed in the run's status message and in the OUTPUT record of the run's key-value store, never saved as a row:
{
"saved": 3,
"failedInputs": [
{"input": "somechannel", "reason": "The channel has no shorts."}
]
}
A run that finds no Shorts saves no rows and ends with a status message that starts with No results:. The run fails only when no entry is a usable channel (none exists, or none is a handle or channel link) or when every channel page failed to load after retries.
Pay per event, plus platform usage:
includeCaptions): $0.003 per saved Short whose caption text was returned ($3 per 1,000). Shorts without caption text are not charged this event.Platform usage (compute and proxy traffic, plus remote browser time when caption text is read in the browser) is billed separately at standard platform rates. Example: 1,000 Shorts = $0.50 in event fees plus platform usage.
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.
channelsarrayRequiredName(s) of the channel
Channel handles (3-30 characters, without @) or channel links such as https://www.youtube.com/@NASA, https://www.youtube.com/channel/UC... or https://www.youtube.com/user/Google. Watch URLs, youtu.be links, single Short URLs and other non-channel values are rejected before the run starts.
maxResultsShortsintegerOptionaldefault 10Max shorts per channel
Limit the number of Shorts videos you want to crawl from the channel.
oldestPostDatestringOptionalScrape shorts published after [date]
Only shorts 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.
sortChannelShortsByenumOptionalSort shorts by
Maps to the three sorting buttons on the top of the channel shorts page.
Optional caption text add-on.
includeCaptionsbooleanOptionaldefault falseInclude caption text
Also read the caption (subtitle) text of each Short and save it as SRT in subtitles[].srt, English when YouTube offers it. Reading caption text can use the hosted browser, so runs take longer and use more platform usage, and each Short with caption text adds a caption event. Off: subtitles still lists the available caption tracks (language and type) without the text.
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 Shorts video |
| translatedTitle | string | The translated title of the YouTube Shorts video |
| translatedText | string | The translated description if YouTube provided a translation |
| type | string | The type of content, typically 'shorts' for YouTube Shorts videos |
| id | string | The unique YouTube video ID |
| url | string | The full URL to the YouTube Shorts video |
| thumbnailUrl | string | The URL of the video thumbnail image |
| viewCount | number | The number of views the video has received |
| date | string | The publication date of the video in ISO 8601 format |
| likes | number | The number of likes the video has received |
| location | string | The location associated with the video, if any |
| channelName | string | The name of the YouTube channel that uploaded the video |
| channelUrl | string | The URL of the YouTube channel |
| channelId | string | The unique identifier for the YouTube channel |
| collaborators | array | Collaborators on the video |
| channelUsername | string | The username/handle of the YouTube channel |
| channelDescription | string | The description text of the YouTube channel |
| channelJoinedDate | string | The date when the channel was created |
| channelDescriptionLinks | array | Array of links found in the channel description |
| channelLocation | string | The location associated with the channel |
| channelAvatarUrl | string | The URL of the channel's avatar/profile image |
| channelBannerUrl | string | The URL of the channel's banner image |
| channelTotalVideos | number | The total number of videos uploaded by the channel |
| channelTotalViews | number | The total number of views across all channel videos |
| numberOfSubscribers | number | The number of subscribers the channel has |
| isChannelVerified | boolean | Whether the channel is verified by YouTube |
| inputChannelUrl | string | The original channel URL that was used as input for scraping |
| isAgeRestricted | boolean | Whether the video is age-restricted |
| aboutChannelInfo | object | Additional information about the channel |
| duration | string | The duration of the video in HH:MM:SS format |
| commentsCount | number | The number of comments on the video |
| text | string | The description text of the video |
| descriptionLinks | array | Array of links found in the video description |
| subtitles | array | Available subtitles for the video |
| order | number | The order/position of the video in the scraped results |
| commentsTurnedOff | boolean | Whether comments are disabled for the video |
| fromYTUrl | string | The YouTube URL from which the video was scraped |
| isMonetized | boolean | Whether the video is monetized |
| hashtags | array | Array of hashtags associated with the video |
| isMembersOnly | boolean | Whether the video is restricted to channel members only |
| input | string | The input channel URL used for scraping |
| fromChannelListPage | string | The page type from which the video was scraped |
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 |
|---|---|---|
| Caption | Caption text returned for one saved Short (only with Include caption text) | $0.003 |
| Result | One saved YouTube Short | $0.0005 |
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-shorts-scraper').call({
"channels": [
"rainbowicecream9780"
],
"maxResultsShorts": 10,
"oldestPostDate": "2024-01-01",
"sortChannelShortsBy": "NEWEST",
"includeCaptions": 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-shorts-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-shorts-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.
Latest Shorts from a channel.
Shorts from a channel with caption text.
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.