# YouTube Scraper: Video, Channel, Playlist & Search (No API Key) (`scrapers_lat/youtube-scraper`) Actor

Scrape YouTube videos, channels, playlists and search results without the YouTube API or an API key. Get exact view and like counts, subscribers, duration, tags, category, publish date, thumbnails, chapters and hashtags. Sort and filter search. No key, no quota. Export JSON, CSV, Excel.

- **URL**: https://apify.com/scrapers_lat/youtube-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Social media, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 9 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.00 / 1,000 results

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](https://scrapers.lat/banners/youtube-scraper.png)](https://console.apify.com/actors/Kk9On7a8BlezvXwa4/input)

## YouTube Scraper: Video, Channel, Playlist and Search Data (No API Key)

Scrape YouTube video data, channel data, playlists and search results.

### Sample output

| Field | Example value |
|---|---|
| `url` | `https://www.youtube.com/watch?v=dQw4w9WgXcQ` |
| `title` | Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster) |
| `channelName` | Rick Astley |
| `channelUrl` | `https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw` |
| `channelHandle` | @RickAstleyYT |
| `subscriberText` | 4.53M subscribers |
| `uploadDate` | 2009-10-25 |
| `category` | Music |

You can test it on a free Apify plan with up to 10 results per run.

Scrape YouTube video data, channel data, playlists and search results without the official YouTube Data API, no API key and no quota. Give it search queries, video URLs, channel URLs or handles, or playlist URLs and get one clean JSON record per video with title, description, exact view count, exact like count, channel name and subscriber count, duration, publish date, tags, category, thumbnails, hashtags, chapters and Shorts / Live flags. Export to JSON, CSV or Excel.

Here is one real result, with the fields the actor returns for an enriched video:

```json
{
  "videoId": "dQw4w9WgXcQ",
  "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
  "description": "The official video for \"Never Gonna Give You Up\" by Rick Astley ...",
  "channelName": "Rick Astley",
  "channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
  "channelUrl": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw",
  "channelHandle": "@RickAstleyYT",
  "subscriberText": "4.53M subscribers",
  "subscriberCount": 4540000,
  "viewCount": 1811933605,
  "viewCountText": "1,811,933,605 views",
  "likeCount": 19374320,
  "likeCountText": "19374320",
  "commentCount": null,
  "duration": null,
  "durationSeconds": 213,
  "publishedText": "Oct 24, 2009",
  "publishedAt": "2009-10-24",
  "uploadDate": "2009-10-25",
  "category": "Music",
  "tags": ["rick astley", "Never Gonna Give You Up", "nggyu", "rick roll"],
  "hashtags": ["#RickAstley", "#NeverGonnaGiveYouUp"],
  "chapters": [],
  "isLive": false,
  "isUpcoming": false,
  "isShort": false,
  "isFamilySafe": true,
  "availableCountriesCount": 249,
  "thumbnailUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg",
  "thumbnails": [{ "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg", "quality": "1280x720" }],
  "source": "video",
  "detailsFetched": true,
  "observedAt": "2026-09-05T12:00:00.000Z",
  "error": null
}
```

