YouTube Video Details | Views, Dates & Captions
Pricing
$1.00 / 1,000 videos
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
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
- Open Input, switch to JSON and paste the example below. Replace the example videoUrls with your own research targets when ready.
- Check the live Pricing tab and set a run spending limit.
- Run the Actor, then open the Workflow output view. Inspect
videoId,title,channelName,viewCount,publishDate,durationSeconds,error. - 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:
| Field | Meaning |
|---|---|
videoId, url, input | The resolved video, its canonical URL and the exact string you supplied |
title, description | Title and full description text |
channelName, channelId, channelUrl | The uploading channel |
durationSeconds | Length in seconds |
viewCount, likeCount | Public counts at the time of the run |
publishDate, uploadDate | ISO timestamps as YouTube reports them |
category | YouTube's category, e.g. Music, Education |
keywords | The uploader's tags |
thumbnailUrl, thumbnails | The largest thumbnail, and every size with dimensions |
isLiveContent, isPrivate, isUnlisted, isFamilySafe | Flags |
availableCountriesCount | How many countries the video is available in |
captionsAvailable, captionLanguages, autoCaptionsAvailable | Whether captions exist, in which languages, and whether any are auto-generated |
playability | YouTube's own status, OK for normal videos |
error | null 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
- Paste your video links or IDs into YouTube videos, one per line, or pass them through the API as
videoUrls. - Click Start. The defaults are tuned for most jobs.
- 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
nullwhile 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
- YouTube Transcript Scraper | Text, SRT & VTT: turn captioned video links into searchable text. This is a separate Actor with its own input and price.