# YouTube Latest Videos: No API Key, With View Counts (`glitchbound/youtube-latest-videos-scraper`) Actor

The latest videos from any YouTube channel or playlist, with live view counts, ratings and descriptions. No Google API key, no quota, no browser. Paste a handle, URL, channel id or playlist. Returns the 15 most recent videos per channel.

- **URL**: https://apify.com/glitchbound/youtube-latest-videos-scraper.md
- **Developed by:** [Daniel Meshulam](https://apify.com/glitchbound) (community)
- **Categories:** Videos, Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 85.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## YouTube Latest Videos: No API Key, With View Counts

Recent videos from any YouTube channel or playlist, with **live view counts**,
star ratings and full descriptions.

No Google Cloud project. No Data API key. No quota. No browser. No cookies.

### Why that matters

Every other way to read YouTube programmatically costs you something:

- **The YouTube Data API** needs a Google Cloud project and gives you 10,000
  quota units a day. A single channel listing costs ~100. It does not survive
  real use, and when it runs out your pipeline stops until midnight Pacific.
- **A headless browser** is slow, expensive per run, and breaks every time
  YouTube reshuffles its markup.

This reads the Atom feed YouTube has published per channel and per playlist for
over a decade. It is public, it is stable, and it carries the view count.

### What you paste

Any of these. Whatever is in your address bar will work:

```
@mkbhd
mkbhd
https://www.youtube.com/@veritasium
https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ
https://www.youtube.com/c/mkbhd
https://www.youtube.com/user/marquesbrownlee
UCBJycsmduvYEL83R_U4JriQ
https://www.youtube.com/playlist?list=PLbpi6ZahtOH6Blw3RGYpWkSByi_T7Rygb
```

### What you get back

One row per video:

| field | notes |
|---|---|
| `title` | as published |
| `url` | the watch link |
| `videoId` | YouTube's own id |
| `publishedAt` | ISO 8601 UTC |
| `viewCount` | **live**, at the moment of the run |
| `likeRating` | average out of 5 |
| `ratingCount` | how many ratings that average is over |
| `description` | full text |
| `thumbnailUrl` | full-size image |
| `channelName`, `channelId`, `channelUrl` | who published it |
| `requestedTarget`, `sourceType` | what you asked for, so a row traces back |

### The limit, before you pay for it

**A YouTube feed holds the 15 most recent videos per channel.** There is no
paging parameter and there is no sixteenth video.

This reads a channel's **recent output**. It cannot read a back catalogue, and
no Actor reading this source can, whatever it says. If you need a full history,
you need the Data API and its quota.

That is the whole trade: 15 recent videos, instantly, free of quota, versus a
full catalogue behind a key that runs out.

### Filters

Filtered videos are never returned and never charged.

- **`titleKeywords`** / **`titleExclude`** — plain text, case-insensitive
- **`minViews`** — a video whose view count YouTube has not published yet is
  **excluded** when this is set, because no count is not the same as zero
- **`publishedAfter`** — an ISO date
- **`maxVideosPerChannel`** — 15 is the ceiling, lower it to keep a trial cheap
- **`maxResults`** — hard ceiling across the whole run, 1,000 by default

### Good for

- Watching competitors' channels for new uploads and how they perform
- Tracking a topic across a set of creators
- Feeding a newsletter, dashboard or alerting pipeline
- Measuring which of your own videos are still gaining views

### Pricing

Pay per video returned. Nothing else: not the run, not filtered videos, not a
channel that turns out to be empty.

# Actor input Schema

## `channels` (type: `array`):

One per line. Any of these works: a handle (@mkbhd), a channel URL, a channel id (UCBJycsmduvYEL83R\_U4JriQ), a /user/ or /c/ URL, or a playlist URL or id.

## `maxVideosPerChannel` (type: `integer`):

YouTube's public feed holds the 15 most recent videos per channel and has no paging, so 15 is the ceiling and asking for more cannot be honoured. Lower it to keep a trial run cheap.

## `titleKeywords` (type: `array`):

Keep only videos whose title contains any of these, case-insensitive. Filtered videos are never charged.

## `titleExclude` (type: `array`):

Drop videos whose title contains any of these, e.g. shorts or trailer.

## `minViews` (type: `integer`):

Only videos with at least this many views. Videos where YouTube has not published a view count yet are excluded when this is set, because no count is not the same as zero.

## `publishedAfter` (type: `string`):

An ISO date, e.g. 2026-07-01. Videos with no publish date are excluded when this is set.

## `maxResults` (type: `integer`):

A hard ceiling on rows returned and charged across the whole run. Defaults to 1,000 if left out. Set 0 for a dry run that returns and charges nothing.

## Actor input object example

```json
{
  "channels": [
    "@MKBHD",
    "@veritasium"
  ],
  "maxVideosPerChannel": 15,
  "maxResults": 200
}
```

# Actor output Schema

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

All rows this run produced, as JSON.

# 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 = {
    "channels": [
        "@MKBHD",
        "@veritasium"
    ],
    "maxVideosPerChannel": 15,
    "maxResults": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("glitchbound/youtube-latest-videos-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 = {
    "channels": [
        "@MKBHD",
        "@veritasium",
    ],
    "maxVideosPerChannel": 15,
    "maxResults": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("glitchbound/youtube-latest-videos-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 '{
  "channels": [
    "@MKBHD",
    "@veritasium"
  ],
  "maxVideosPerChannel": 15,
  "maxResults": 200
}' |
apify call glitchbound/youtube-latest-videos-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,glitchbound/youtube-latest-videos-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/NcIz0EMtxmuDn0H9K/builds/wX26eaxQoCOVQZE0p/openapi.json