**[Input](https://apify.com/scrapers_lat/youtube-scraper/input-schema) | [Output](https://apify.com/scrapers_lat/youtube-scraper/output-schema) | [Pricing](https://apify.com/scrapers_lat/youtube-scraper/pricing) | ▶️ [Examples](https://apify.com/scrapers_lat/youtube-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-YouTube-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What this YouTube scraper does](#what-this-youtube-scraper-does)
- [Why use it (no API key, no quota)](#why-use-it-no-api-key-no-quota)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Comparison with other YouTube scrapers](#comparison-with-other-youtube-scrapers)
- [Common use cases](#common-use-cases)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What this YouTube scraper does

This is a YouTube data extractor and video metadata API that reads YouTube's public data layer and returns one normalized record per video. It accepts four kinds of input, in any combination:

- **Search queries** (`searchQueries`): keywords to search YouTube for, with optional sort order, upload-date, duration and type filters. This is your no-key YouTube Search API.
- **Video URLs** (`videoUrls`): video URLs or IDs to fetch full per-video details for, including the channel's subscriber count, description and chapters.
- **Channel URLs or handles** (`channelUrls`): pull a channel's recent videos for channel analytics and monitoring.
- **Playlist URLs** (`playlistUrls`): pull every video in a playlist.

Turn on `enrichDetails` (default) and each video is upgraded with a full detail record: exact like and view counts, tags / keywords, category, duration in seconds, exact publish and upload dates, channel handle, hashtags, and Shorts / Live flags. Missing values are always returned as `null` so your schema stays stable.

### Why use it (no API key, no quota)

- **No API key and no OAuth.** You do not need a Google Cloud project or the official YouTube Data API. There is no daily quota to run out of.
- **Exact numbers.** Get the exact like count and exact view count, not rounded "19M" style values.
- **Four inputs in one actor.** Search, video, channel and playlist scraping in a single run.
- **Fast HTTP transport.** No headless browser, so runs are quick and cheap.
- **Structured, stable output.** Every record carries the same fields with honest `null`s, ready for JSON, CSV or Excel.

### Quickstart

Open the actor, paste this into the input, and press Run. It returns the top 10 videos for a search, sorted by view count.

```json
{
  "searchQueries": ["lofi hip hop"],
  "sortBy": "views",
  "maxVideos": 10,
  "enrichDetails": true,
  "country": "US",
  "language": "en"
}
```

Provide any combination of `searchQueries`, `videoUrls`, `channelUrls` and `playlistUrls`.

### Input reference

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `searchQueries` | string\[] | no | `["lofi hip hop"]` | Keywords to search YouTube for. Each query returns matching videos. |
| `videoUrls` | string\[] | no | `[]` | Video URLs or IDs (`watch?v=...`, `youtu.be/...`, `/shorts/...`, or a bare 11-character ID). |
| `channelUrls` | string\[] | no | `[]` | Channel URLs or handles (`/@handle`, `/channel/UC...`, `/c/name`). Returns the channel's recent videos. |
| `playlistUrls` | string\[] | no | `[]` | Playlist URLs or playlist IDs (`playlist?list=PL...`, or a bare `PL...` id). |
| `maxVideos` | integer | no | `50` | Maximum number of videos to return across all inputs. Free Apify plans are capped at 10 per run. |
| `sortBy` | string | no | `relevance` | Sort search results: `relevance`, `date`, `views`, `rating` (search only). |
| `uploadDate` | string | no | `any` | Upload-date filter: `any`, `hour`, `today`, `week`, `month`, `year` (search only). |
| `duration` | string | no | `any` | Duration filter: `any`, `short` (<4 min), `medium` (4-20 min), `long` (>20 min) (search only). |
| `videoType` | string | no | `any` | Result type: `any`, `video`, `channel`, `playlist`, `movie` (search only). |
| `enrichDetails` | boolean | no | `true` | Fetch each video's full detail record (see below). Adds a paid `details` event per enriched video on paying accounts. Turn off for the fastest, cards-only run. |
| `country` | string | no | `US` | Two-letter country code for results (`gl`). |
| `language` | string | no | `en` | Interface language code (`hl`). |

At least one of `searchQueries`, `videoUrls`, `channelUrls` or `playlistUrls` must be provided.

### Output reference

One dataset item per video. Types are `string`, `integer`, `boolean`, array, or `null` when the source value is absent.

| Field | Type | Description |
|---|---|---|
| `videoId` | string | YouTube 11-character video ID. |
| `url` | string | Canonical watch URL. |
| `title` | string | Video title. |
| `description` | string | Video description (full on detail records, snippet on search cards). |
| `channelName` | string | Name of the channel that published the video. |
| `channelId` | string | Channel ID (`UC...`). |
| `channelUrl` | string | Canonical channel URL. |
| `channelHandle` | string | Channel handle, for example `@RickAstleyYT`. |
| `subscriberText` | string | Channel subscriber count as shown, for example `4.53M subscribers`. |
| `subscriberCount` | integer | Subscriber count parsed to an integer. |
| `viewCount` | integer | Exact view count (from the detail record) or parsed card value. |
| `viewCountText` | string | View count as shown. |
| `likeCount` | integer | Exact like count from the detail record, or `null`. |
| `likeCountText` | string | Like count as text. |
| `commentCount` | integer | Comment count. Returned `null` (see FAQ). |
| `duration` | string | Duration text, for example `1:44:52` (on search / channel / playlist cards). |
| `durationSeconds` | integer | Duration in whole seconds (from the detail record). |
| `publishedText` | string | Relative or absolute publish text, for example `3 years ago` or `Oct 24, 2009`. |
| `publishedAt` | string | Exact publish date normalized to `YYYY-MM-DD`. |
| `uploadDate` | string | Upload date normalized to `YYYY-MM-DD`. |
| `category` | string | YouTube category, for example `Music`, `Gaming`, `Education`. |
| `tags` | string\[] | Video tags / keywords set by the creator. |
| `hashtags` | string\[] | Hashtags parsed from the description. |
| `chapters` | array | Chapters as `{ title, startSeconds, startText }` when the creator set them (video URLs). |
| `isLive` | boolean | `true` for a live stream. |
| `isUpcoming` | boolean | `true` for a scheduled / premiere video. |
| `isShort` | boolean | `true` for a YouTube Short. |
| `isFamilySafe` | boolean | Family-safe flag. |
| `availableCountriesCount` | integer | Number of countries the video is available in. |
| `thumbnailUrl` | string | URL of the best available thumbnail. |
| `thumbnails` | array | All available thumbnails as `{ url, quality }`. |
| `source` | string | `search`, `video`, `channel` or `playlist`. |
| `playlistId` / `playlistTitle` | string | Present on `playlist`-source records. |
| `detailsFetched` | boolean | `true` when the detail add-on enriched this record. |
| `observedAt` | string | ISO 8601 timestamp when the record was collected. |
| `error` | string | `null` on success; populated instead of data when an item could not be fetched (never charged). |

### Comparison with other YouTube scrapers

Honest comparison against popular Apify YouTube scrapers such as `streamers/youtube-scraper` and `bernardo/youtube-scraper`.

| Capability | This actor | streamers / bernardo |
|---|---|---|
| Search query scraping | Yes | Yes |
| Sort order (relevance / date / views / rating) | Yes | Yes |
| Upload-date, duration and type filters | Yes | Yes |
| Video URL scraping | Yes | Yes |
| Channel URL / handle scraping | Yes | Yes |
| Playlist URL scraping | Yes | Yes |
| Exact like count | Yes | Partial |
| Exact view count | Yes | Yes |
| Tags / keywords | Yes | Yes |
| Category, family-safe, availability | Yes | Partial |
| Channel handle + subscriber count | Yes | Yes |
| Shorts / Live / Upcoming flags | Yes | Yes |
| Hashtags and chapters | Yes | Partial |
| No API key required | Yes | Yes |
| Full comment scraping | No | Yes |
| Subtitles / transcript download | No | Yes |
| Headless browser | No (HTTP only, faster) | Yes |

Where the browser-based leaders reach further: `streamers/youtube-scraper` can download full **comment threads** and **subtitles / transcripts**, which this HTTP-only actor does not. If you need comments or transcripts, use a browser-based actor for those two fields. For everything else, including exact like counts, tags, category and availability, this actor returns a strict superset with faster, cheaper runs. Need transcripts specifically? See our [YouTube Video Summarizer](https://apify.com/scrapers_lat/youtube-summarizer-tool).

### Common use cases

- **YouTube search API without a key**: pull ranked results for any keyword with sort and date filters.
- **Channel analytics and monitoring**: track a channel's latest videos, view counts and publish dates.
- **Competitor and trend research**: collect tags, categories and view counts across many videos.
- **Content and playlist audits**: export an entire playlist to CSV or Excel.
- **Video metadata enrichment**: resolve a list of video URLs or IDs into full records for a dataset or dashboard.

### Run via API and CLI

Start a run and read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~youtube-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["lofi hip hop"],"sortBy":"views","maxVideos":25}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~youtube-scraper/runs?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"channelUrls":["https://www.youtube.com/@RickAstleyYT"],"maxVideos":50}'
```

Apify CLI:

```bash
apify call scrapers_lat/youtube-scraper \
  --input '{"videoUrls":["https://www.youtube.com/watch?v=dQw4w9WgXcQ"]}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object.

### Billing and limits

- **Pay per result.** You are charged per video record returned (`result` event). See the [pricing tab](https://apify.com/scrapers_lat/youtube-scraper/pricing) for the current per-result price.
- **Optional details add-on.** When `enrichDetails` is on, each enriched video also charges a small `details` event for the full detail record (exact counts, tags, category, dates and flags). Enrichment and its charge apply to paying accounts only. Turn `enrichDetails` off to pay the base result price only.
- **No charge on failure.** Items that cannot be fetched are written with a populated `error` field and are not charged. Empty runs cost nothing.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable results.
- **Free Apify plans** are capped at 10 records per run. Upgrade for higher `maxVideos`.

### FAQ and troubleshooting

**Do I need a YouTube API key?**
No. This actor reads YouTube's public data layer directly. There is no API key, no OAuth and no daily quota.

**A run returned 0 records. Why?**
No input was provided, or the search matched nothing. Provide at least one of `searchQueries`, `videoUrls`, `channelUrls` or `playlistUrls`. Zero-result runs are not charged.

**Why is `likeCount` or `tags` null on some records?**
Exact like counts, tags, category and duration in seconds come from the detail add-on. Keep `enrichDetails` on so search, channel and playlist cards are upgraded. On free Apify accounts the detail add-on does not run, so those fields stay `null`.

**Why is `commentCount` null?**
Comment counts are not exposed on the public video data layer without an extra paginated request, so this field is returned as `null` for honesty rather than guessed.

**Can I get comments or subtitles / transcripts?**
Not from this actor. Full comment threads and subtitles require a browser-based scraper. See the comparison table above.

**Can I mix search, video, channel and playlist inputs?**
Yes. Provide any combination; results from all sources are merged and deduplicated by video ID up to `maxVideos`.

**Is this an official YouTube tool?**
No. This actor is independent and has no affiliation with YouTube or Google. It reads only data that is publicly available.

### Related scrapers

- [YouTube Video Summarizer](https://apify.com/scrapers_lat/youtube-summarizer-tool): AI summaries of YouTube videos from their transcript.
- [Yellow Pages Canada Business Leads Scraper](https://apify.com/scrapers_lat/yellowpages-canada-scraper): Canadian business leads.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

> Independent tool, not affiliated with YouTube or Google. Accesses only publicly available data.

# Actor input Schema

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

Maximum number of videos to return across all inputs.

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

Keywords to search YouTube for. Each query returns matching videos.

## `videoUrls` (type: `array`):

YouTube video URLs or IDs to fetch full details for (https://www.youtube.com/watch?v=..., https://youtu.be/...).

## `channelUrls` (type: `array`):

YouTube channel URLs or handles to pull recent videos from (https://www.youtube.com/@handle, /channel/UC..., /c/name).

## `playlistUrls` (type: `array`):

YouTube playlist URLs or playlist IDs to pull videos from (https://www.youtube.com/playlist?list=PL..., or a bare PL... id).

## `sortBy` (type: `string`):

Order for search results (applies to searchQueries only).

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

Only return videos uploaded within this window (search only).

## `duration` (type: `string`):

Only return videos of this length (search only).

## `videoType` (type: `string`):

Restrict search results to a single type (search only).

## `enrichDetails` (type: `boolean`):

Fetch each video's full detail record: exact like and view counts, tags/keywords, category, duration in seconds, exact publish and upload dates, channel handle, subscriber count, hashtags, chapters, and Shorts/Live flags. Adds a paid 'details' event per enriched video (paying accounts only). Turn off for the fastest, cards-only run.

## `country` (type: `string`):

Two-letter country code for results (gl).

## `language` (type: `string`):

Interface language code (hl).

## Actor input object example

```json
{
  "maxVideos": 10,
  "searchQueries": [
    "lofi hip hop"
  ],
  "videoUrls": [],
  "channelUrls": [],
  "playlistUrls": [],
  "sortBy": "relevance",
  "uploadDate": "any",
  "duration": "any",
  "videoType": "any",
  "enrichDetails": true,
  "country": "US",
  "language": "en"
}
```

# Actor output Schema

## `results` (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 = {
    "maxVideos": 10,
    "searchQueries": [
        "lofi hip hop"
    ],
    "videoUrls": [],
    "channelUrls": [],
    "playlistUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/youtube-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 = {
    "maxVideos": 10,
    "searchQueries": ["lofi hip hop"],
    "videoUrls": [],
    "channelUrls": [],
    "playlistUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/youtube-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 '{
  "maxVideos": 10,
  "searchQueries": [
    "lofi hip hop"
  ],
  "videoUrls": [],
  "channelUrls": [],
  "playlistUrls": []
}' |
apify call scrapers_lat/youtube-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/youtube-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/Kk9On7a8BlezvXwa4/builds/Tt2ZLE4M7C9YZYt9X/openapi.json
