# YouTube Search Results Scraper — No Login (`cliqtomedia/youtube-search-scraper`) Actor

Search YouTube videos, channels and Shorts without login or an API key. Send up to 5 queries and get ranked search cards with visible titles, channel details, view labels, duration and fetch times. Export results and check each query in the run summary.

- **URL**: https://apify.com/cliqtomedia/youtube-search-scraper.md
- **Developed by:** [Cliqto Media](https://apify.com/cliqtomedia) (community)
- **Categories:** Videos, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.19 / 1,000 search results

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Search public YouTube videos, channels and Shorts by keyword. Get a row for each result, with its query, rank, title and visible metadata. No login or YouTube API key is needed.

Use it for keyword research, content planning and channel discovery. Start with `apify tutorial` and 20 results.

![YouTube search keywords to ranked video, channel and Shorts cards](https://api.apify.com/v2/key-value-stores/cWYHYzqTFCsBZu8H4/records/HERO)

### Table of contents

- [What it does](#what-it-does)
- [Quick start](#quick-start)
- [Input](#input)
- [Output](#output)
- [Pricing and limits](#pricing-and-limits)
- [Use cases](#use-cases)
- [Scheduling and monitoring](#scheduling-and-monitoring)
- [API, export and integrations](#api-export-and-integrations)
- [Limitations and partial results](#limitations-and-partial-results)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Related Actors](#related-actors)
- [Support](#support)

### What it does

Send up to 5 keyword queries in one run. Choose videos, channels, Shorts, or all supported search cards. The Actor reads public search responses and follows their next pages until it reaches your limit or the source ends.

#### Data you get

- The query and a rank for each delivered result.
- Video or channel ID, title and public URL.
- Visible channel name, view label, duration and publish label when available.
- A thumbnail, description excerpt and fetch time when available.

It does not download videos. It does not read private videos, playlists, comments or transcripts. Search ranks refer to supported cards in this run. They do not include ads, playlists or repeated IDs.

### Quick start

1. Open **Input**.
2. Keep `queries` as `["apify tutorial"]` and `maxResultsPerQuery` as `20`.
3. Keep the default video search.
4. Click **Start**.
5. Open **Search results** to see the rows. Open **Run summary** to check each query.

The example returns public video cards. Results can change over time.

### Input

Only `queries` is required. API input without `queries` (for example `{}`) is rejected by Apify input validation before a run starts, so nothing is charged; other fields use the defaults below. The new form prefills `queries` and `maxResultsPerQuery`. **Restore example input** provides the same small example. The default build is `latest`.

| Field                | Type             | Default / prefill               | Allowed values                                  | What it changes / advice                                                                                                                                  |
| -------------------- | ---------------- | ------------------------------- | ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `queries`            | array of strings | required / `["apify tutorial"]` | 1–5 queries; 1–200 characters each              | Keywords for each search. Leading/trailing spaces are removed. Exact duplicates are merged. Keep distinct queries when comparing topics.                  |
| `type`               | string           | `video`                         | `video`, `channel`, `short`, `all`              | `video` includes video cards for Shorts. `short` uses the Shorts search. `all` collects supported video, channel and Shorts cards; playlists are skipped. |
| `uploadDate`         | string           | `all`                           | `all`, `today`, `week`, `month`, `year`         | YouTube upload-date filter. Use only with `video` or `all`.                                                                                               |
| `duration`           | string           | `all`                           | `all`, `under3min`, `3to20min`, `over20min`     | YouTube duration filter. Use only with `video` or `all`.                                                                                                  |
| `sortBy`             | string           | `relevance`                     | `relevance`, `popularity`                       | YouTube ordering. Shorts only accept `relevance`.                                                                                                         |
| `maxResultsPerQuery` | integer          | `20` / same                     | 1–100                                           | Maximum delivered rows per query. The source can return fewer. Up to 500 rows across 5 queries.                                                           |
| `country`            | string           | `US`                            | uppercase two-letter country context, e.g. `JP` | Search context. It does not filter channel location. Start with the market you study.                                                                     |
| `language`           | string           | `en`                            | YouTube language code, e.g. `en`, `de`, `ja`    | Interface language, not a video-language filter. Localized count labels may leave `views` null.                                                           |

#### Interacting settings

Channel and Shorts searches require `uploadDate: "all"` and `duration: "all"`. Shorts also require `sortBy: "relevance"`. Other combinations fail validation before source requests. Video/all filters are sent to YouTube; they are not a later full-dataset filter.

Unknown input keys, an empty query list, blank queries or values outside these ranges fail validation.

#### Input examples

Video search:

```json
{ "queries": ["apify tutorial"], "maxResultsPerQuery": 20 }
```

Returns up to 20 video cards with `videoId`, `title`, `channel` and `duration`.

Channel search:

```json
{ "queries": ["Apify"], "type": "channel", "maxResultsPerQuery": 20 }
```

Returns channel cards. `videoId`, `views`, `duration` and `publishedText` are null for channels.

Shorts search:

```json
{ "queries": ["cooking tips"], "type": "short", "maxResultsPerQuery": 20 }
```

Returns Shorts URLs and visible titles and view labels. Channel, date and duration are often unavailable.

A recent short-duration video search:

```json
{
  "queries": ["python tutorial"],
  "uploadDate": "week",
  "duration": "under3min",
  "sortBy": "popularity",
  "maxResultsPerQuery": 5
}
```

Returns the source's filtered video results, or a successful empty result when none match.

### Output

#### Output example

The following is one complete row from the video example above:

```json
{
  "query": "apify tutorial",
  "rank": 1,
  "type": "video",
  "videoId": "3rrpfW0bEdc",
  "url": "https://www.youtube.com/watch?v=3rrpfW0bEdc",
  "title": "Apify Tutorial For Beginners | How To Use Apify",
  "channel": {
    "id": "UCqD-h6ucBDUntfoapPyhp0Q",
    "name": "Speak About Digital",
    "url": "https://www.youtube.com/channel/UCqD-h6ucBDUntfoapPyhp0Q"
  },
  "views": 43453,
  "viewsText": "43,453 views",
  "publishedText": "3 years ago",
  "duration": "10:41",
  "isShort": false,
  "isLive": false,
  "thumbnail": "https://i.ytimg.com/vi/3rrpfW0bEdc/hq720.jpg?sqp=-oaymwEgCOgCEMoBSFXyq4qpAxIIARUAAIhCGAFwAcABBrgC8xg=&rs=AOn4CLABmbVCBBN5n5_SrWoZ0xIiumH7wQ",
  "descriptionSnippet": "Apify review: https://speakaboutdigital.com/apify-review/ Apify Tutorial For Beginners | How To Use Apify This is my video tutorial\u00a0...",
  "source": "YouTube",
  "fetchedAt": "2026-10-14T10:58:02.998Z"
}
```

#### Output fields

| Field                | Type    | Null? | Meaning / example                                                                                                            |
| -------------------- | ------- | ----- | ---------------------------------------------------------------------------------------------------------------------------- |
| `query`              | string  | no    | Normalized query, e.g. `apify tutorial`.                                                                                     |
| `rank`               | integer | no    | Starts at 1 for each query. Counts delivered unique supported cards.                                                         |
| `type`               | string  | no    | `video`, `channel` or `short`.                                                                                               |
| `videoId`            | string  | yes   | YouTube video ID; null for channel cards.                                                                                    |
| `url`                | string  | no    | Public watch, Shorts or channel URL.                                                                                         |
| `title`              | string  | no    | Search-card title or channel name.                                                                                           |
| `channel.id`         | string  | yes   | Channel ID, e.g. `UCTgwcoeGGKmZ3zzCXN2qo_A`. Shorts often omit it.                                                           |
| `channel.name`       | string  | yes   | Visible channel name, e.g. `Apify`.                                                                                          |
| `channel.url`        | string  | yes   | Canonical channel URL when its ID is shown.                                                                                  |
| `views`              | integer | yes   | Exact English visible view count. Rounded (`11M views`), localized and missing values are null. Zero is a real visible zero. |
| `viewsText`          | string  | yes   | Original view label, e.g. `43,453 views` or `11M views`.                                                                     |
| `publishedText`      | string  | yes   | Source label, e.g. `3 years ago`. This is not an exact publish date.                                                         |
| `duration`           | string  | yes   | Visible `MM:SS` or `HH:MM:SS`, e.g. `10:41`.                                                                                 |
| `isShort`            | boolean | no    | Whether the card identifies a Short.                                                                                         |
| `isLive`             | boolean | yes   | True for a live-now video badge; null for channel and Shorts cards.                                                          |
| `thumbnail`          | string  | yes   | Public thumbnail URL from the card.                                                                                          |
| `descriptionSnippet` | string  | yes   | Visible excerpt, not the full description.                                                                                   |
| `source`             | string  | no    | `YouTube`.                                                                                                                   |
| `fetchedAt`          | string  | no    | UTC fetch time in ISO format.                                                                                                |

#### Output surfaces

**Search results** is the default Dataset view. It shows query, rank, type, title, URL, channel name, views, viewsText, duration, publishedText, isShort and isLive. JSON export contains all row fields.

**Run summary** is the `RUN_SUMMARY` record in the default key-value store. It contains `status`, `reason`, `rows`, per-query `queries`, `requests`, `responseBytes`, `retries`, `elapsedMs`, `provider`, `source`, `fetchedAt` and `limits`.

| Situation                              | Dataset                     | Run summary / action                                                                  |
| -------------------------------------- | --------------------------- | ------------------------------------------------------------------------------------- |
| Results found                          | Delivered cards             | `complete`; query reason `RESULT_LIMIT` or `SOURCE_EXHAUSTED`.                        |
| No matches                             | No rows for that query      | Query `not_found`, run `complete`. Change keywords or filters.                        |
| Buyer charge limit                     | Saved cards only            | Run succeeds with `partial` / `CHARGE_LIMIT`. Raise your budget for more rows.        |
| Source error, deadline or cancellation | Previously saved cards stay | Run fails with `partial` or `error`. Check `reason`; do not treat this as no matches. |
| Invalid input                          | Empty                       | Run fails before source work. Fix the input.                                          |

### Pricing and limits

Pay per event: a standard start fee plus each saved search result. Platform compute, traffic and storage are covered by this tariff; no proxy setting is needed.

| Plan                      | Start fee per run (256 MB) | Per result | Per 1,000 results, excluding start |
| ------------------------- | -------------------------: | ---------: | ---------------------------------: |
| Free                      |                     $0.002 |   $0.00022 |                              $0.22 |
| Bronze                    |                     $0.002 |   $0.00021 |                              $0.21 |
| Silver                    |                     $0.002 |   $0.00020 |                              $0.20 |
| Gold / Platinum / Diamond |                     $0.002 |   $0.00019 |                              $0.19 |

The start event is automatic. It applies to empty results and runs rejected by runtime validation. No result event is charged for an empty query. Partial and failed runs charge only the start and saved result rows. A rejected API request that never starts a run has no run events.

| Delivered rows |       Runs | Free-plan total | Gold-plan total |
| -------------- | ---------: | --------------: | --------------: |
| 0              |          1 |          $0.002 |          $0.002 |
| 1              |          1 |        $0.00222 |        $0.00219 |
| 10             |          1 |        $0.00420 |        $0.00390 |
| 20             |          1 |        $0.00640 |        $0.00580 |
| 100            |          1 |        $0.02400 |        $0.02100 |
| 500            |          1 |        $0.11200 |        $0.09700 |
| 1,000          | at least 2 |        $0.22400 |        $0.19400 |

These are price calculations for delivered rows, not guaranteed result counts. This Actor supports up to 100 rows per query and 500 rows per run. A 1,000-row collection needs at least two runs. Put a limit on **Maximum cost per run** to control the spend. A cap can stop the run before it reaches your requested result count.

### Use cases

| Task                         | Input                              | Useful fields                         | Next step                      |
| ---------------------------- | ---------------------------------- | ------------------------------------- | ------------------------------ |
| Plan content around keywords | Several `queries`, `type: "video"` | `query`, `rank`, `title`, `viewsText` | Compare rows in a spreadsheet. |
| Find public channels         | `type: "channel"`                  | `channel.id`, `channel.name`, `url`   | Review the channel pages.      |
| Study short-form topics      | `type: "short"`                    | `title`, `url`, `viewsText`           | Group titles by topic.         |

### Scheduling and monitoring

You can create an Apify saved task and schedule it to repeat the same queries. Each run is a fresh search and is charged normally. There is no stored baseline or only-new mode. Compare exported rows by `query` and `url` in your own system. The Actor does not create schedules for you.

### API, export and integrations

Start it with the [Apify API](https://docs.apify.com/api/v2/actor-run-post). Use the same JSON input. After completion, read the run's default Dataset and `RUN_SUMMARY` record. Export results as JSON, CSV, Excel or XML using Apify Dataset export. For CSV, flatten `channel` to keep its nested fields.

Apify tasks, webhooks and automation tools can start a run and pass its Dataset ID to the next step. Use `url` or `videoId` as the item key, and keep `query` when the same video appears for several searches.

#### Use with AI agents (MCP)

Use `https://mcp.apify.com?tools=cliqtomedia/youtube-search-scraper` after the Actor is available in Store. Small input:

```json
{ "queries": ["apify tutorial"], "maxResultsPerQuery": 20 }
```

Read `query` (keywords), `rank` (delivered position), `title` (visible title), `url` (public result) and `viewsText` (source count label). The measured small search returned 20 rows in about 2–8 seconds of run time. Its event price is $0.00640 on the base plan. Keep the 5-query, 100-result-per-query limits and check the run summary before treating a partial run as complete.

### Limitations and partial results

- Search results vary by time, region, interface language and anonymous session. They may differ from a signed-in browser.
- The source can change or stop search pages. The Actor is limited to 10 pages per query, 60 requests including retries, 32 MiB of response data and 150 seconds of source work. Reaching an internal page/request/byte limit is a failed partial run, not a promise of full coverage.
- Rank excludes unsupported cards, ads, playlists and duplicate IDs. It is not a universal YouTube SEO rank.
- Shorts cards may omit channel, publish date and duration. These values stay null. No watch-page enrichment is performed.
- Text labels and snippets are capped at 1,024 UTF-8 bytes. Thumbnail URLs longer than 2,048 bytes are omitted.
- Visible counts may be rounded or localized. `viewsText` preserves them. Relative dates remain relative labels.
- The Actor uses public search metadata. It is not affiliated with or endorsed by YouTube. Use the data in line with [YouTube terms](https://www.youtube.com/t/terms) and the rights of content owners.

### Troubleshooting

| Symptom                                         | Possible reason                               | Check                                | Action                                                     |
| ----------------------------------------------- | --------------------------------------------- | ------------------------------------ | ---------------------------------------------------------- |
| Empty Dataset with successful run               | No matching cards                             | Query status in Run summary          | Try a broader query or remove filters.                     |
| `INVALID_INPUT` or `INVALID_FILTER_COMBINATION` | Invalid field or unsupported combination      | Query list, ranges, type and filters | Use an example above and change one field at a time.       |
| `CHARGE_LIMIT`                                  | Maximum run charge reached                    | Summary rows and your budget         | Increase the cap if you need more results.                 |
| `SOURCE_ERROR` / `SOURCE_SCHEMA_CHANGED`        | Source unavailable or its card format changed | Run reason and saved rows            | Retry a small example later; report the run if it repeats. |
| `SOURCE_DEADLINE` / `PAGE_LIMIT` / `BYTE_LIMIT` | Source work exceeded a bound                  | Requests and responseBytes           | Reduce queries or results per query.                       |
| Null numeric views                              | Rounded/localized/missing count               | `viewsText`                          | Use the original label; do not replace null with zero.     |

### FAQ

#### Do I need to sign in or provide a YouTube API key?

No. The Actor reads public anonymous search responses.

#### Does video search exclude Shorts?

No. Video search follows YouTube's video filter, which can include Shorts. Use `type: "short"` for the dedicated Shorts search.

#### Are channels and exact publish dates available for every Short?

No. Missing search metadata stays null. Exact dates are not inferred from relative labels.

#### Can I get every matching video?

No. The source controls its pages. The Actor delivers up to your selected limit within the bounds above. It does not promise full search coverage.

#### Will the same input return the same order later?

It may change. Search is dynamic and session-dependent. Keep the fetch time with your results.

#### Do empty searches cost money?

The start fee applies. No result fee is charged when no rows are saved.

### Related Actors

- [YouTube Comments Scraper](https://apify.com/cliqtomedia/youtube-comments-scraper) — read public comments for a video URL.
- [YouTube Transcript Scraper](https://apify.com/cliqtomedia/youtube-transcript-scraper) — get available transcripts for selected videos.

### Support

Use the Actor's **Issues** tab for questions or bugs. Include the run ID, result type and a non-sensitive error code. Do not send API tokens, cookies or private account data.

# Changelog

This Actor's version history is a separate document: https://apify.com/cliqtomedia/youtube-search-scraper/changelog.md

# Actor input Schema

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

One to five YouTube keyword queries, 1–200 characters each. Exact duplicates are merged.

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

Stop after this many unique supported results per query. Source exhaustion may give fewer results.

## `country` (type: `string`):

Two-letter uppercase YouTube country context, such as US or GB. This is a search context, not a channel location filter.

## `language` (type: `string`):

YouTube interface language, such as en, de or ja. This does not restrict video language. Localized counts may only have viewsText.

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

Choose videos (including video cards for Shorts), channels, Shorts, or all supported cards. Playlists and ads are excluded.

## `uploadDate` (type: `string`):

YouTube upload-date filter for video/all search. Must be all for channel and short.

## `duration` (type: `string`):

YouTube duration filter for video/all search. Must be all for channel and short.

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

YouTube relevance or popularity ordering. Short search only supports relevance.

## Actor input object example

```json
{
  "queries": [
    "apify tutorial"
  ],
  "maxResultsPerQuery": 20,
  "country": "US",
  "language": "en",
  "type": "video",
  "uploadDate": "all",
  "duration": "all",
  "sortBy": "relevance"
}
```

# Actor output Schema

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

Public search cards in the results view.

## `summary` (type: `string`):

Status, per-query counts, limits and request totals.

# 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": [
        "apify tutorial"
    ],
    "maxResultsPerQuery": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/youtube-search-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 = {
    "queries": ["apify tutorial"],
    "maxResultsPerQuery": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("cliqtomedia/youtube-search-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 '{
  "queries": [
    "apify tutorial"
  ],
  "maxResultsPerQuery": 20
}' |
apify call cliqtomedia/youtube-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cliqtomedia/youtube-search-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/xLRWgYTGHNmXX8CIw/builds/Wilpkc5LeagJDWTj1/openapi.json
