# YouTube Search Scraper & New-Video Monitor — No API Key (`slothtechlabs/youtube-search-harvester`) Actor

Search YouTube by keyword and bulk-export clean video rows — title, channel, views, duration, publish date & links — or monitor a niche for ONLY new uploads since the last run. 49 regions, no API key, no quota wall. Pay-per-use, first run free. A vidIQ/TubeBuddy alternative.

- **URL**: https://apify.com/slothtechlabs/youtube-search-harvester.md
- **Developed by:** [SlothTechLabs](https://apify.com/slothtechlabs) (community)
- **Categories:** Social media, SEO tools, Videos
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 video delivereds

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Search Scraper & New-Video Monitor — No API Key

> **YouTube research without the API quota wall or a $20/month tool.** Search any keyword and bulk-export clean video rows, or schedule it and get **only the videos newly uploaded in your niche since your last run**. **No API key, no quota, no browser.** Your first run per query is a **free baseline**.

Search **YouTube** by keyword and export every result as a flat, spreadsheet-ready row — title, channel, views, duration, publish time, thumbnail, watch link and more — across **49 region/language editions**. In **monitor mode**, every scheduled run returns **only the new uploads since the last run**, so the same video is never delivered (or billed) twice. The official YouTube Data API caps you at ~100 searches/day before it blocks you; vidIQ and TubeBuddy charge $10–80/month. This Actor needs no API key — no quota, no subscription.

### ✨ What does this Actor do?

| Feature                                 | Details                                                                                                                            |
| --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| 🔎 **Keyword search → structured rows** | Every result as a flat row: title, channel (+ URL & ID), views, duration, publish time, thumbnail, watch link, description snippet |
| 🔔 **Monitor mode**                     | Only videos **new since the last run** — built for schedules and "new in my niche" alerts. First run per query is a free baseline  |
| 📦 **Bulk mode**                        | One-off export of the current search results, up to 600 videos per query                                                           |
| 🗂️ **Watchlist of queries**             | Track many search terms in a single run — YouTube search operators supported                                                       |
| 🌍 **49 regions & languages**           | 🇺🇸🇬🇧🇯🇵🇩🇪🇧🇷🇲🇽🇰🇷🇮🇩 and 41 more — see the full list below                                                                             |
| 🔀 **4 sort orders**                    | Relevance · Upload date (newest) · View count · Rating                                                                             |
| 🛡️ **No false alerts**                  | Monitor mode flags only genuinely new uploads, so you never get pinged about a video you've already seen                           |
| 🔑 **No API key, no login, no browser** | No quota to manage and no accounts to connect — just clean, structured results                                                     |

#### ⚡ Zero-config start

Just click **Start**. The prefilled input runs a **bulk** search for `web scraping` and `ai agents` (US, 50 results each) so your first dataset has rows in seconds. When you're ready to track a niche, switch `mode` to `monitor`, set `sortBy` to `Upload date`, and add a schedule — see the [3 steps](#-how-to-use--first-run-in-3-steps) below.

### 💰 Why use this instead of…?

| Option                    | Cost                                         |        New-videos-only feed?        | No quota wall? |
| ------------------------- | -------------------------------------------- | :---------------------------------: | :------------: |
| YouTube Data API v3       | Free, but **~100 searches/day** then blocked |                 ❌                  |       ❌       |
| vidIQ / TubeBuddy         | **$10–80/month** subscription                |         Partial (dashboard)         |       ✅       |
| One-shot YouTube scrapers | **Re-pay for the same videos every run**     |                 ❌                  |       ✅       |
| **This Actor**            | **Pay-per-use — first run per query free**   | ✅ (monitor mode, raw rows you own) |       ✅       |

If what you need is the **raw video rows** — for Google Sheets, Slack alerts, BigQuery, or an AI pipeline — rather than another SaaS dashboard, this Actor delivers the same data stream at a fraction of the price.

### 🎯 Use cases

- 🎥 **Creators & channel managers** — wake up to a daily feed of every new video in your niche. Monitor mode + `sortBy = Upload date` gives you only what's new since yesterday; quiet days cost almost nothing.
- 📈 **Marketers & trend watchers** — track branded keywords, campaigns, and emerging topics across 49 regions; spot a trend the moment videos start appearing.
- 🕵️ **Competitor & influencer research** — harvest who is publishing on your keywords, with channel, views, and links — ready to sort and filter.
- 🔬 **Researchers & analysts** — bulk-export thousands of structured rows for a keyword set and analyze title, view, and timing patterns in a spreadsheet.
- 🤖 **Data & AI teams** — feed YouTube search data into your own pipeline keylessly, with no Data-API quota to manage and no per-seat SaaS.
- 🏢 **Agencies** — monitor a separate niche per client in one run; each extra query is just more rows, not another subscription.

### 📖 How to use — first run in 3 steps

1. **Click Start** — the prefill (`web scraping`, `ai agents`, US, bulk, 50 results each) is safe and completes in seconds.
2. **Open the Dataset tab** — one flat row per video. Export as **CSV / JSON / Excel**, or open in Google Sheets.
3. **Turn it into a monitor** — set `mode` to `monitor`, `sortBy` to `Upload date`, swap in your own queries, **Save as Task**, and add a daily [Schedule](https://docs.apify.com/platform/schedules). The first run per query is a free baseline; from the next run on, only genuinely new uploads arrive.

### 🧾 Input

| Field                | Type                | Required | Default                         | Description                                                                                                                                 |
| -------------------- | ------------------- | :------: | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `queries`            | array of strings    |    ✅    | `["web scraping", "ai agents"]` | YouTube search terms, one per line. Search operators supported                                                                              |
| `mode`               | `bulk` \| `monitor` |    ✅    | `bulk`                          | `bulk` = export current results; `monitor` = only videos new since the last run                                                             |
| `sortBy`             | string              |    no    | `relevance`                     | `relevance`, `date` (newest), `views`, or `rating`. Pair `monitor` with `date`                                                              |
| `region`             | string              |    no    | `US`                            | One of **49** region/language editions (see the list below)                                                                                 |
| `maxResultsPerQuery` | integer             |    no    | `50`                            | Cap per query per run (1–600)                                                                                                               |
| `maxVideoAgeDays`    | integer             |    no    | `30`                            | **Advanced, monitor only** — only flag videos uploaded within this many days as new (filters out older videos that can resurface in search) |
| `proxyConfiguration` | object              |    no    | Apify datacenter                | Uses Apify's datacenter proxy by default — no extra setup needed                                                                            |

> **Advanced (API only):** the free filters `titleContains`, `channelContains`, and `minViews` are still honored if you pass them in JSON input — they narrow delivery (and your bill) to just the videos you care about. They're hidden from the Console form to keep the first run simple.

#### Example input

```json
{
    "queries": ["ai agents", "web scraping tutorial"],
    "mode": "monitor",
    "sortBy": "date",
    "region": "US",
    "maxResultsPerQuery": 50,
    "proxyConfiguration": { "useApifyProxy": true }
}
````

Schedule that daily and each run returns just the videos newly uploaded for those niches since the previous check.

### 📊 Output

One flat row per video — perfect for spreadsheets, pivots, and pipelines. No nested JSON.

| Field               | Type            | Description                                                     | Example                                         |
| ------------------- | --------------- | --------------------------------------------------------------- | ----------------------------------------------- |
| `title`             | string          | Video title                                                     | `"How to scrape ANY website"`                   |
| `thumbnailUrl`      | string          | Thumbnail image URL                                             | `"https://i.ytimg.com/vi/.../hq720.jpg"`        |
| `videoUrl`          | string          | Watch link                                                      | `"https://www.youtube.com/watch?v=5kcaHAuGxmY"` |
| `channelTitle`      | string          | Channel name                                                    | `"Apify"`                                       |
| `channelUrl`        | string          | Channel link                                                    | `"https://www.youtube.com/@apify"`              |
| `viewCount`         | integer | null | View count as a number                                          | `38861`                                         |
| `duration`          | string          | Human-readable runtime                                          | `"5:30"`                                        |
| `publishedTimeText` | string          | Relative publish time (as shown on YouTube)                     | `"2 days ago"`                                  |
| `publishedAtApprox` | string | null  | Approximate absolute upload time                                | `"2026-06-11T12:00:00.000Z"`                    |
| `description`       | string | null  | Description snippet                                             | `"Learn how to scrape…"`                        |
| `videoId`           | string          | YouTube video ID                                                | `"5kcaHAuGxmY"`                                 |
| `channelId`         | string | null  | YouTube channel ID                                              | `"UCxxxxxxxx"`                                  |
| `query`             | string          | The search term that produced this row                          | `"web scraping tutorial"`                       |
| `region`            | string          | Region/language edition used                                    | `"US"`                                          |
| `sortBy`            | string          | Sort order used                                                 | `"date"`                                        |
| `isNew`             | boolean         | New for this query this run (always meaningful in monitor mode) | `true`                                          |
| `scrapedAt`         | string          | UTC timestamp of the run (ISO 8601)                             | `"2026-06-12T15:00:00.000Z"`                    |

#### Example row (JSON)

```json
{
    "title": "How to scrape ANY website",
    "thumbnailUrl": "https://i.ytimg.com/vi/5kcaHAuGxmY/hq720.jpg",
    "videoUrl": "https://www.youtube.com/watch?v=5kcaHAuGxmY",
    "channelTitle": "Apify",
    "channelUrl": "https://www.youtube.com/@apify",
    "viewCount": 38861,
    "duration": "5:30",
    "publishedTimeText": "2 days ago",
    "publishedAtApprox": "2026-06-11T12:00:00.000Z",
    "description": "Learn how to scrape…",
    "videoId": "5kcaHAuGxmY",
    "channelId": "UCxxxxxxxx",
    "query": "web scraping tutorial",
    "region": "US",
    "sortBy": "date",
    "isNew": true,
    "scrapedAt": "2026-06-12T15:00:00.000Z"
}
```

Export the dataset as **CSV, JSON, Excel** or HTML from the run's **Dataset** tab, or connect Google Sheets / BigQuery via Apify integrations.

### 🔔 How monitor mode works

1. **First run per query = free baseline.** You start monitoring a niche without a surprise bill — the initial batch is delivered free.
2. **Every later run = new only.** From the second run on, you receive only the videos uploaded since your last run. Pair with `sortBy = Upload date` for a clean feed.
3. **Quiet runs are cheap.** A run that finds nothing new costs only a tiny check fee, so you can schedule it as often as you like.

### 🌍 Supported regions (49)

<details>
<summary><strong>View all 49 region / language editions</strong></summary>

🇺🇸 United States · 🇨🇦 Canada · 🇲🇽 Mexico · 🇧🇷 Brazil · 🇦🇷 Argentina · 🇨🇴 Colombia · 🇨🇱 Chile · 🇵🇪 Peru · 🇬🇧 United Kingdom · 🇮🇪 Ireland · 🇩🇪 Germany · 🇦🇹 Austria · 🇨🇭 Switzerland · 🇫🇷 France · 🇧🇪 Belgium · 🇳🇱 Netherlands · 🇪🇸 Spain · 🇮🇹 Italy · 🇵🇹 Portugal · 🇸🇪 Sweden · 🇳🇴 Norway · 🇩🇰 Denmark · 🇫🇮 Finland · 🇵🇱 Poland · 🇷🇺 Russia · 🇺🇦 Ukraine · 🇹🇷 Turkey · 🇮🇱 Israel · 🇸🇦 Saudi Arabia · 🇦🇪 UAE · 🇪🇬 Egypt · 🇮🇳 India · 🇵🇰 Pakistan · 🇧🇩 Bangladesh · 🇮🇩 Indonesia · 🇹🇭 Thailand · 🇻🇳 Vietnam · 🇵🇭 Philippines · 🇲🇾 Malaysia · 🇸🇬 Singapore · 🇯🇵 Japan · 🇰🇷 South Korea · 🇹🇼 Taiwan · 🇭🇰 Hong Kong · 🇦🇺 Australia · 🇳🇿 New Zealand · 🇳🇬 Nigeria · 🇰🇪 Kenya · 🇿🇦 South Africa

</details>

Each region sets both the country and the interface language, so you see the results that audience sees.

### 📅 Daily scheduling for a continuous feed

1. Configure your input once (`mode: "monitor"`, `sortBy: "date"`, your queries, your region) and **Save as Task**.
2. Add a [Schedule](https://docs.apify.com/platform/schedules) — daily or hourly.
3. Connect an [integration](https://docs.apify.com/platform/integrations) — Google Sheets, Slack webhook, BigQuery, Make, n8n or Zapier — to act on each batch of new videos automatically.

### 💵 Pricing

**Pay-per-event** — no subscription. You're charged per run start, per page of results checked, and per video delivered — with the **first run per query delivered free**. Empty monitor checks (no new videos) cost only the run + page fees, so scheduling is cheap. Exact per-event rates are shown on the Actor's **Pricing** tab.

| Event               | When it's charged                                                        |
| ------------------- | ------------------------------------------------------------------------ |
| Actor start         | Once per run                                                             |
| Search page checked | Per page of results checked                                              |
| Video delivered     | Per video row delivered — **free on the first (baseline) run per query** |

With Apify's **free tier** ($5 credit), a daily niche monitor runs for a long time before you pay anything.

### 💡 Pro tips

- **Best monitor setup:** `mode = monitor` + `sortBy = date`. Upload-date sort surfaces the newest videos at the top, so new uploads are caught reliably.
- **Size the window to your niche:** keep `maxResultsPerQuery` above your niche's daily upload volume so nothing is missed between runs.
- **New-video Slack alerts:** schedule daily, attach a webhook integration — every row in a monitor run is new by definition.
- **Watch many niches cheaply:** add more lines to `queries`; each is tracked independently with its own free baseline.
- **Reset a baseline:** clear the Actor's saved monitor state to start a niche fresh — the next run re-baselines for free.
- **Trim your bill for free:** pass `titleContains`, `channelContains`, or `minViews` in JSON input (see Input note) to deliver only the videos you care about.

### ℹ️ Good to know

- **Coverage = YouTube search.** Results, ranking, and which videos appear follow YouTube's own search for your query, sort, and region — this is a search tool, not a full-channel crawler.
- **Publish time is relative.** YouTube shows `"2 days ago"`; `publishedAtApprox` is an approximate absolute time that grows less precise with age (a "1 year ago" video is only ±months accurate).
- **Non-English regions:** `viewCount` and `publishedAtApprox` are read for the major editions (Spanish, Portuguese, French, Italian, German, Dutch, Turkish, Indonesian, Malay, Vietnamese, Japanese, Korean, Chinese). For a few smaller editions those two fields can come back blank — the raw `publishedTimeText` and every other field are always provided.
- **Abbreviated view counts** (e.g. "38K") are approximate when YouTube only exposes the short form.
- **New-video detection** works within the `maxResultsPerQuery` window — keep the cap above your niche's upload volume and pair monitor mode with `sortBy = date`.
- **Resilient by design** — if YouTube changes things behind the scenes, the Actor adapts automatically and isolates per-query errors, so one bad query never fails the whole run.

### ▶️ Ready?

**Click Start** with the prefilled input — your first rows arrive in seconds. Then set `mode` to `monitor`, `sortBy` to `Upload date`, schedule it, and never miss a new video in your niche again.

### 📬 Feedback & support

If you have any questions, feature requests, or encounter any issues, please open an [issue on the Actor's page](https://apify.com/slothtechlabs/youtube-search-harvester/issues). We'd love to hear from you!

# Actor input Schema

## `queries` (type: `array`):

YouTube search terms, one per line (e.g. "web scraping", "product review 2026", "sourdough"). YouTube search operators are supported.

## `mode` (type: `string`):

Bulk = export the current search results. Monitor = return only videos that are NEW since the last run (pair with Sort = Upload date for a new-uploads-in-my-niche feed).

## `sortBy` (type: `string`):

How YouTube orders results. "Upload date" surfaces the newest videos first (best for the new-video monitor).

## `region` (type: `string`):

Search country and interface language. Pick the audience whose YouTube results you want to see.

## `maxResultsPerQuery` (type: `integer`):

Maximum videos to return per query per run (1–600).

## `maxVideoAgeDays` (type: `integer`):

Monitor mode only. Only flag a video as new if it was uploaded within this many days before your previous run — this filters out older videos that can resurface in search. Tip: pair monitor mode with Sort = Upload date for the cleanest results.

## `proxyConfiguration` (type: `object`):

Uses Apify's datacenter proxy by default — no extra setup needed.

## Actor input object example

```json
{
  "queries": [
    "web scraping",
    "ai agents"
  ],
  "mode": "bulk",
  "sortBy": "relevance",
  "region": "US",
  "maxResultsPerQuery": 50,
  "maxVideoAgeDays": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `videos` (type: `string`):

All video rows pushed to the default dataset by this run.

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

JSON object with mode, region, sortBy, queries, totalVideos, newVideos, searchRequests, errors, durationMs.

# 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 = {
    "queries": [
        "web scraping",
        "ai agents"
    ],
    "mode": "bulk",
    "sortBy": "relevance",
    "region": "US",
    "maxResultsPerQuery": 50,
    "maxVideoAgeDays": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("slothtechlabs/youtube-search-harvester").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 = {
    "queries": [
        "web scraping",
        "ai agents",
    ],
    "mode": "bulk",
    "sortBy": "relevance",
    "region": "US",
    "maxResultsPerQuery": 50,
    "maxVideoAgeDays": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("slothtechlabs/youtube-search-harvester").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "web scraping",
    "ai agents"
  ],
  "mode": "bulk",
  "sortBy": "relevance",
  "region": "US",
  "maxResultsPerQuery": 50,
  "maxVideoAgeDays": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call slothtechlabs/youtube-search-harvester --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=slothtechlabs/youtube-search-harvester",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Search Scraper & New-Video Monitor — No API Key",
        "description": "Search YouTube by keyword and bulk-export clean video rows — title, channel, views, duration, publish date & links — or monitor a niche for ONLY new uploads since the last run. 49 regions, no API key, no quota wall. Pay-per-use, first run free. A vidIQ/TubeBuddy alternative.",
        "version": "1.2",
        "x-build-id": "097Hf60J4fgCHfodE"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/slothtechlabs~youtube-search-harvester/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-slothtechlabs-youtube-search-harvester",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/slothtechlabs~youtube-search-harvester/runs": {
            "post": {
                "operationId": "runs-sync-slothtechlabs-youtube-search-harvester",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/slothtechlabs~youtube-search-harvester/run-sync": {
            "post": {
                "operationId": "run-sync-slothtechlabs-youtube-search-harvester",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "queries",
                    "mode"
                ],
                "properties": {
                    "queries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "YouTube search terms, one per line (e.g. \"web scraping\", \"product review 2026\", \"sourdough\"). YouTube search operators are supported.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "bulk",
                            "monitor"
                        ],
                        "type": "string",
                        "description": "Bulk = export the current search results. Monitor = return only videos that are NEW since the last run (pair with Sort = Upload date for a new-uploads-in-my-niche feed).",
                        "default": "bulk"
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "relevance",
                            "date",
                            "views",
                            "rating"
                        ],
                        "type": "string",
                        "description": "How YouTube orders results. \"Upload date\" surfaces the newest videos first (best for the new-video monitor).",
                        "default": "relevance"
                    },
                    "region": {
                        "title": "Region / language",
                        "enum": [
                            "US",
                            "CA",
                            "MX",
                            "BR",
                            "AR",
                            "CO",
                            "CL",
                            "PE",
                            "GB",
                            "IE",
                            "DE",
                            "AT",
                            "CH",
                            "FR",
                            "BE",
                            "NL",
                            "ES",
                            "IT",
                            "PT",
                            "SE",
                            "NO",
                            "DK",
                            "FI",
                            "PL",
                            "RU",
                            "UA",
                            "TR",
                            "IL",
                            "SA",
                            "AE",
                            "EG",
                            "IN",
                            "PK",
                            "BD",
                            "ID",
                            "TH",
                            "VN",
                            "PH",
                            "MY",
                            "SG",
                            "JP",
                            "KR",
                            "TW",
                            "HK",
                            "AU",
                            "NZ",
                            "NG",
                            "KE",
                            "ZA"
                        ],
                        "type": "string",
                        "description": "Search country and interface language. Pick the audience whose YouTube results you want to see.",
                        "default": "US"
                    },
                    "maxResultsPerQuery": {
                        "title": "Max results per query",
                        "minimum": 1,
                        "maximum": 600,
                        "type": "integer",
                        "description": "Maximum videos to return per query per run (1–600).",
                        "default": 50
                    },
                    "maxVideoAgeDays": {
                        "title": "Max age to count as a new video (days)",
                        "minimum": 1,
                        "maximum": 3650,
                        "type": "integer",
                        "description": "Monitor mode only. Only flag a video as new if it was uploaded within this many days before your previous run — this filters out older videos that can resurface in search. Tip: pair monitor mode with Sort = Upload date for the cleanest results.",
                        "default": 30
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Uses Apify's datacenter proxy by default — no extra setup needed.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
