# YouTube Video SEO Scraper (`ramman/youtube-video-seo-scraper`) Actor

Lightweight YouTube SEO scraper that extracts titles, descriptions, tags, hashtags, engagement metrics, and channel data from video URLs or keyword searches. Built with Crawlee and Playwright.

- **URL**: https://apify.com/ramman/youtube-video-seo-scraper.md
- **Developed by:** [ramman](https://apify.com/ramman) (community)
- **Categories:** Automation, SEO tools, Social media
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Video SEO Scraper

Extract YouTube video SEO data in seconds — titles, descriptions, tags, hashtags, views, likes, channel info, and ready-to-use SEO metrics.

Perfect for **YouTube SEO audits**, **competitor research**, **keyword discovery**, and **content analysis**.

---

### What you get

For each video, this Actor returns:

- **Video title** and **description**
- **Tags** and **hashtags**
- **Views**, **likes**, and **publish date**
- **Channel name** and **channel URL**
- **SEO helpers**: title length, description length, tag count

Works with regular YouTube links (`watch`, `shorts`, `youtu.be`).

---

### How to use

1. Open this Actor in [Apify Console](https://console.apify.com/).
2. Fill in **Video URLs** and/or **Search keywords**.
3. Set **Max results** (how many videos to scrape in total).
4. Click **Start**.
5. Download your data from the **Dataset** tab (JSON, CSV, Excel, or API).

You can also schedule runs, connect webhooks, or call the Actor from your own app via the Apify API.

---

### Input

| Field | Required | Description |
| --- | --- | --- |
| **Video URLs** | No* | Direct links to YouTube videos |
| **Search keywords** | No* | Search terms — the Actor finds matching videos and scrapes them |
| **Max results** | No | Total videos to scrape (default: 10, max: 100) |

\* Add at least one **Video URL** or **Search keyword**.

#### Scrape specific videos

```json
{
    "videoUrls": [
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
        "https://youtu.be/jNQXAC9IVRw"
    ],
    "maxResults": 10
}
````

#### Search by keyword

```json
{
    "keywords": [
        "how to make money",
        "youtube seo tips"
    ],
    "maxResults": 5
}
```

#### Mix URLs and keywords

```json
{
    "videoUrls": [
        "https://www.youtube.com/watch?v=DZ9lpup4VZ0"
    ],
    "keywords": [
        "dragon glimpse hindi"
    ],
    "maxResults": 10
}
```

**Note:** URLs are processed first. Keywords fill the remaining slots up to **Max results**. Duplicate videos are skipped.

***

### Output example

```json
{
    "videoTitle": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
    "videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "videoId": "dQw4w9WgXcQ",
    "description": "The official video for “Never Gonna Give You Up” by Rick Astley...",
    "tags": ["rick astley", "Never Gonna Give You Up", "nggyu"],
    "hashtags": ["#RickAstley", "#NeverGonnaGiveYouUp"],
    "publishDate": "2009-10-24T23:57:33-07:00",
    "views": 1783350370,
    "likes": 19158980,
    "channelName": "Rick Astley",
    "channelUrl": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw",
    "titleLength": 68,
    "descriptionLength": 2376,
    "tagCount": 27,
    "scrapedAt": "2026-06-16T10:00:00.000Z"
}
```

***

### Output fields

| Field | What it is |
| --- | --- |
| `videoTitle` | Video title |
| `videoUrl` | Full YouTube watch link |
| `videoId` | YouTube video ID |
| `description` | Full video description |
| `tags` | Video tags from YouTube |
| `hashtags` | Hashtags found in the description |
| `publishDate` | When the video was published |
| `views` | Total view count |
| `likes` | Like count |
| `channelName` | Channel name |
| `channelUrl` | Channel profile link |
| `titleLength` | Number of characters in the title |
| `descriptionLength` | Number of characters in the description |
| `tagCount` | Number of tags |
| `scrapedAt` | When this record was scraped |

***

### Tips for best results

- Start with **Max results: 5** to test, then increase for larger batches.
- Use **keywords** to discover top videos in a niche without collecting URLs manually.
- Add **video URLs** when you already know which videos to analyze.
- Compare `titleLength`, `descriptionLength`, and `tagCount` across competitors to find SEO gaps.
- Export the dataset to Google Sheets, Airtable, or your CRM using Apify integrations.

***

### FAQ

**Can I search YouTube by keyword?**\
Yes. Add search terms under **Search keywords**. The Actor finds matching videos and scrapes their SEO data.

**What does Max results do?**\
It sets the total number of unique videos scraped from your URLs and keywords combined.

**Why is a video missing from my results?**\
The Actor only saves videos where it successfully extracts real data (title, views, channel). If a video fails after retries, it is skipped. Check the run log for details.

**Why are tags empty on some videos?**\
YouTube does not always show public tags. Other fields like title, views, and description are usually available.

**Why are likes sometimes empty?**\
YouTube may not expose like counts on every video. Views and other SEO fields are still returned.

**Can I run this automatically?**\
Yes. Schedule runs in Apify Console or trigger the Actor via API, webhooks, and integrations.

***

### Disclaimer

Use this Actor responsibly and in line with YouTube's Terms of Service and applicable laws. Only collect data you are allowed to access.

If you have questions or issues, leave a comment on the Actor page in Apify Store.

# Actor input Schema

## `videoUrls` (type: `array`):

Direct YouTube video URLs to scrape (watch, shorts, or youtu.be links).

## `keywords` (type: `array`):

YouTube search keywords. The Actor discovers top matching videos and scrapes their SEO data.

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

Maximum total number of unique videos to scrape from URLs and keyword search combined.

## Actor input object example

```json
{
  "videoUrls": [],
  "keywords": [
    "dragon glimpse ntr"
  ],
  "maxResults": 10
}
```

# 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 = {
    "videoUrls": [],
    "keywords": [
        "dragon glimpse ntr"
    ],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("ramman/youtube-video-seo-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 = {
    "videoUrls": [],
    "keywords": ["dragon glimpse ntr"],
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("ramman/youtube-video-seo-scraper").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 '{
  "videoUrls": [],
  "keywords": [
    "dragon glimpse ntr"
  ],
  "maxResults": 10
}' |
apify call ramman/youtube-video-seo-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Video SEO Scraper",
        "description": "Lightweight YouTube SEO scraper that extracts titles, descriptions, tags, hashtags, engagement metrics, and channel data from video URLs or keyword searches. Built with Crawlee and Playwright.",
        "version": "1.0",
        "x-build-id": "KSmhxJ6bsjCAG2jol"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/ramman~youtube-video-seo-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-ramman-youtube-video-seo-scraper",
                "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/ramman~youtube-video-seo-scraper/runs": {
            "post": {
                "operationId": "runs-sync-ramman-youtube-video-seo-scraper",
                "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/ramman~youtube-video-seo-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-ramman-youtube-video-seo-scraper",
                "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",
                "properties": {
                    "videoUrls": {
                        "title": "Video URLs",
                        "type": "array",
                        "description": "Direct YouTube video URLs to scrape (watch, shorts, or youtu.be links).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "keywords": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "YouTube search keywords. The Actor discovers top matching videos and scrapes their SEO data.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum total number of unique videos to scrape from URLs and keyword search combined.",
                        "default": 10
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
