# YouTube Scraper - $1/1k Videos, Channels, Search & Shorts (`smolder/youtube-video-scraper`) Actor

$1 per 1,000 videos. Scrape YouTube video data from searches, channels (videos, Shorts, live), playlists and URLs: title, views, likes, publish date, duration, channel, category, tags, hashtags, description, thumbnail. Search filters by upload date and popularity. No login.

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

## Pricing

from $1.00 / 1,000 videos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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, Search & Shorts ($1 per 1,000)

Scrape **YouTube video data in bulk** from **YouTube searches**, **channels** (videos, Shorts or live streams), **playlists** and video URLs. Every video comes back as one clean row: title, views, **likes**, **publish date**, duration, channel, category, tags, hashtags, description and thumbnail.

**$1 per 1,000 videos**, platform and proxy costs included. Unavailable videos are never charged. No login or API key needed.

### What can it do?

- 🔎 **YouTube search to data:** search any keyword and get the top results, with **filters by upload date** (last hour, today, this week, this month, this year) and **sort by popularity**.
- 📺 **Whole channels:** `@mkbhd` or any channel URL; the newest uploads first. Choose the **Videos**, **Shorts** or **Live** tab.
- 📃 **Playlists:** every video in playlist order.
- 🎬 **Video URLs:** details for specific videos, Shorts, youtu.be links and live replays.
- 👍 **Likes and exact dates:** like count and ISO publish date for every video, not just "3 weeks ago".
- 📊 **Ranking position:** the `position` field keeps each video's rank in its search, channel or playlist, ready for SEO and trend tracking.
- 🛡️ **Reliable and fast:** uses cheap datacenter proxies and automatically switches to residential proxies when YouTube shows its bot check. 1,000 videos take about 2 minutes.

### Use cases

- **Market and competitor research:** see what performs in your niche, which channels post most, and what their videos get in views and likes.
- **Influencer discovery:** find creators by topic, then compare their recent videos' engagement.
- **SEO and content ideas:** track which titles, tags and hashtags rank for a keyword over time.
- **Trend monitoring:** schedule a daily search with "Today" or "This week" to catch new videos on a topic.
- **Datasets for AI and analytics:** build clean video datasets for dashboards, LLM pipelines or academic research.

### How to use it

1. Click **Try for free**.
2. Add **YouTube searches**, **channels**, **playlists** or **video URLs** (any mix).
3. Optional: set the **search filters** and the **channel tab**.
4. Click **Start**, then download your data as JSON, CSV or Excel, or use it through the API, Make, Zapier or n8n.

### Input examples

The 100 most popular videos uploaded this month about a topic:

```json
{
    "searchQueries": ["ai agents"],
    "searchSort": "popularity",
    "uploadDate": "month",
    "maxVideosPerSource": 100
}
```

The 50 latest Shorts from two channels:

```json
{
    "channels": ["@mkbhd", "https://www.youtube.com/@TED"],
    "channelTab": "shorts",
    "maxVideosPerSource": 50
}
```

### Output example

One row per video (description shortened):

```json
{
    "videoId": "arj7oStGLkU",
    "url": "https://www.youtube.com/watch?v=arj7oStGLkU",
    "title": "Inside the Mind of a Master Procrastinator | Tim Urban | TED",
    "channelName": "TED",
    "channelId": "UCAuUUnT6oDeKwE6v1NGQxug",
    "channelUrl": "https://www.youtube.com/channel/UCAuUUnT6oDeKwE6v1NGQxug",
    "channelHandle": "@TED",
    "publishedAt": "2016-04-06T09:59:35-07:00",
    "uploadedAt": "2016-04-06T09:59:35-07:00",
    "durationSeconds": 844,
    "duration": "14:04",
    "viewCount": 62138830,
    "likeCount": 2055247,
    "category": "People & Blogs",
    "keywords": ["TED Talk", "Tim Urban", "procrastination", "productivity"],
    "hashtags": [],
    "description": "Tim Urban knows that procrastination doesn't make sense, …",
    "thumbnailUrl": "https://i.ytimg.com/vi/arj7oStGLkU/maxresdefault.jpg",
    "isShort": false,
    "isLiveContent": false,
    "isLiveNow": false,
    "isUnlisted": false,
    "isFamilySafe": true,
    "ratingsAllowed": true,
    "source": "search: procrastination",
    "position": 1,
    "scrapedAt": "2026-10-29T12:10:00.000Z"
}
```

