# YouTube Scraper — Videos, Channels, Shorts & Search (Fast) (`vladased/youtube-scraper-fast`) Actor

Scrape YouTube videos, Shorts, channels, playlists & searches: views, likes, comments count, dates, tags, subscribers. No browser, $2/1k, fast mode $0.5/1k.

- **URL**: https://apify.com/vladased/youtube-scraper-fast.md
- **Developed by:** [obie](https://apify.com/vladased) (community)
- **Categories:** Videos, Social media, Agents
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 video (full detail)s

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 Scraper: Videos, Channels, Shorts & Search (Fast)

**Scrape YouTube videos, Shorts, live streams, whole channels, playlists and search results in one run: views, likes, comments count,
exact publish date, duration, tags, hashtags, description links, chapters, plus channel stats on every row (subscribers, total views,
video count, country, joined date, links).** No browser, so it's fast and cheap.
**$2 per 1,000 videos in full detail, $0.50 per 1,000 in fast mode.** Date filters are free. Removed or private videos are listed and cost nothing.

### Why this one

| | This Actor | Typical YouTube scrapers |
|---|---|---|
| Price | **$2 / 1,000 videos** (full) · **$0.50 / 1,000** (fast) | $2.40–$5 / 1,000, date filter often an extra fee |
| Date filters | Free; also sets YouTube's own search filter so runs page less | Paid add-on or post-filtering |
| Speed | YouTube's lightweight app API: ~20 full videos in 7 s, 100 fast rows per request | Browser page loads |
| Transcripts | Optional captions as plain text on each video row, in your preferred languages — **billed only when the video has captions** | Separate actor, or paid AI transcription per minute |
| Channel stats | Subscribers, **exact total views**, video count, country, joined date, links on every video row, fetched once per channel | Often a separate actor or missing |
| Scheduled runs | **Only new videos**: a daily run delivers and bills only new uploads | Re-delivers and re-bills everything |
| Errors | Removed/private/blocked videos come back as rows with a `reasonCode`, **never billed** | Missing rows or failed runs |
| Switching | Accepts `startUrls`, `searchQueries`, `maxResults`, `maxResultsShorts`, `maxResultStreams`, `oldestPostDate`, `sortingOrder`, `dateFilter`, `lengthFilter`; output uses the common field names (`viewCount`, `likes`, `commentsCount`, `date`, `duration`, `text`, `numberOfSubscribers`, `channelTotalViews`…) | — |

### What it does

- **Any input mix:** video URLs or IDs, Shorts, `@handles`, channel URLs, playlist URLs, search-results URLs, and search queries (up to 200 per run).
- **Whole channels:** newest first, up to 5,000 per source. Pick how many regular videos, Shorts and past live streams you want from each channel.
- **Channel profiles only:** set *Max videos* to 0 with channel URLs to get one row per channel (subscribers, total views, video count,
  country, joined date, description, links). Good for creator lists and influencer research.
- **Two detail levels:**
  - **Full** (default): exact publish date and time, likes, comments count, views, duration, category, tags, hashtags, description and its links,
    chapters, Shorts/live flags, thumbnail.
  - **Fast:** title, views, duration and age read straight from channel, playlist and search pages: about 4× cheaper and much faster.
    Ideal for tracking view counts across hundreds of channels. Single video URLs always get full detail.
- **Date filters:** `publishedAfter` / `publishedBefore` as dates or relative (`7 days`, `3 months`). Channel paging stops once it passes the date.
- **Search filters:** sort by relevance/date/views/rating, upload date (last hour → year), duration (under 4 min, 4–20, over 20),
  and YouTube's feature filters: HD, 4K, HDR, subtitles/CC, Creative Commons, live, 3D, 360°, VR180, location, purchased.
- **Only new videos:** turn it on and schedule the run. Each run skips videos it has already delivered to you.
- **Built to keep working:** automatic retries, cheapest network route first (direct → datacenter → residential only when YouTube pushes back),
  results saved as they arrive, and a run moved between servers resumes without re-delivering or re-billing anything.
  A run near its timeout stops cleanly and tells you what's left instead of failing.

### Pricing

Pay per result, no compute fee on top:

| Event | Price | When |
|---|---|---|
| Video (full) | $0.002 | One video row with full detail |
| Video (fast) | $0.0005 | One video row from a listing page |
| Channel profile | $0.002 | One channel row (channel-only mode) |
| Error rows | free | Removed, private, or blocked videos |

Volume discounts apply on higher Apify plans. Apify's free plan ($5/month credit) covers about 2,500 full or 10,000 fast videos a month.
Set *Maximum cost per run* in Run options and the Actor stops there cleanly.

### Input examples

Latest 50 videos and 20 Shorts from two channels, last 90 days:

```json
{ "startUrls": ["@mkbhd", "https://www.youtube.com/@veritasium"], "maxResults": 50, "maxResultsShorts": 20, "publishedAfter": "90 days" }
```

Top 200 search results, fast mode (view tracking):

```json
{ "searchQueries": ["pickleball highlights", "ai agents tutorial"], "maxResults": 200, "detail": "fast" }
```

Channel profiles only:

```json
{ "startUrls": ["@mkbhd", "@LofiGirl", "@3blue1brown"], "maxResults": 0 }
```

Daily monitor (schedule it; pay only for new uploads):

```json
{ "startUrls": ["@yourcompetitor"], "maxResults": 30, "onlyNewVideos": true }
```

### Output

One row per video (`type: "video"`), channel (`type: "channel"`), or problem (`type: "error"`). Example (full detail, trimmed):

```json
{
  "type": "video", "detail": "full", "id": "_0G4OG39XjI", "url": "https://www.youtube.com/watch?v=_0G4OG39XjI",
  "title": "WTF is a Googlebook?", "channelName": "Marques Brownlee", "channelHandle": "@mkbhd", "channelId": "UCBJycsmduvYEL83R_U4JriQ",
  "date": "2026-10-08T21:00:40Z", "duration": "00:14:12", "durationSeconds": 852, "viewCount": 5258903, "likes": 77872,
  "commentsCount": 6900, "commentsCountText": "6.9K", "category": "Science & Technology", "isShort": false, "isLive": false,
  "hashtags": [], "descriptionLinks": ["http://shop.MKBHD.com"], "keywords": ["Googlebook", "MKBHD"],
  "numberOfSubscribers": 21400000, "channelTotalViews": 5755608883, "channelTotalVideos": 1857, "channelLocation": "United States",
  "channelJoinedDate": "2008-03-21", "input": "https://www.youtube.com/@mkbhd"
}
```

Videos with creator chapters also get `chapters`: `[{"start": 0, "end": 183, "title": "Predict, sample, repeat"}, …]`.
Fast rows carry `title`, `viewCount`, `duration`, `durationSeconds`, `publishedAgo`, `ageDays` (and channel stats unless turned off).
Error rows carry `reasonCode` (`unavailable`, `private`, `not_public`, `blocked`, `temporary_error`) and `retryable`.

The **Overview** and **Channels** dataset views give ready tables; export to JSON, CSV, Excel, or connect Google Sheets, Make, n8n, Zapier,
or call it from an AI agent through the Apify MCP server.

### Good to know

- Counts are what YouTube shows: subscribers and comments are rounded by YouTube (e.g. 2.4K); views, likes and channel total views are exact.
  Fast-mode view counts on channel pages are rounded too (e.g. 1.2M); use full mode for exact views.
- YouTube lists up to the 100 most recent Shorts per channel, and ends a search after a few hundred results (varies by region): use several specific queries for more.
- Fast mode can't date-filter Shorts precisely (YouTube's Shorts pages show no dates); use full mode if dates matter.
- Public data only: no logins, no private or members-only videos, no emails, no downloads. Age-restricted videos may show as errors.
- Channel uploads come newest first. "Most popular" sorting of a channel isn't offered; use a search sorted by views instead.

