# YouTube Video Details Scraper (`socialdataapi/youtube-video-details-scraper`) Actor

YouTube Video Details Scraper extracts details for public YouTube videos from links or IDs: title, description, views, likes, comment count, duration, publish date, tags, thumbnails, channel info and transcript. No login needed. Export to JSON, CSV or Excel, or use the API.

- **URL**: https://apify.com/socialdataapi/youtube-video-details-scraper.md
- **Developed by:** [Social Data API](https://apify.com/socialdataapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.67 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Video Details Scraper — Views, Likes, Channel and Transcripts

YouTube Video Details Scraper reads public YouTube videos from their links or IDs and returns the title, description, views, likes, comment count, duration, publish date, tags, hashtags, category, caption language, highest resolution, thumbnails, channel details and the full transcript. Every response is structured JSON — ready to pass directly to an LLM, index into a vector store, or feed a content research pipeline. **No YouTube account or cookies needed.** Start with one video, then track every video your channel or your competitors publish.

![YouTube Video Details Scraper output as JSON: views, likes, comments, duration, channel and transcript](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/a-youtube-video-details-hero.webp)

***

### What data can I extract with YouTube Video Details Scraper?

Using this YouTube Video API, you will be able to extract the following YouTube video data:

| 🎬 Title | 📝 Description | 👁️ View count | 👍 Like count (if shown) |
|---|---|---|---|
| 💬 Comment count | ⏳ Duration in seconds | 📅 Publish date | 🏷️ Tags |
| #️⃣ Hashtags from the description | 🗂️ Category | 🌍 Caption language | 🖥️ Highest resolution |
| 🖼️ Thumbnails (up to 5 sizes) | 📺 Channel name and ID | 🔖 Channel handle and link | 👥 Subscriber count |
| 🧑 Channel avatar (900 px and all listed sizes) | ✔️ Channel badges | 📜 Transcript, one entry per caption line | 🔴 Live status |
| 🎞️ Upload type (normal, short or live) | 📈 Engagement rate | 🆔 Video ID | ⚠️ Reason an entry gave no video |

***

### How to use YouTube Video Details Scraper

Built for content teams, researchers and AI builders: one run turns a list of YouTube links into a table of video details with channel data and transcripts.

**Copy to your AI assistant:**

```text
`youtube-video-details-scraper` (Apify Actor ID: socialdataapi/youtube-video-details-scraper, https://apify.com/socialdataapi/youtube-video-details-scraper) is an Apify Actor that returns public YouTube video details as structured JSON: title, description, view count, like count, comment count, duration, publish date, tags, hashtags, category, caption language, highest resolution, thumbnails, channel details (ID, handle, link, subscriber count, avatar, badges) and the transcript with one entry per caption line. Use it whenever someone needs YouTube video data without cookies, a login, or a browser - pulling transcripts of a list of videos for summaries, tracking views and likes of your own uploads, or collecting channel details behind a set of videos. Call it from the Apify Store, the Apify API, or any Apify client library with your Apify token and a startUrls list. Inputs: startUrls (array of strings, required; YouTube watch, youtu.be, shorts, live or embed links, or bare 11-character video IDs; playlist and channel links are not supported), proxyConfiguration (object, default Apify residential proxy; every retry uses a new proxy session). Every video gives one row with success true, charged as the row_result event; the same video added twice is saved once. An entry that gives no video (playlist link, channel link, removed or missing video) gets a free row with success false and the reason in error. A saved video whose captions, language or resolution could not be read this time has those fields null and a short explanation in note. The comment count is the number YouTube displays, rounded on large videos (2.4M = 2400000).
```

#### YouTube Video Details Scraper MCP Server: use these Actors from ChatGPT, Claude or Cursor

Point your AI assistant at Apify and it can read YouTube on its own: video details, channel data and full transcripts for any public video link. No glue code, no scraping logic in your prompts.

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/youtube-video-details-scraper"
```

#### Step by step

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open [YouTube Video Details Scraper](https://apify.com/socialdataapi/youtube-video-details-scraper) in the Apify Store.
3. Paste the YouTube video links or IDs, one per line.
4. Click **Start** (or send your API request).
5. Download or stream your results in JSON, CSV or Excel.

#### How to scale YouTube Video Details Scraper to bulk

Used as a bulk YouTube video scraper, put any number of video links in one run: six videos are read at the same time and each row is saved as soon as its video is ready, so the table fills while the run goes. A recorded run with nine entries — five videos, a repeated link, a playlist, a channel and a missing video — saved five videos and three free error rows in 20.4 seconds. To export YouTube video data for a whole channel, collect its video links first and paste them in. To track views and likes over time, schedule the same run daily or weekly in Apify Console.

***

### ✨ Features

YouTube Video Details Scraper fetches clean, structured video details from YouTube ⚡. It's ideal for YouTube transcript collection, content research, and tracking the YouTube views and likes of your own or competing videos — a YouTube video scraper that also reads Shorts links. It extracts, per video:

- **Transcript** – one entry per caption line with its start time and duration, from the video's default captions
- **Audience numbers** – view count, like count, comment count and engagement rate
- **Video facts** – title, description, duration, publish date, category, tags and hashtags
- **YouTube channel details** – channel name, ID, handle, link, subscriber count, avatar and badges
- **Format** – highest resolution, live status and upload type (normal, short or live)
- **Thumbnails** – up to five standard sizes, only the ones that exist for the video

⚡ Entries that give no video, such as playlist or channel links, get a free row with the reason and are never charged.

***

### Use cases 💡

- **Content strategist** — compare views, likes and tags across competitor uploads every week.
- **Researcher** — collect transcripts and publish dates of a video list for analysis.
- **Social media manager** — track YouTube views and likes of your own videos and Shorts.
- **Media buyer** — check subscriber counts and badges of channels before sponsoring them.
- **AI engineer** — feed transcripts and descriptions into a RAG index for video Q\&A.

Building an AI agent? [Connect YouTube Video Details Scraper over MCP](#mcp-integration-for-ai-agents) and let it call the actor on its own.

***

### Why choose this actor?

1. **Video details and transcripts in seconds.** A recorded run returned four videos, two of them Shorts, each with its transcript, in 4.0 seconds.
2. **The numbers behind each video.** A recorded video came back with 1,826,093,015 views, 19,486,544 likes, a 61-line transcript, 3840x2160 resolution and five thumbnail sizes.
3. **26 fields from one link.** Watch, short, Shorts, live and embed links and bare video IDs all work, and every row carries the video, its channel and its transcript together.

***

### ⬇️ Input

![Input fields of the YouTube Video Details Scraper](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/a-youtube-video-details-input.webp)

Enter one or more YouTube video links or IDs in `startUrls` (required). The proxy setting is optional.

| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
| `startUrls` | Yes | array | YouTube video links or bare 11-character video IDs, one per entry. Playlist and channel links are not supported and get a free error row. The same video added twice is saved once. | `["https://www.youtube.com/watch?v=dQw4w9WgXcQ"]` |
| `proxyConfiguration` | No | object | Connection used to reach YouTube. Default: Apify residential proxy (`{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}`). Every retry uses a new proxy session; other proxy groups move to residential when YouTube blocks, and with no proxy the actor starts direct and switches to a proxy when blocked. | `{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}` |

Accepted formats:

- `https://www.youtube.com/watch?v=dQw4w9WgXcQ`
- `https://youtu.be/jNQXAC9IVRw`
- `https://www.youtube.com/shorts/aNI2jv7lBPQ`
- `https://www.youtube.com/live/VIDEO_ID` and `https://www.youtube.com/embed/VIDEO_ID`
- a bare video ID such as `8jPQjjsBbIc`

#### Free plan limits

Free plan: up to 20 videos per run (all video links together) and 200 per month; paid plans have no limit.

#### Example input

```json
{
  "startUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "https://youtu.be/jNQXAC9IVRw",
    "https://www.youtube.com/shorts/aNI2jv7lBPQ",
    "8jPQjjsBbIc"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

***

### ⬆️ Output

![Output fields of the YouTube Video Details Scraper](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/a-youtube-video-details-output.webp)

Every video is one typed, normalized JSON item with the same 26 fields on every run; values YouTube does not show are `null`, never a made-up zero. Entries that give no video come back as free rows with success set to false and the reason in the error field, in the same dataset, which you can export as JSON (default), CSV or Excel.

#### Example output

A recorded video (description shortened, 4 of 27 tags and 2 of 61 transcript lines shown) and the row for a playlist link:

```json
[
  {
    "type": "video",
    "video_id": "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. …",
    "channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw",
    "channel_name": "Rick Astley",
    "published_date": "2009-10-25",
    "duration_seconds": 213,
    "views": 1826093015,
    "likes": 19486544,
    "comment_count": 2400000,
    "tags": ["rick astley", "Never Gonna Give You Up", "nggyu", "never gonna give you up lyrics"],
    "thumbnails": {
      "default": "https://i.ytimg.com/vi/dQw4w9WgXcQ/default.jpg",
      "medium": "https://i.ytimg.com/vi/dQw4w9WgXcQ/mqdefault.jpg",
      "high": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg",
      "standard": "https://i.ytimg.com/vi/dQw4w9WgXcQ/sddefault.jpg",
      "maxres": "https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg"
    },
    "channel": {
      "id": "UCuAXFkgsw1L7xaCfnd5JJOw",
      "name": "Rick Astley",
      "handle": "RickAstleyYT",
      "url": "https://www.youtube.com/@RickAstleyYT",
      "subscriberCount": "4.55M subscribers",
      "logo": "https://yt3.ggpht.com/_ShEGOdg-t5YGJse14Ooq6FYBZqX_QSlhaTNjG06miYusm5lWm1UroLyVxnYtahADfRTVLtuVQ=s900-c-k-c0x00ffffff-no-rj",
      "logos": [
        "https://yt3.ggpht.com/_ShEGOdg-t5YGJse14Ooq6FYBZqX_QSlhaTNjG06miYusm5lWm1UroLyVxnYtahADfRTVLtuVQ=s48-c-k-c0x00ffffff-no-rj",
        "https://yt3.ggpht.com/_ShEGOdg-t5YGJse14Ooq6FYBZqX_QSlhaTNjG06miYusm5lWm1UroLyVxnYtahADfRTVLtuVQ=s88-c-k-c0x00ffffff-no-rj",
        "https://yt3.ggpht.com/_ShEGOdg-t5YGJse14Ooq6FYBZqX_QSlhaTNjG06miYusm5lWm1UroLyVxnYtahADfRTVLtuVQ=s176-c-k-c0x00ffffff-no-rj"
      ],
      "badges": ["Official Artist Channel"]
    },
    "transcript": [
      {"start": "1.360", "dur": "1.680", "text": "[♪♪♪]"},
      {"start": "18.640", "dur": "3.240", "text": "♪ We're no strangers to love ♪"}
    ],
    "category": "Music",
    "language": "en",
    "live_status": "not_live",
    "engagement_rate": 0.012,
    "hashtags": ["RickAstleyNever", "RickAstley", "NeverGonnaGiveYouUp", "WheneverYouNeedSomebody", "OfficialMusicVideo"],
    "upload_type": "normal",
    "resolution": "3840x2160",
    "success": true,
    "inputUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "note": null
  },
  {
    "type": "video",
    "video_id": null,
    "title": null,
    "description": null,
    "channel_id": null,
    "channel_name": null,
    "published_date": null,
    "duration_seconds": null,
    "views": null,
    "likes": null,
    "comment_count": null,
    "tags": [],
    "thumbnails": {},
    "channel": {},
    "transcript": null,
    "category": null,
    "language": null,
    "live_status": null,
    "engagement_rate": null,
    "hashtags": [],
    "upload_type": null,
    "resolution": null,
    "success": false,
    "inputUrl": "https://www.youtube.com/playlist?list=PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI",
    "error": "playlist_url_not_supported",
    "note": null
  }
]
```

The transcript is an empty list when a video has no captions, and `null` with a note when the captions could not be read this time. The language is the language of the video's default captions, so a song with English default captions shows `en`. The publish date is given in UTC. Rows with success set to false are not charged.

***

### How does it work?

The actor reads the same public data the YouTube website loads for any visitor, with plain web requests and no browser. For each video it reads the video details, the channel panel, the captions and the available video sizes at the same time, checks which thumbnail sizes exist, and turns the default captions into a transcript with one entry per line. Requests go through Apify residential proxies by default, and every retry uses a fresh exit address; when YouTube limits a request, the actor waits, switches address and tries again. It returns only publicly visible data — what any visitor sees without logging in — and the output fields stay the same from run to run, so your code and spreadsheets keep working when YouTube changes its pages.

***

### How do you integrate YouTube Video Details Scraper into your stack?

It works with what you already use: the REST API from any language, MCP for AI agents, and no-code tools.

#### Using YouTube Video Details Scraper with the Apify API

Call the Actor's run-sync-get-dataset-items endpoint with your Apify token and a `startUrls` list, or use the `apify-client` package for your language to start the run and read back the dataset items. Works in Python, Go, Ruby, Node.js, cURL — any language that can make an HTTP request.

#### MCP integration for AI agents

Add the Apify MCP server to your AI client with one command:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/youtube-video-details-scraper"
```

This registers YouTube Video Details Scraper as a tool your agent can call directly: the agent finds it through the server's search, adds it and runs it, then reads the videos back as JSON. Ask for "the transcripts and view counts of these five videos" and it does the rest. It works in Claude Code, Cursor and Windsurf.

#### No-code tools (n8n, Make, LangChain)

**n8n:** add the Apify node and choose "Run an Actor", or use the HTTP Request node pointed at the run-sync endpoint with your token. Send each video's transcript to a summarizer or a Google Sheet in the next node.

**Make:** use the Apify app's "Run an Actor" module, then "Get Dataset Items" to pull the videos into the rest of your scenario.

**LangChain:** install `langchain-apify` and wrap the actor with `ApifyActorsTool()` so your agent can fetch YouTube video info and transcripts on demand.

***

### Is it legal to scrape YouTube data?

Collecting public YouTube video details is generally lawful: titles, view counts, channel names and captions are shown to every visitor without an account. This actor returns only publicly available data — what any visitor sees without logging in. GDPR: scraping public data is generally permissible, but storing and using it must comply with local data-protection law. Transcripts and descriptions can be copyrighted, so check how you reuse them. Consult legal counsel if your use case involves bulk storage of personal data.

***

### Frequently asked questions

#### What fields does YouTube Video Details Scraper return?

It returns each video's title, view count, like count, comment count and full transcript, plus the description, publish date, tags, thumbnails and channel details. See [the data fields section](#what-data-can-i-extract-with-youtube-video-details-scraper) for the full list.

#### Does YouTube Video Details Scraper require a YouTube account or login?

No. Only public YouTube video data is extracted, and no credentials are needed.

#### How fast does YouTube Video Details Scraper run?

A recorded run returned four videos with transcripts, two of them Shorts, in 4.0 seconds, and a run with nine mixed entries finished in 20.4 seconds. Six videos are read at the same time, and every run reads live data, not a cache.

#### What happens if a video is private or doesn't exist?

You get one free row with success set to false and the reason in the error field, for example "YouTube says: Video unavailable", or `playlist_url_not_supported` and `channel_url_not_supported` for links that are not a single video. In code, keep rows where success is true.

#### Can I scrape multiple YouTube videos at once?

Yes. Put any number of links or IDs in the video list; six are read at the same time, each row is saved as soon as it is ready, and a video added twice is saved once.

#### Does YouTube Video Details Scraper work with Claude, ChatGPT, and other AI agent tools?

Yes — YouTube Video Details Scraper is available as an MCP tool. Register it in Claude Code, Cursor or Windsurf with `claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/youtube-video-details-scraper"`. Any agent that can call an HTTP endpoint can use the REST API directly.

#### Does YouTube Video Details Scraper return data in a format LLMs can use directly?

Yes. Each video is typed, normalized JSON with consistent field names, so there is no HTML parsing and no selectors. Pass it straight to an LLM, index it into a vector store, or feed it to an agent tool — no transformation step.

#### What happens when YouTube changes its layout or updates its anti-bot system?

The actor is maintained, and when YouTube changes, it is updated so your calls keep returning the same JSON fields with no changes on your end.

#### Can I use YouTube Video Details Scraper without managing proxies or browser infrastructure?

Yes. Residential proxies, fresh exit addresses on every retry, pauses and retries all run on the actor's side, and no browser is needed. You send one request and get structured JSON back, with no proxy accounts and no maintenance.

#### Which YouTube video fields work best for AI training data and RAG indexing?

For RAG, use the transcript, the description, the title and the tags. For training data and analytics, use the view count, like count, comment count, engagement rate, duration and publish date. All fields are plain strings, numbers, booleans and short lists, so no normalization is needed.

***

### Your feedback

Found a bug or missing a field? Let us know in the actor's Issues tab. Every report is read, and fixes ship as new versions of the actor.

# Actor input Schema

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

One or more YouTube videos. Accepts https://www.youtube.com/watch?v=ID, https://youtu.be/ID, /shorts/ID, /live/ID, /embed/ID links and bare 11-character video IDs. Each video gives one row; the same video added twice is saved once.

Playlist and channel links are not supported – they get a free error row with the reason instead of a malformed row.

Free plan: up to 20 videos per run and 200 items per month. Paid plans: unlimited.

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

Residential proxy is the default: YouTube limits datacenter addresses far more often. Every retry uses a new proxy session (a new exit address).

With Apify proxy groups other than residential, the Actor moves to residential when YouTube blocks. With no proxy selected, it starts direct and switches to datacenter, then residential, when blocked.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Every row of the run: video details with channel, thumbnails and transcript, and error rows for entries that gave no video.

# 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/watch?v=dQw4w9WgXcQ"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("socialdataapi/youtube-video-details-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 = {
    "startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("socialdataapi/youtube-video-details-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 '{
  "startUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call socialdataapi/youtube-video-details-scraper --silent --output-dataset

```

## MCP server setup

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