YouTube Shorts Scraper - Views & Channel Data avatar

YouTube Shorts Scraper - Views & Channel Data

Pricing

from $1.00 / 1,000 videos

Go to Apify Store
YouTube Shorts Scraper - Views & Channel Data

YouTube Shorts Scraper - Views & Channel Data

Collect public YouTube Shorts from channel links and search words. Export titles, view counts, thumbnails, and available channel details. Pay per delivered row plus a start fee.

Pricing

from $1.00 / 1,000 videos

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

18

Total users

3

Monthly active users

a day ago

Last modified

Security

Limited permissions

Share

YouTube Shorts Scraper

Extract public YouTube Shorts metadata from channel links and search words as rows you can export and compare.

  • Video titles, Shorts links, thumbnail links, and view counts.
  • Channel names and identifiers when available, especially for channel inputs.
  • One row per Short, with a collection timestamp and input country and language.
  • Channel inputs and search inputs together in one run.
  • $1.00 per 1,000 rows on the Free plan, plus a small start fee.

What does YouTube Shorts Scraper do?

YouTube Shorts Scraper collects metadata for Shorts shown on YouTube channel pages and in search results. Use it to compare titles, review visible engagement, or build a spreadsheet of clips for content research. It returns metadata and links, not video files.

  • Channel collection: fill channelUrls with channel links, handles, or channel IDs.
  • Keyword search: fill searchQueries with the topics you want YouTube to search.
  • Combined collection: fill both lists; no separate mode selector is needed.
  • One row type: rowType is short. There are no optional comment or transcript rows.

gl selects the YouTube country setting and hl selects its interface language. These settings do not guarantee that every result comes from that country or uses that language. Search words are used as supplied, not automatically translated.

What data can you extract from YouTube Shorts?

Each row describes one Short. Field availability depends on what YouTube shows; search rows often lack channel details.

FieldDescriptionExample
rowTypeRow category.short
idRow identifier, equal to the video ID.AbCdEf12345
videoIdYouTube video identifier.AbCdEf12345
titleTitle from YouTube or its accessibility label; empty when unavailable.Quick pasta tips
urlDirect link to the Short.https://www.youtube.com/shorts/AbCdEf12345
viewCountNumeric value parsed from the visible label; null when the label is missing or unparseable.12000
viewCountTextView label supplied by YouTube.12K views
likeCountLikes when a real source exposes them; null on all current surfaces.null
thumbnailUrlThumbnail link; may be constructed from the video ID.https://i.ytimg.com/vi/AbCdEf12345/oar2.jpg
accessibilityTextAvailable accessibility label.Quick pasta tips, 12K views
channelNameChannel name when available.Example Channel
channelIdChannel identifier when available.UC1234567890123456789012
channelUrlChannel link when available.https://www.youtube.com/channel/UC1234567890123456789012
sourcechannel_shorts or search.channel_shorts
scrapedAtCollection time in UTC, not publication time.2026-10-24T08:00:00Z
glCountry setting used for the input.US
hlInterface language used for the input.en

Keep viewCountText alongside viewCount: a rounded label is not an exact audience measurement. Neither field represents unique viewers.

How to scrape YouTube Shorts

  1. Open YouTube Shorts Scraper in Apify Console.
  2. Fill Channel URLs, Search queries, or both. Remove sample search words if you only want channels.
  3. Set Max results per input to 3 or 5 for a small first run.
  4. Click Start and wait for completion.
  5. Open the dataset and download it, or read the rows through the API.

An empty input, including {}, starts an example search for cooking tips with at most 3 rows. This is a real collection run with normal event charges, not a free preview. Filling either target list selects the appropriate collection automatically; both lists can remain populated.

Channel collection

Use a link such as https://www.youtube.com/@YouTube, a bare @YouTube handle, or a channel ID. Channel paths /@name, /channel/UC..., /c/name, and /user/name are accepted. Links from YouTube subdomains and links ending in /shorts or /videos are normalized to the channel. A watch-page link is not a channel input.

Enter one topic per list entry, such as cooking tips. The Actor collects Shorts that YouTube returns for that topic. Search is not a complete catalog of every matching upload, and the requested row count is an upper limit rather than a guaranteed result count.

What to fill in

FieldWhat to enterDefault
channelUrlsList of channel links, handles, or channel IDs.Empty
searchQueriesList of search words; use either target list or both.No target default; form sample is cooking tips
maxResultsMaximum rows for each channel or query, from 1 to 5000.70; form sample is 3
glTwo-letter country code, such as US, DE, or JP.US
hlInterface language code, such as en, de, or ja.en
useProxyForSearchOptional retry setting for failed collection requests. Usually leave off.false
concurrencyRequested parallel input count, from 1 to 16; it does not guarantee faster collection.8

