# YouTube Title & Thumbnail Change Monitor (`peterdrucker481/youtube-packaging-change-monitor`) Actor

Monitor competitor YouTube titles and thumbnails with no API key required. Preserve overwritten variants, detect likely packaging tests, and rank public view-velocity signals. An optional YouTube Data API key unlocks deeper metadata and larger scans.

- **URL**: https://apify.com/peterdrucker481/youtube-packaging-change-monitor.md
- **Developed by:** [Peter Drucker](https://apify.com/peterdrucker481) (community)
- **Categories:**
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 video observations

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 Title & Thumbnail Change Intelligence

Track the packaging decisions competitor channels make after publishing—with no API key required. Paste normal channel URLs or `@handles`; the Actor preserves overwritten title and thumbnail variants, identifies repeated rotations, and ranks public performance signals for creators, agencies, and media teams.

### What buyers receive

- `NEW_VIDEO`
- `TITLE_CHANGED`
- `THUMBNAIL_CHANGED`
- `TITLE_AND_THUMBNAIL_CHANGED`
- `PACKAGING_IMPACT_UPDATED`

Every packaging event includes the old/new creative evidence, observed change-time window, variant number, rotation count, time on the previous variant, time since publication, available public engagement data, view velocity before and after, and a deterministic `signalScore` with `HIGH`, `MEDIUM`, or `LOW` priority.

Repeated or reused variants are flagged. Two or more early rotations can be labeled `isLikelyPackagingTest`, while every record remains explicitly `observationalNotCausal: true`.

### Conversion-first setup

Users can paste any of these forms:

- `https://www.youtube.com/@GoogleDevelopers`
- `@GoogleDevelopers`
- `UC_x5XG1OV2P6uZZ5FSM9Ttw`

That is enough to start. Keyless mode uses YouTube's public channel feed plus content-hashed public thumbnails to monitor up to 15 recent videos per channel. It includes current titles, publication dates, public views and likes, and supports normal channel IDs and `@handles`.

The encrypted `youtubeApiKey` field is optional. Customers who already have a key restricted to **YouTube Data API v3** can supply it to use the official API path, inspect up to 50 recent videos per channel, and receive additional metadata where YouTube exposes it. The Actor never needs YouTube account access, OAuth, or private analytics.

### Why it is different from another YouTube scraper

A snapshot tool returns the current title, thumbnail, and view count. This Actor preserves information YouTube overwrites, reconstructs the variant sequence, associates each observed switch with a public response window, and emits an exception-only intelligence feed suitable for Sheets, BI, n8n/Make, Slack, webhooks, or AI agents.

### Spend and noise controls

- `recentVideosPerChannel` limits tracked uploads.
- `publishedWithinDays` focuses on videos still likely to be actively packaged.
- `minimumViews` skips immaterial videos.
- `minimumSignalScore` suppresses weak events.
- `changeWindowDays` and `impactSamplesPerChange` control the multi-point post-change response curve.

The first channel baseline is quiet and free. Set `emitBaseline` only when raw baseline rows are useful.

### Recommended schedules

- Daily: broad competitor watchlists.
- Every 4–6 hours: active launches and agency research.
- Hourly: short, time-bounded monitoring of priority videos.

Keep the same `monitorKey` across runs. Changing it deliberately creates a new baseline.

### Transparent usage-based pricing

There is no subscription or setup fee. The first baseline for each channel is free.

- Routine monitoring costs **$0.001 per previously baselined video observation**.
- New uploads, title or thumbnail changes, and follow-up impact records cost **$0.02 each**.

At five recent videos and one daily run, monitoring 100 channels costs about $15/month before occasional change alerts. Use the video-age, minimum-view, and signal-score controls to focus the watchlist and manage spend.

### Output and storage

Each run writes ranked signal rows plus one `RUN_SUMMARY` with the top ten signals. Content-addressed thumbnail files, channel manifests, variant history, and video observations live in a named key-value store derived from `monitorKey`.

### Local development

```bash
npm install
npm test
npm start
```

The default mode uses public YouTube channel feeds and public thumbnail URLs. An optional supplied key is used only for official read-only YouTube Data API requests. The Actor does not read private analytics, comment content, transcripts, or YouTube account credentials.

# Actor input Schema

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

Leave blank for keyless public-feed monitoring. Add a key restricted to YouTube Data API v3 for up to 50 recent videos per channel and richer metadata. Apify masks this secret input.

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

Paste ordinary channel URLs, @handles, or canonical IDs. Up to 100 channels per run.

## `recentVideosPerChannel` (type: `integer`):

Number of recent uploads inspected. Keyless mode supports up to 15; an optional official API key supports up to 50.

## `monitorKey` (type: `string`):

Stable key for this watchlist. Keep it unchanged on scheduled runs.

## `changeWindowDays` (type: `integer`):

Maximum age of a detected change for one follow-up velocity observation.

## `impactSamplesPerChange` (type: `integer`):

Number of unchanged follow-up observations used to form a machine-readable response curve.

## `publishedWithinDays` (type: `integer`):

Ignore older videos to focus spend on active packaging decisions.

## `minimumViews` (type: `integer`):

Ignore videos below this public view count.

## `minimumSignalScore` (type: `integer`):

Only deliver packaging events at or above this deterministic 0–100 score.

## `emitBaseline` (type: `boolean`):

When enabled, first-seen videos are written as BASELINE\_VIDEO records. The baseline is always stored.

## `webhookUrl` (type: `string`):

Optional HTTPS endpoint receiving the change records and run summary.

## `requestTimeoutSecs` (type: `integer`):

Maximum seconds to wait for each public metadata, official API, or thumbnail request.

## Actor input object example

```json
{
  "recentVideosPerChannel": 5,
  "monitorKey": "default",
  "changeWindowDays": 7,
  "impactSamplesPerChange": 3,
  "publishedWithinDays": 30,
  "minimumViews": 0,
  "minimumSignalScore": 0,
  "emitBaseline": false,
  "requestTimeoutSecs": 25
}
```

# Actor output Schema

## `results` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("peterdrucker481/youtube-packaging-change-monitor").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("peterdrucker481/youtube-packaging-change-monitor").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 '{}' |
apify call peterdrucker481/youtube-packaging-change-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,peterdrucker481/youtube-packaging-change-monitor"
        }
    }
}

```

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/7BvSmVj1ckyyY8G9a/builds/ySVCXgGhLbBQ15MtE/openapi.json