The **Output** tab describes every field. Videos and inputs that produced no data (private or deleted videos, invalid links, channels not found) are listed with the reason in the **FAILED_VIDEOS** record of the run's key-value store.

### How much does it cost?

**$1.00 per 1,000 videos**, plus a tiny start fee per run. Platform usage and proxies are included.

| Videos | Price  |
| ------ | ------ |
| 100    | $0.10  |
| 1,000  | $1.00  |
| 10,000 | $10.00 |

Unavailable videos are **never charged**. You can set a **maximum cost per run**; the scraper stops when it's reached and never charges more. The Apify Free plan's monthly credit covers thousands of videos.

### Tips

- **Fresh content:** combine a search with *Upload date: Today* and schedule the run daily.
- **Most viewed:** set *Search: sort by* to *Popularity*.
- **Big jobs:** raise *Maximum videos in total* (up to 10,000 per run) and *Videos per search, channel or playlist* (up to 5,000).
- **Need transcripts too?** Use our [YouTube Transcript Scraper](https://apify.com/smolder/youtube-transcript-scraper) on the same videos.

### FAQ

**Do I need a YouTube API key or account?**
No. The scraper reads public video pages the way the YouTube app does.

**Why is `likeCount` empty for some videos?**
The creator hid the like count. Everything else is still returned.

**How many results does a search return?**
Up to 5,000 per search, following YouTube's own order. YouTube usually stops offering new results after several hundred to a few thousand videos per query; use more specific searches or upload-date filters to go further.

**Is it legal?**
It collects publicly available video information, with no login and no data about viewers. Respect copyright and YouTube's terms when you reuse the data. If in doubt, consult a lawyer. Read more about [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

**Do I need to configure proxies?**
No. The default setting handles YouTube's bot checks automatically.

### Limitations

- Private, deleted and members-only videos can't be scraped (they're listed in FAILED_VIDEOS and not charged).
- Upload-date filters and popularity sort apply to searches; channels are always newest first.
- Comment counts and subscriber counts are not included.

### Support

Found a bug or need a feature? Open an issue in the **Issues** tab with your run ID.

# Actor input Schema

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

Search YouTube and scrape the matching videos, for example "budget travel morocco". Use the search filters below to sort by popularity or limit to recent uploads.

## `channels` (type: `array`):

Scrape a channel's latest videos (newest first). Use an @handle, a channel URL or a channel ID, for example "@mkbhd". Choose Videos, Shorts or Live with Channel tab.

## `playlists` (type: `array`):

Scrape the videos of a playlist, in playlist order. Use a playlist URL or ID.

## `videos` (type: `array`):

Get the details of specific videos. Normal videos, Shorts, youtu.be links, embeds and live replays all work.

## `maxVideosPerSource` (type: `integer`):

How many videos to take from each search, channel and playlist.

## `maxVideos` (type: `integer`):

Safety cap on the number of videos in one run, across all inputs (up to 10,000).

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

Order of search results. Applies to YouTube searches only.

## `uploadDate` (type: `string`):

Only return videos uploaded in this period. Applies to YouTube searches only.

## `channelTab` (type: `string`):

Which part of each channel to scrape.

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

Leave the default: the scraper uses Apify's datacenter proxies and automatically switches to residential proxies when YouTube shows its bot check. Only change this if you want to force a specific proxy.

## Actor input object example

```json
{
  "searchQueries": [
    "web scraping tutorial"
  ],
  "maxVideosPerSource": 20,
  "maxVideos": 100,
  "searchSort": "relevance",
  "uploadDate": "any",
  "channelTab": "videos",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `failedVideos` (type: `string`):

No description

# 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 = {
    "searchQueries": [
        "web scraping tutorial"
    ],
    "maxVideosPerSource": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("smolder/youtube-video-scraper").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 = {
    "searchQueries": ["web scraping tutorial"],
    "maxVideosPerSource": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("smolder/youtube-video-scraper").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 '{
  "searchQueries": [
    "web scraping tutorial"
  ],
  "maxVideosPerSource": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call smolder/youtube-video-scraper --silent --output-dataset

```

## MCP server setup

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

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/p9IYk8OQUfrGCdYN9/builds/feZg8D2RlD5vBsOrH/openapi.json