### Use cases

Competitor and creator research · influencer shortlists with subscriber and country data · view-count tracking for campaigns ·
trend research (pair it with Google Trends) · content-gap analysis from search results · feeding AI agents and dashboards with fresh video data.
Need the spoken words too? Our **YouTube Transcript Scraper** takes the same URLs and returns transcripts and AI-ready chunks. What viewers say? Our **YouTube Comments Scraper** adds comments, replies, audience questions and the moments viewers cite.

### Support

Open an issue on the Actor page; we reply within a day. Tell us the input and run ID and we'll fix it.

# Changelog

This Actor's version history is a separate document: https://apify.com/vladased/youtube-scraper-fast/changelog.md

# Actor input Schema

## `startUrls` (type: `array`):

Any mix of videos, Shorts, channels (@handle or URL), playlists and search-results URLs (max 200). Channels give newest uploads first. Also accepts {url} objects and the field names 'urls', 'videoUrls', 'channelUrls' used by other YouTube actors.

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

Scrape the video results of each YouTube search.

## `searchType` (type: `string`):

Searches return regular videos (default) or Shorts only.

## `maxResults` (type: `integer`):

Cap per source (0–5,000). For channels this counts regular videos; 0 with a channel = channel profile only (no videos).

## `maxResultsShorts` (type: `integer`):

