# YouTube Video Details Scraper: Metadata & Stats (`deepmine/youtube-video-details-scraper`) Actor

YouTube video details scraper: paste video or Shorts links or IDs, get one row per video with title, views, exact likes, comments, publish time, duration, tags, category, chapters, a captions flag, every thumbnail size and channel stats. No login, no API key.

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

## Pricing

from $0.25 / 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.
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

YouTube video details scraper: paste video or Shorts links (or bare video IDs) and get one row per video with its exact views, likes and comment count, exact publish time, duration, tags, category, spoken language, chapters, a captions flag, every thumbnail size and the channel's subscribers, total views and links. No login, no YouTube API key, no browser.

| 🎬 Video | 📺 Channel | 👥 Subscribers | 👀 Views | ❤️ Likes | 💬 Comments | 📅 Published | ⏱️ Length | 📑 Chapters | 💬 Captions |
|---|---|---|---|---|---|---|---|---|---|
| [Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)](https://www.youtube.com/watch?v=dQw4w9WgXcQ) | Rick Astley | 4,550,000 | 1,828,099,964 | 19,488,237 | 2,459,988 | 2009-10-25 06:57 UTC | 00:03:33 | – | yes |
| [iPhone 17 Pro Review: Paradox in a Box!](https://www.youtube.com/watch?v=q0aFOxT6TNw) | Marques Brownlee | 21,400,000 | 7,491,692 | 155,704 | 5,440 | 2025-09-26 21:00 UTC | 00:12:21 | 6 (description) | yes |
| [Good news: Even moving as little as 1 minute every 60 minutes can have health benefits #TEDTalks](https://www.youtube.com/shorts/N6O8b7U6Ti8) | TED | 27,900,000 | 22,825 | 445 | 5 | 2026-10-02 18:30 UTC | 00:01:15 | – | yes |
| [Pro Max User Switches to iPhone 17 Pro (One Week Later)](https://www.youtube.com/watch?v=8t9CAXc2D-c) | Jon Valiagas | 99,000 | 98,396 | 1,719 | 195 | 2026-03-18 14:00 UTC | 00:11:34 | 7 (auto) | yes |
| [Me at the zoo](https://www.youtube.com/watch?v=jNQXAC9IVRw) | jawed | 6,700,000 | 445,102,362 | 20,088,677 | 10,641,982 | 2005-04-24 03:31 UTC | 00:00:19 | 3 (description) | yes |

<sub>Collected 2026-10-18 with the prefilled input.</sub>

**$0.39 per 1,000 videos on Starter** ($0.45 Free, $0.32 Scale, $0.25 Business). The prefilled run (5 videos) costs about **$0.0020**. Nothing per run, and nothing for a video YouTube says is unavailable.

| Plan | Price per 1,000 videos |
|---|---|
| Free | $0.45 |
| Starter | $0.39 |
| Scale | $0.32 |
| Business | $0.25 |

### What you type

| Input | Example | You get |
|---|---|---|
| 🔗 Video links or IDs | `https://www.youtube.com/watch?v=dQw4w9WgXcQ`, `https://youtu.be/8t9CAXc2D-c`, `https://www.youtube.com/shorts/N6O8b7U6Ti8`, `jNQXAC9IVRw` | One row per video, in the order you listed them |

Watch, `youtu.be`, Shorts, embed and live links all work, and so do bare 11-character IDs. A video you list twice is saved and charged once. Channel, playlist and search links are skipped with a note: the [YouTube Scraper](https://apify.com/deepmine/youtube-scraper) reads those. A private, removed or mistyped video is reported in the run's status message and summary, never charged; if every video in the run is unavailable, the run fails instead of ending empty.

### What you get in every row

| Group | Fields |
|---|---|
| 🎬 Video | `title`, `type` (`video`, `shorts`, `stream`), `id`, `url`, `text` (description), `descriptionLinks`, `hashtags`, `keywords` (tags), `category`, `duration`, `durationSeconds`, `location` |
| 📈 Stats | `viewCount`, `likes` (exact), `commentsCount` (exact: 10,641,982 on "Me at the zoo", where YouTube shows 10M), `commentsTurnedOff` |
| 🗣️ Language | `originalLanguage`, `originalLanguageCode` (the language spoken in the video, e.g. English / `en`, as YouTube's player gives it), `audioTracks` (dubbed videos: each audio track's `languageCode`, `name`, `isOriginal` and `isAutoDubbed` for YouTube's automatic dubs; `null` with one audio track) |
| 📅 Dates | `date` (exact publish time, UTC), `dateText`, `uploadDate`, `liveStartedAt`, `liveEndedAt`, `streamType`, `isLiveNow` |
| 📑 Chapters | `chapters` (`title`, `startSeconds`, `endSeconds`, `start`, `thumbnailUrl`), `chaptersSource` (`description` = the creator's, `auto` = YouTube's) |
| 💬 Captions | `hasCaptions`: the video has captions or subtitles (its own or automatic); `captionTracks`: each track's language, name, whether it's automatic, and its link |
| 🎞️ Previews | `videoPreviews`: YouTube's storyboard (seek preview) images per size; `isEmbeddable`: the owner lets it play embedded on other sites |
| 🖼️ Thumbnails | `thumbnailUrl` (the largest) and `thumbnails`: every size YouTube lists, smallest first, `{url, width, height}` up to 1280x720 |
| 🚩 Flags | `isAgeRestricted`, `isFamilySafe`, `isUnlisted`, `isPrivate`, `isMembersOnly`, `isPaidContent` ("Includes paid promotion"), `isMonetized` (YouTube serves ads on it to a logged-out viewer; `null` on Shorts), `isShortsEligible`, `isLiveContent`, `allowRatings`, `isCrawlable`, `isUnpluggedCorpus`, `isTvfilmVideo`, `hasYpcMetadata`, `availableCountries` |
| 📺 Channel | `channelName`, `channelUrl`, `channelUsername`, `channelId`, `numberOfSubscribers`, `isChannelVerified`, `channelAvatarUrl`, `channelDescription`, `channelDescriptionLinks` (social links), `channelJoinedDate`, `channelLocation` (country), `channelTotalVideos`, `channelTotalViews`, `collaborators` |
| 🎵 Shorts | `soundTitle`, `musicTitle`, `musicArtist` |
| 🧾 Run | `input` (what you typed), `order` (its place in your list), `fromYTUrl`, `scrapedAt` |

The dataset has four views: Videos, Video details, Chapters & thumbnails, and Channels.

Measured on 153 rows from three runs on Apify on 2026-10-16 (the prefill, 28 mixed videos and Shorts, 120 TED and Veritasium videos):

| Field | Filled |
|---|---|
| `viewCount` | 100% |
| `likes` | 100% |
| `commentsCount` | 99% |
| `date` | 100% |
| `uploadDate` | 100% |
| `durationSeconds` | 100% |
| `keywords` | 97% |
| `category` | 100% |
| `thumbnails` | 100% |
| `chapters` | 89% |
| `hasCaptions` | 100% |
| `isFamilySafe` | 100% |
| `availableCountries` | 100% |
| `numberOfSubscribers` | 100% |
| `channelTotalViews` | 100% |
| `channelDescriptionLinks` | 98% |

`chapters` is filled where the video has chapters; `hasCaptions` is true or false on every row. `date` had the exact publish time on all 153 rows (when YouTube's player answer doesn't come in time, a row keeps the day YouTube shows).

On 2026-10-18 (the prefill and 8 mixed videos, 13 rows): `commentsCount` was exact on all 11 long videos and both Shorts (a Short's comes from its own player), `originalLanguage` was filled on 13 of 13, `isMonetized` on all 11 long videos, and `audioTracks` on the 5 dubbed ones.

### Moving from another video details Actor

Saved inputs run here unchanged: `videoIds` (thenetaji), `urls` (delicious_zebu), `videoUrls` (beyondops) and `startUrls` are all read as the video list. Field names differ a little:

| Their field | Here |
|---|---|
| `lengthSeconds`, `video_duration` | `durationSeconds`, `duration` |
| `channelTitle`, `channel_name` | `channelName` |
| `description` | `text` |
| `thumbnail` (array) | `thumbnails` |
| `likeCount`, `likes_count` | `likes` |
| `publishDate`, `publishedAt`, `published_at` | `date` (exact time; its first 10 characters are the day) |
| `hasCaption`, `has_captions` | `hasCaptions` |
| `video_tags` | `keywords` |
| `channel_country`, `social_links` | `channelLocation`, `channelDescriptionLinks` |
| `liveBroadcastDetails` | `liveStartedAt`, `liveEndedAt`, `isLiveNow` |
| `defaultVideoLanguage`, `defaultVideoLanguageCode` | `originalLanguage`, `originalLanguageCode` |
| `includesPaidPromotion` | `isPaidContent` |
| `audioTracks` | `audioTracks` |
| `storyboards`, `playableInEmbed` | `videoPreviews`, `isEmbeddable` |

| | thenetaji/youtube-video-details-scraper | This Actor |
|---|---|---|
| Price per 1,000 videos, Free / Starter / Scale / Business | $0.95 / $0.80 / $0.65 / $0.50, plus a start fee | $0.45 / $0.39 / $0.32 / $0.25, no start fee |
| Comment count | no | yes, exact (2,459,988 on Rick Astley, where YouTube shows 2.4M) |
| Spoken language | on dubbed videos only (3 of 8 videos) | every video (8 of 8) |
| Chapters | no | yes |
| Channel subscribers, total views, links, country | no | yes |

Prices are from the Apify Store on 2026-10-16. The caption files themselves: the [YouTube Transcripts](https://apify.com/deepmine/youtube-transcripts) Actor downloads them.

### Output

One row per video. A real row, shortened:

```json
{
  "title": "iPhone 17 Pro Review: Paradox in a Box!",
  "type": "video",
  "id": "q0aFOxT6TNw",
  "url": "https://www.youtube.com/watch?v=q0aFOxT6TNw",
  "thumbnailUrl": "https://i.ytimg.com/vi/q0aFOxT6TNw/maxresdefault.jpg",
  "thumbnails": [
    {
      "url": "https://i.ytimg.com/vi/q0aFOxT6TNw/hq720.jpg?sqp=-oaymwEhCK4FEIIDSFryq4qpAxMIARUAAAAAGAElAADIQj0AgKJD&rs=AOn4CLDCXGlUwUYn8iKdCNDQmgpwtviPqg",
      "width": 686,
      "height": 386
    },
    {
      "url": "https://i.ytimg.com/vi/q0aFOxT6TNw/maxresdefault.jpg",
      "width": 1280,
      "height": 720
    }
  ],
  "viewCount": 7491692,
  "likes": 155704,
  "commentsCount": 5440,
  "date": "2025-09-26T21:00:43Z",
  "uploadDate": "2025-09-26T21:00:43Z",
  "duration": "00:12:21",
  "durationSeconds": 741,
  "keywords": [
    "iPhone 17 Pro",
    "iPhone 17 Pro vs",
    "iPhone 17 Pro review",
    "MKBHD"
  ],
  "category": "Science & Technology",
  "originalLanguage": "English",
  "originalLanguageCode": "en",
  "audioTracks": [
    {
      "languageCode": "en",
      "name": "English",
      "isOriginal": true,
      "isAutoDubbed": false
    },
    {
      "languageCode": "ja",
      "name": "Japanese",
      "isOriginal": false,
      "isAutoDubbed": false
    }
  ],
  "isPaidContent": false,
  "isMonetized": true,
  "hasCaptions": true,
  "chapters": [
    {
      "title": "The Pro Paradox",
      "startSeconds": 0,
      "endSeconds": 117,
      "start": "00:00:00",
      "thumbnailUrl": "https://i.ytimg.com/vi/q0aFOxT6TNw/hqdefault_24900.jpg?sqp=-oaymwEnCNACELwBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLCWmmI1OQKbzVarCVU7rKqQQZm1SA"
    },
    {
      "title": "Pro Cameras",
      "startSeconds": 117,
      "endSeconds": 302,
      "start": "00:01:57",
      "thumbnailUrl": "https://i.ytimg.com/vi/q0aFOxT6TNw/hqdefault_117200.jpg?sqp=-oaymwEnCNACELwBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLDqx--s3iC9ps4lXayrN2GNs__IvQ"
    }
  ],
  "chaptersSource": "description",
  "isFamilySafe": true,
  "isShortsEligible": false,
  "availableCountries": [
    "AD",
    "AE",
    "AF",
    "AG",
    "AI"
  ],
  "channelName": "Marques Brownlee",
  "channelUrl": "https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ",
  "numberOfSubscribers": 21400000,
  "channelTotalViews": 5794123433,
  "channelLocation": "United States",
  "input": "https://www.youtube.com/watch?v=q0aFOxT6TNw",
  "order": 1,
  "scrapedAt": "2026-10-18T23:02:46Z"
}
```

(Arrays shortened: this video has 6 thumbnails, 6 audio tracks, 6 chapters and 249 countries.)

The run's summary (key-value store record `OUTPUT`) lists every input with its status (`ok`, or `notFound` with the reason), how many videos were unavailable, and repeats skipped.

### Did it help?

A short review helps others find it: https://apify.com/deepmine/youtube-video-details-scraper/reviews

# Actor input Schema

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

YouTube videos to read, one per line: watch links (youtube.com/watch?v=...), youtu.be links, Shorts, embed and live links, or bare 11-character video IDs. Each video is saved and charged once per run, however often it's listed. Channel, playlist and search links are skipped (the YouTube Scraper reads those). Required for API calls: videoUrls, or the same list as videoIds, urls or startUrls.

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

Apify's datacenter proxy works for every call; there's no need to change it.

## `videoIds` (type: `array`):

The same as videoUrls, for saved inputs from other video details Actors (videoIds).

## `urls` (type: `array`):

The same as videoUrls, for saved inputs from other video details Actors (urls).

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

The same as videoUrls, for saved inputs from other YouTube Actors (startUrls: links or {url} objects).

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "https://www.youtube.com/watch?v=q0aFOxT6TNw",
    "https://www.youtube.com/shorts/N6O8b7U6Ti8",
    "https://youtu.be/8t9CAXc2D-c",
    "jNQXAC9IVRw"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "videoUrls": [
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
        "https://www.youtube.com/watch?v=q0aFOxT6TNw",
        "https://www.youtube.com/shorts/N6O8b7U6Ti8",
        "https://youtu.be/8t9CAXc2D-c",
        "jNQXAC9IVRw"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepmine/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 = { "videoUrls": [
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
        "https://www.youtube.com/watch?v=q0aFOxT6TNw",
        "https://www.youtube.com/shorts/N6O8b7U6Ti8",
        "https://youtu.be/8t9CAXc2D-c",
        "jNQXAC9IVRw",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("deepmine/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 '{
  "videoUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "https://www.youtube.com/watch?v=q0aFOxT6TNw",
    "https://www.youtube.com/shorts/N6O8b7U6Ti8",
    "https://youtu.be/8t9CAXc2D-c",
    "jNQXAC9IVRw"
  ]
}' |
apify call deepmine/youtube-video-details-scraper --silent --output-dataset

```

## MCP server setup

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