Channel example:

{
"channelUrls": ["https://www.youtube.com/@YouTube"],
"maxResults": 3
}

Search example:

{
"searchQueries": ["cooking tips"],
"maxResults": 3
}

Combined example:

{
"channelUrls": ["https://www.youtube.com/@YouTube"],
"searchQueries": ["cooking tips"],
"maxResults": 3
}

The combined example requests up to 6 rows before run-wide limits. maxItems and limit are aliases for maxResults; keywords is accepted for searchQueries. Prefer canonical names in saved inputs.

Unknown fields do not fail input resolution: close misspellings can be corrected, and other unknown fields are ignored with a note. Each normal Actor run writes INPUT_REPORT to its default key-value store, showing normalization, ignored fields, inferred collection, and validation errors.

Invalid channel targets stop the run before any rows are charged. The message starts with INVALID_INPUT:, names the field, and explains the correction, for example INVALID_INPUT: channelUrls — use YouTube channel links such as youtube.com/@name or youtube.com/channel/UC..., or a bare @name. Not every invalid setting fails: some unsupported values are ignored or normalized. The start fee is separate from row charges.

Output example

Illustrative channel row; these values are examples, not a live measurement:

{
"rowType": "short",
"id": "AbCdEf12345",
"videoId": "AbCdEf12345",
"title": "Quick pasta tips",
"url": "https://www.youtube.com/shorts/AbCdEf12345",
"viewCount": 12000,
"viewCountText": "12K views",
"likeCount": null,
"thumbnailUrl": "https://i.ytimg.com/vi/AbCdEf12345/oar2.jpg",
"accessibilityText": "Quick pasta tips, 12K views",
"channelName": "Example Channel",
"channelId": "UC1234567890123456789012",
"channelUrl": "https://www.youtube.com/channel/UC1234567890123456789012",
"source": "channel_shorts",
"scrapedAt": "2026-10-24T08:00:00Z",
"gl": "US",
"hl": "en"
}

Export the dataset as JSON, CSV, Excel, XML, RSS, or an HTML table. The output also links to RUN_SUMMARY, the normalized INPUT_ECHO, and ERROR_SUMMARY when a failure is recorded. RUN_SUMMARY includes the requested inputs, collected count, and completion time.

Why use this YouTube Shorts scraper?

  • Pay for delivered rows: row charges apply to rows written to the dataset, plus the start fee.
  • Keep delivered data: rows already written remain available after a stop or timeout. Rows still being collected are not guaranteed to reach the dataset.
  • Check failures: invalid targets identify the field to correct; recorded collection failures have an ERROR_SUMMARY.
  • Compare inputs: collect channel and keyword results together, then sort the exported rows by viewCount.
  • Understand missing values: unavailable likes remain null, channel details can be empty, and missing view counts can be zero.
  • No proxy setup: you do not need to set up proxies. No YouTube login or YouTube API key is required.

How much does it cost to scrape YouTube Shorts?

The Actor uses pay-per-event pricing. The start event costs $0.005 per GB of memory, with a minimum of one event. At the default 1024 MB, the start charge is $0.005. Each delivered Short row costs $0.001.

Apify planStart at 1024 MBPrice per rowPrice per 1,000 rows
Free$0.005$0.001$1.00
Starter$0.005$0.001$1.00
Scale$0.005$0.001$1.00
Business$0.005$0.001$1.00

Platform usage is included in these prices. There is no additional charge for an optional row type because this Actor only delivers Short rows.

  • maxResults applies separately to each input and defaults to 70. Larger requests are collected in parts; YouTube may supply fewer rows than requested.
  • Free Apify plan runs are capped at 200 rows for the whole run, with 10 runs of this Actor allowed for free-plan users.
  • The whole run stops at the Maximum cost per run you set in the run options, named maxTotalChargeUsd in the API. It is not an Actor input field.

Example: three queries returning five rows each produce 15 rows. At 1024 MB, the cost is 15 × $0.001 + $0.005 = $0.020 on the Free plan. If fewer rows are delivered, the row charge is lower; the start fee still applies.

What happens when the run timeout is too short

When collection needs more time and automatic resumption is accepted, the run can pause rather than fail. Its status message reads: "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." The run temporarily appears as ABORTED.

When results are ready, the same run starts again, reports "Resumed: delivering N rows.", writes to the same dataset, and finishes as SUCCEEDED if delivery succeeds. The delivery step skips rows already present so they are not delivered or charged twice. You do not need to start a replacement run.