Also scrape this many of each channel's Shorts (0 = none).

## `maxResultStreams` (type: `integer`):

Also scrape this many of each channel's past live streams (0 = none).

## `detail` (type: `string`):

Fast mode reads channel/search/playlist pages only: ~4× cheaper and much faster for bulk view-count tracking. Single video URLs always get full detail.

## `publishedAfter` (type: `string`):

Only videos published on/after this date: YYYY-MM-DD or a relative age like '7 days', '3 months'. Free (no add-on fee). Also accepts 'oldestPostDate'.

## `publishedBefore` (type: `string`):

Only videos published on/before this date (YYYY-MM-DD or '1 year').

## `includeChannelInfo` (type: `boolean`):

Subscribers, total views, video count, country, joined date, links. Fetched once per channel, no extra charge. Default: on in full mode, off in fast mode (keeps bulk view tracking fast).

## `includeCommentCount` (type: `boolean`):

The comments count as YouTube shows it (e.g. 2.4K → 2400). One extra small request per video, no extra charge.

## `includeTranscript` (type: `boolean`):

Full detail only: adds the video's captions as plain text (+ language, auto-generated flag). Billed per video only when captions exist.

## `transcriptLanguages` (type: `array`):

Preferred caption languages in order, e.g. 'en', 'es'. Empty = the video's default.

## `searchSort` (type: `string`):

Order of search results.

## `searchUploadDate` (type: `string`):

Left on 'any', it is set from 'Published after' automatically.

## `searchDuration` (type: `string`):

Video length filter for searches.

## `searchFeatures` (type: `array`):

Only search results with these features (YouTube's own filters).

## `onlyNewVideos` (type: `boolean`):

Remember delivered videos and skip them on later runs with the same input: schedule daily and pay only for new uploads.

## `stateKey` (type: `string`):

Optional: share one 'only new' memory across different inputs.

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

Leave as is: we go direct, then datacenter, then residential only if YouTube pushes back.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.youtube.com/@mkbhd"
  ],
  "searchQueries": [
    "pickleball highlights"
  ],
  "searchType": "videos",
  "maxResults": 10,
  "maxResultsShorts": 0,
  "maxResultStreams": 0,
  "detail": "full",
  "publishedAfter": "30 days",
  "publishedBefore": "2026-01-01",
  "includeCommentCount": true,
  "includeTranscript": false,
  "searchSort": "relevance",
  "searchUploadDate": "any",
  "searchDuration": "any",
  "onlyNewVideos": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per video (or channel): views, likes, comments, date, subscribers.

## `results` (type: `string`):

Every field, incl. description, tags, chapters, channel stats.

# 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 = {
    "startUrls": [
        "https://www.youtube.com/@mkbhd"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vladased/youtube-scraper-fast").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 = { "startUrls": ["https://www.youtube.com/@mkbhd"] }

# Run the Actor and wait for it to finish
run = client.actor("vladased/youtube-scraper-fast").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 '{
  "startUrls": [
    "https://www.youtube.com/@mkbhd"
  ]
}' |
apify call vladased/youtube-scraper-fast --silent --output-dataset

```

## MCP server setup

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

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/fxghA7DAsHuObPDPj/builds/yrdfa2dSyiSZfHqn0/openapi.json
