YouTube Video Details | Views, Dates & Captions avatar

YouTube Video Details | Views, Dates & Captions

Pricing

$1.00 / 1,000 videos

Go to Apify Store
YouTube Video Details | Views, Dates & Captions

YouTube Video Details | Views, Dates & Captions

Extract metadata for supplied YouTube video links: title, channel, views, publish date, duration and caption availability. Export JSON or CSV for video research. Does not discover channel videos or retrieve transcripts.

Pricing

$1.00 / 1,000 videos

Rating

0.0

(0)

Developer

Nick McNemar

Nick McNemar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Build a video research spreadsheet

YouTube Video Details: Extract metadata for supplied YouTube video links: title, channel, views, publish date, duration and caption availability. Export JSON or CSV for video research. Does not discover channel videos or retrieve transcripts.

Start with a small example

  1. Open Input, switch to JSON and paste the example below. Replace the example videoUrls with your own research targets when ready.
  2. Check the live Pricing tab and set a run spending limit.
  3. Run the Actor, then open the Workflow output view. Inspect videoId, title, channelName, viewCount, publishDate, durationSeconds, error.
  4. Export JSON for nested data or CSV for a spreadsheet. Review a small sample before increasing the scope.
{
"videoUrls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://youtu.be/jNQXAC9IVRw",
"9bZkp7q19f0"
],
"maxItems": 3
}

At the rate checked September 9, 2026, 3 saved rows cost $0.003 in Actor event fees ($1.00 per 1,000 rows). Actual returned rows determine the event fee. Taxes and other account services may be separate.

What can I use it for?

  • Content research and competitor analysis. Pull views, likes, publish dates and durations for a competitor's catalogue and see what performs.
  • Enriching video lists. Turn a spreadsheet of links into a dataset with titles, channels, dates and engagement numbers.
  • Monitoring. Re-run on a schedule to track view and like counts over time for the videos you care about.
  • AI and RAG pipelines. Combine with the YouTube Transcript Scraper: this actor tells you which videos have captions and in which languages before you spend on transcripts.
  • Curation and cataloguing. Category, keywords, duration and thumbnails for building playlists, feeds or directories.
  • Link validation. Dead, private and age-restricted videos come back flagged, so your links stay clean.

What data does it return?

One record per video:

FieldMeaning
videoId, url, inputThe resolved video, its canonical URL and the exact string you supplied
title, descriptionTitle and full description text
channelName, channelId, channelUrlThe uploading channel
durationSecondsLength in seconds
viewCount, likeCountPublic counts at the time of the run
publishDate, uploadDateISO timestamps as YouTube reports them
categoryYouTube's category, e.g. Music, Education
keywordsThe uploader's tags
thumbnailUrl, thumbnailsThe largest thumbnail, and every size with dimensions
isLiveContent, isPrivate, isUnlisted, isFamilySafeFlags
availableCountriesCountHow many countries the video is available in
captionsAvailable, captionLanguages, autoCaptionsAvailableWhether captions exist, in which languages, and whether any are auto-generated
playabilityYouTube's own status, OK for normal videos
errornull on success, otherwise a plain-language reason

Invalid links, deleted videos and private videos still produce a record with an error, so your input and output always line up one to one. Age-restricted videos return their metadata with playability set accordingly.

Illustrative output

Values explain the output shape; they are not a live result or guaranteed field coverage.

{
"videoId": "jNQXAC9IVRw",
"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
"title": "Me at the zoo",
"description": "The first video on YouTube. ...",
"channelName": "jawed",
"channelId": "UC4QobU6STFB0P71PMvOGN5A",
"durationSeconds": 19,
"viewCount": 417706870,
"likeCount": 18123456,
"publishDate": "2005-04-23T20:31:52-07:00",
"category": "People & Blogs",
"keywords": ["me at the zoo", "jawed karim", "first youtube video"],
"thumbnailUrl": "https://i.ytimg.com/vi/jNQXAC9IVRw/maxresdefault.jpg",
"isLiveContent": false,
"captionsAvailable": true,
"captionLanguages": ["en", "de"],
"autoCaptionsAvailable": false,
"playability": "OK",
"error": null
}

How to use it

  1. Paste your video links or IDs into YouTube videos, one per line, or pass them through the API as videoUrls.
  2. Click Start. The defaults are tuned for most jobs.
  3. Download results from the Output tab as JSON, CSV, Excel or XML, or read them from the dataset via the API.

Input example

{
"videoUrls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://youtu.be/jNQXAC9IVRw",
"9bZkp7q19f0"
],
"maxItems": 100
}

How it works

The actor asks YouTube's own player service for each video's details, the same service the mobile apps use, and makes a second lightweight request for the fields only the web player exposes — publish date, like count, category and the unlisted flag. Numbers are returned as integers, dates as ISO strings, and text is decoded so titles read the way they do on YouTube.

If YouTube refuses a direct request, the actor automatically retries that video through a residential proxy, and keeps using it for the rest of the run once it has been needed. You do not need to configure anything for this.

Pricing

You pay per video processed. There are no subscriptions or minimums, and you can cap the maximum spend of any run before it starts. Videos that turn out to be deleted or private still count as processed, because the actor has to ask YouTube to find that out.

Scope and responsible use

This actor reads only the public metadata YouTube serves for a video. It does not log in, does not use cookies or credentials, does not download video or audio, and does not attempt to bypass age gates, membership restrictions or privacy settings. You are responsible for using the results in line with the rights of the people who made the content and the laws that apply to you.

Limitations

  • Like counts and publish dates come from the web player's metadata block; on the rare video where YouTube omits it, those fields are null while the rest of the record is intact.
  • Comment counts, subscriber counts and per-video revenue are not part of what YouTube exposes here and are not returned.
  • Playlists and channel URLs are not expanded; supply the individual video links.
  • Live streams in progress report the metadata available at that moment.

Something wrong?

Open an issue on this actor's Issues tab with the video link and what you expected. YouTube changes its internals from time to time and source changes can affect coverage; include a small reproducible example for investigation.

Interpret empty results and errors

Check the run status and log if no records are returned. Restrictive filters, inaccessible content or a changed source page can produce an empty result; empty output does not prove there are no matching records on the source.

Every saved row, including an error row, incurs the configured per-row event fee. Proxy selection and run duration can affect operating costs. Do not increase concurrency or enable a more expensive proxy merely to work around an unclear result.

For a reproducible problem, open this Actor’s Issues tab with a small public input, expected behavior and relevant error text. Remove tokens and confidential information. No response-time or uptime guarantee is offered.

Use the result in an automation

In Make or n8n, use the Apify integration to run this Actor with the same JSON input, wait for completion, then retrieve its default dataset. Route failed runs and error rows to a review step before sending valid results to your spreadsheet or CRM. Scheduling does not make these Actors emit only new records: deduplicate downstream using the source URL or record ID.

For Node.js, install the official apify-client package and set your own APIFY_TOKEN environment variable. The following example starts a paid run with a small spending limit.

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
"videoUrls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://youtu.be/jNQXAC9IVRw",
"9bZkp7q19f0"
],
"maxItems": 3
};
const run = await client.actor('keystonelabs/youtube-video-details-scraper').call(input, {
memory: 512, timeout: 180, maxTotalChargeUsd: 0.10
});
if (run.status !== 'SUCCEEDED') throw new Error('Run did not succeed: ' + run.id);
const { items } = await client.dataset(run.defaultDatasetId).listItems({ limit: 100 });
console.log(items);

The first 100 rows are retrieved in this example. Use the dataset API pagination for a larger result. Keep credentials out of shared inputs and source files.

A useful next step