How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
https://www.youtube.com/watch?v=dQw4w9WgXcQin Video URLs or IDs. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
YouTube Video Stats & Metadata gets views, likes, comments, duration, tags, category and language for a list of YouTube videos. You paste video links or IDs and add your own free YouTube Data API v3 key. You get one clean table row per video, with numbers as numbers.
- Accepts
watch?v=,youtu.be/,shorts/,embed/,live/andm.youtube.comlinks, or plain 11-character video IDs. Extra parts of a link like&t=30sare ignored. - Duplicates are looked up once.
- A video that is deleted, private or never existed gets a
not_foundrow with your original line, not an error. - A line that is not a YouTube video gets an
invalid_inputrow with your original line. nullmeans "no value from YouTube" (for example, hidden likes). It is never written as0.
Good for
- You have a list of video links and need their numbers in a table.
- You want an official, stable data source with a clear quota.
- You already have a Google Cloud project, or you can make one in a few minutes.
Not a good fit
- You have no API key and do not want one. This Actor does not work without a key.
- You need search results, comments, transcripts or a whole channel. See Related Actors.
- You need view history over time from the past. YouTube only gives the current numbers.
Who uses it
Marketers
Track the numbers of videos you run ads or sponsor deals on.
Creators
Check stats of your own videos in one table.
Researchers
Add tags and categories to a list of video links.
Price
Prices will be shown after release.
Questions
Do I need a YouTube API key?
Yes. It does not work without a key. You make one for free in a Google project.
How many videos per run?
Up to 5,000 lines per run.
What if a video is private or deleted?
You get a not_found row with your original line, not an error.
Does it work for Shorts and live streams?
Yes. For a stream that is live now, the duration is empty.
Do I need a YouTube or Google account?
You need a Google account to make the free API key. The Actor does not log in to YouTube and does not use cookies.
Does it cost Google money?
No. The YouTube Data API is free within the daily quota. You pay only the Apify price above.
Do the data groups change the price?
No. One video row is one video event, and one request is 1 quota unit, whatever parts you pick.
Is personal data included?
Only public video and channel data that YouTube shows on the video page: channel ID and name. No viewer data.
Details
Step by step on Apify
- Get a key (see above).
- Paste video links into Video URLs or IDs, one per line. The form already has 2 example videos.
- Paste your key into YouTube Data API key.
- Click Start. Two videos take a few seconds.
- Open the Videos view of the dataset, or download it as CSV, Excel or JSON.
Use cases
| Task | Input | Key fields | Next step |
|---|---|---|---|
| Report on campaign videos | your campaign video links | views, likes, comments, fetchedAt | Put into a weekly sheet or dashboard |
| Check influencer videos before a deal | creator's video links | views, likes, comments, publishedAt | Compare engagement per video |
| Clean a video list | a list from a sheet or CRM | status, title, durationSec, channelTitle | Remove not_found videos, fix titles |
| Tag and category research | competitor video links | tags, category, defaultLanguage | Find common tags and languages |
| Enrich data for a model or BI | many video IDs | all fields | Join on videoId |
Tips for better results
- Mixed link types are fine: watch, youtu.be, Shorts or embed.
- Duplicate links are looked up once.
- Run on a schedule to see how views grow.
Limits and good to know
Data comes from the YouTube Data API v3 under your own key and Google project. Please follow the YouTube API Services Terms of Service. This Actor is not affiliated with or endorsed by YouTube or Google.
- Up to 5,000 lines per run. We tested 5,000 videos in one run: COMPLETE in about 71 seconds, 100 quota units
- The Actor stops reading at about 270 seconds so it can save the results inside the 300-second default timeout (
PARTIAL, reasonDEADLINE). Saved rows are kept - If your daily quota runs out during a run, the Actor keeps the rows it saved, ends as
PARTIALwith reasonQUOTA_LIMIT, and the run SUCCEEDED. Run the rest after the quota resets - If Google fails again and again for a batch, the run keeps saved rows and ends with reason
SOURCE_ERROR - Numbers are live at
fetchedAtand change all the time. Since August 24, 2026, YouTube counts a view as soon as a video starts to play (Google note), soviewscan be higher than numbers you saved before that date - Category names come from the US category list
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"status": "complete",
"videoId": "jNQXAC9IVRw",
"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
"input": "https://youtu.be/jNQXAC9IVRw",
"title": "Me at the zoo",
"description": "…",
"channelId": "UC4QobU6STFB0P71PMvOGN5A",
"channelTitle": "jawed",
"publishedAt": "2005-04-24T03:31:52Z",
"durationSec": 19,
"duration": "PT19S",
"views": 445744244,
"likes": 20099017,
"comments": 10642898,
"tags": ["me at the zoo", "jawed karim", "first youtube video"],
"categoryId": "1",
"category": "Film & Animation",
"defaultLanguage": "en",
"defaultAudioLanguage": "en",
"liveBroadcastContent": "none",
"definition": "hd",
"caption": true,
"licensedContent": true,
"thumbnailUrl": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg",
"parts": ["snippet", "statistics", "contentDetails"],
"source": "youtube-data-api-v3",
"sourceUrl": "https://www.googleapis.com/youtube/v3/videos?part=snippet%2Cstatistics%2CcontentDetails&id=dQw4w9WgXcQ%2CjNQXAC9IVRw",
"fetchedAt": "2026-10-22T04:43:42.039Z",
"error": null,
"errorCode": null
}Data fields (30)
| Field | Type | Meaning |
|---|---|---|
status | string | complete, not_found, invalid_input, error, api_key_required, api_key_invalid or quota_exceeded. |
videoId | string | YouTube video ID. |
url | string | Watch URL. |
input | string | Your line from videoUrls. |
title | string | Video title (snippet). |
description | string | Video description (snippet). |
channelId | string | Channel ID (snippet). |
channelTitle | string | Channel name (snippet). |
publishedAt | string | Publish time, ISO 8601 (snippet). |
durationSec | integer | Duration in seconds; null for live or upcoming streams (contentDetails). |
duration | string | Duration as returned by the API, ISO 8601 (contentDetails). |
views | integer | View count; null when not returned (statistics). |
likes | integer | Like count; null when the owner hides likes (statistics). |
comments | integer | Comment count; null when comments are disabled (statistics). |
tags | array | Video tags; empty list when none (snippet). |
categoryId | string | Category ID (snippet). |
category | string | Category name in English. |
defaultLanguage | string | Language of title and description (snippet). |
defaultAudioLanguage | string | Spoken language (snippet). |
liveBroadcastContent | string | none, live or upcoming (snippet). |
definition | string | hd or sd (contentDetails). |
caption | boolean | True when the video has captions (contentDetails). |
licensedContent | boolean | True when the video is licensed content (contentDetails). |
thumbnailUrl | string | Largest thumbnail URL (snippet). |
parts | array | Data groups requested. |
source | string | youtube-data-api-v3. |
sourceUrl | string | API request URL for this batch (without your key). |
fetchedAt | string | When the row was fetched, ISO 8601. |
error | string | Why the row is not complete. |
errorCode | string | Machine-readable error code. |
Input settings (3)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Video URLs or IDs required | videoUrls | array | ["https://www.youtube.com/watch?v=dQw4w9WgXcQ", "https://youtu.be/jNQXAC9IVRw"] |
| YouTube Data API key | apiKey | string | |
| Data groups | parts | array | ["snippet", "statistics", "contentDetails"] |