Automatic resumption is bounded, not an unlimited extension. Keep the default timeout of 1800 seconds to reduce early pauses. This behavior is not a guarantee that every timeout or manually aborted run will resume; check the status message.

The synchronous API endpoints run-sync and run-sync-get-dataset-items wait at most 300 seconds and can return an empty dataset while the run is paused. For larger requests, start a run asynchronously and read the dataset after SUCCEEDED, or use a webhook for the succeeded event.

Use with AI agents and the API

Apify MCP server

Add this remote MCP server in Claude, ChatGPT, Cursor, VS Code, or another compatible client:

https://mcp.apify.com?tools=lentic_clockss/youtube-shorts-scraper

Sign in with Apify through OAuth when prompted, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns the run and dataset IDs; the agent reads rows with get-dataset-items.

Clients without remote MCP support can use npx @apify/actors-mcp-server --tools lentic_clockss/youtube-shorts-scraper with APIFY_TOKEN configured. Example prompt: "Collect three YouTube Shorts for cooking tips and show their titles, view counts, and links."

Apify API

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lentic_clockss/youtube-shorts-scraper").call(
run_input={"searchQueries": ["cooking tips"], "maxResults": 3}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row)

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('lentic_clockss/youtube-shorts-scraper').call({
searchQueries: ['cooking tips'], maxResults: 3,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

For asynchronous HTTP calls, send the input JSON to POST https://api.apify.com/v2/acts/lentic_clockss~youtube-shorts-scraper/runs with an Authorization: Bearer <YOUR_APIFY_TOKEN> header. After completion, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.

Standby HTTP endpoint

Endpoint: https://lentic-clockss--youtube-shorts-scraper.apify.actor.

The current HTTP endpoint exposes these read-only routes, also listed in openapi.json:

RoutePurpose
GET /Service information.
GET /healthHealth status.
GET /input-exampleExample input.
GET /openapi.jsonAPI document.

The API document also lists GET /channel?url=...&maxResults=3, POST /channel, GET /search?query=...&maxResults=3, POST /search, and POST /run. These collection routes are not enabled in the current implementation. Use the Apify run API above to collect rows; do not treat those listed routes as working alternatives.

Integrations

Use the Actor's Integrations tab to connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable, or your own webhook. Apify Schedules can start recurring runs. Save timestamps alongside counts when comparing snapshots over time.

FAQ

This Actor collects public data. You are responsible for complying with applicable terms and data protection law. Public availability does not remove those obligations; processing personal data requires a lawful basis.

Why did my run end as ABORTED?

A short timeout can trigger a temporary pause for automatic resumption. Look for the queued status message described above. A manual abort or a different error is not the same condition and does not promise automatic recovery.

How many results can I get?

Request up to 5000 rows per input with maxResults. Actual delivery depends on available Shorts, the run cost limit, and free-plan limits. Two queries with maxResults: 3 request up to six rows, not three total.

Why are some fields empty?

YouTube does not expose every field on every result. Search rows often lack channel information. likeCount is null unless a source exposes it; viewCount is null when its label is missing or cannot be parsed — zero only means an explicit "No views" label.

Do I need a YouTube API key or account?

No YouTube API key or login is required. You need an Apify account to run the Actor and an Apify token for authenticated API calls.

Does this include view count history?

No. Each row is a snapshot. Schedule separate runs and compare videoId, scrapedAt, and counts yourself. scrapedAt is not the upload date.

Can I search and collect channels in the same run?

Yes. Fill both target lists. Keep videoId when merging exports so you can identify the same Short across inputs and runs. Do not assume the result order is a global ranking by views.

Does it download videos or extract transcripts?

No. It returns metadata, thumbnail links, and Shorts links. Video downloads, comments, transcripts, and long-form video collection are outside this Actor's scope.

Limitations

  • Search results and channel pages do not guarantee complete historical coverage.
  • Private, removed, or sign-in-only Shorts are not supported.
  • Country and interface-language settings are not strict content filters.
  • Likes and channel metadata are not available for every row; thumbnail dimensions are not guaranteed.
  • View labels can be rounded, and missing or unparseable counts can appear as zero.
  • No date-window filter, publication timestamp, historical engagement series, or guaranteed view-based ordering is provided.
  • The HTTP endpoint currently provides discovery routes, not direct collection.

More social media and video scrapers from the same publisher:

Browse all of our scrapers at apify.com/lentic_clockss.

Support

Report a problem or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.