# YouTube Channel Upload Watch — new videos only (`maxeee/youtube-channel-upload-watch`) Actor

YouTube channel monitor for new uploads only. Uses your YouTube Data API v3 key (playlistItems.list). No scraping, no search.list.

- **URL**: https://apify.com/maxeee/youtube-channel-upload-watch.md
- **Developed by:** [Maxe](https://apify.com/maxeee) (community)
- **Categories:** Videos, Automation
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $150.00 / 1,000 new videos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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 Channel Upload Watch — nur neue Videos

A **youtube channel monitor** that watches your `channelIds` and outputs **only new uploads** via YouTube Data API v3 (`channels.list` contentDetails.relatedPlaylists.uploads, then `playlistItems.list`). Not a full dump, not `search.list`, and it does not run without your own API key.

Category: Videos · Tags: youtube, channel, upload, monitor, data-api

Opportunity: **OPP-08**. generatedBy: Grok Bot BUILDER, version 0.1

### Agentur: 15 Kanäle, nur neue Uploads

Paste up to 15 UC channel IDs. Each poll reads the uploads playlist (latest 50 items, not a catalog dump). Only videos that were not seen in a previous run are written to the dataset. First sight of a channel seeds a baseline in KV (no `new_video` charge) so you do not get a historical dump.

### Brand-Monitor: Diff seit letztem Run

Seen video IDs persist in the default key-value store under `SEEN_VIDEO_IDS`. Schedule the Actor: each run diffs against the last poll and emits only new uploads as `{ channelId, videoId, title, url, publishedAt, views? }`. Empty poll = `start` only (no `new_video` events).

### Agent-Poll mit eigenem Key

Call from an agent on a schedule with your own `youtubeApiKey`. Set `dryRun` true to skip `Actor.charge` while still calling Data API v3. Without a key the Actor fails (see below). Concurrency is low (sequential channel polls).

### API key in 2 minutes

This Actor **cannot run without your own key**.

1. Open Google Cloud
2. Enable **YouTube Data API v3**
3. Credentials -> **API key**
4. Paste the key as `youtubeApiKey`

If `youtubeApiKey` is missing or rejected, the Actor fails with that instruction. AUTH\_NEEDED: a live YouTube poll is impossible in this environment without a real user key. Unit tests cover parsers, dedup, and billing only.

### Input

Required:

- `channelIds`: string array of UC… IDs (or `youtube.com/channel/UC…` URLs). Max 15. Handles / `search.list` are not supported.
- `youtubeApiKey`: your YouTube Data API v3 key

Optional: `maxNewVideos` (default 50), `costCapUsd` (default 1.0), `dryRun`, `seenStoreKey`.

### Output (dataset)

Only **new** videos (never a full dump):

- `channelId`, `videoId`, `title`, `url`, `publishedAt`, optional `views`

Run summary is stored as key-value `OUTPUT`. Dedup state: `SEEN_VIDEO_IDS`.

### Pricing (PPE)

- Event `start`: **$0.00005** once per completed poll (including empty)
- Event `new_video`: **$0.01** per newly seen upload pushed
- Empty poll = start only. Do not charge `new_video` on empty or on baseline seed.
- `dryRun` true skips `Actor.charge`
- `costCapUsd` default 1.0 (hard max 5.0)

### Limitations

- Own YouTube Data API v3 key required (AUTH\_NEEDED without it)
- Latest 50 uploads per channel per poll — not a full dump
- No `search.list`, no handle lookup, no keyless run
- Private/deleted playlist items are skipped
- `views` is best-effort via `videos.list` statistics
- Respect YouTube API Terms and quota (key owner pays Google quota)

generatedBy: Grok Bot BUILDER, version 0.1

# Actor input Schema

## `channelIds` (type: `array`):

Required. UC channel IDs or youtube.com/channel/UC URLs. Max 15. Not handles — this Actor does not use search.list. Recent uploads playlist only (not a full dump).

## `youtubeApiKey` (type: `string`):

Required. Your own Google Cloud API key. In 2 minutes: Google Cloud -> enable YouTube Data API v3 -> Credentials -> API key. Without this key the Actor fails with that instruction.

## `maxNewVideos` (type: `integer`):

Cap on new\_video rows this run (also limited by costCapUsd). Default 50. Not a full channel dump.

## `costCapUsd` (type: `number`):

Stop charging before exceeding. start = 0.00005 USD per run; new\_video = 0.01 USD each. Empty poll = start only.

## `seenStoreKey` (type: `string`):

KV key for previously seen video IDs (diff since last run).

## `dryRun` (type: `boolean`):

When true, skips Actor.charge — still calls YouTube Data API v3 (key required) and writes dataset/KV.

## Actor input object example

```json
{
  "channelIds": [
    "UC_x5XG1OV2P6uZZ5FSM9Ttw"
  ],
  "maxNewVideos": 50,
  "costCapUsd": 1,
  "seenStoreKey": "SEEN_VIDEO_IDS",
  "dryRun": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Only newly seen uploads: channelId, videoId, title, url, publishedAt, optional views. Not a full dump.

## `runSummary` (type: `string`):

No description

## `seenVideoIds` (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 = {
    "channelIds": [
        "UC_x5XG1OV2P6uZZ5FSM9Ttw"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maxeee/youtube-channel-upload-watch").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 = { "channelIds": ["UC_x5XG1OV2P6uZZ5FSM9Ttw"] }

# Run the Actor and wait for it to finish
run = client.actor("maxeee/youtube-channel-upload-watch").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 '{
  "channelIds": [
    "UC_x5XG1OV2P6uZZ5FSM9Ttw"
  ]
}' |
apify call maxeee/youtube-channel-upload-watch --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maxeee/youtube-channel-upload-watch"
        }
    }
}

```

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/Zv7Fv5lMliLie3utt/builds/R5riTEOmVB6bgcEll/openapi.json
