# YouTube SEO & Rank Tracker: Ranked Keywords, Tags (`s_actors/youtube-seo-rank-tracker`) Actor

Find every search a YouTube video or channel ranks for, no keyword list needed, and where competitors outrank you. Track keyword rankings, get YouTube search suggestions, video tags and SEO checks. Only-changes mode alerts on ranking moves and competitors' new uploads, title and tag edits.

- **URL**: https://apify.com/s\_actors/youtube-seo-rank-tracker.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** SEO tools, Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

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

### YouTube SEO & Rank Tracker: Ranked Keywords, Tags

Give it a YouTube video or channel and get **every search it ranks for**, no keyword list needed. Add competitors and see **where they outrank you** and which searches they rank for that you don't. The same Actor tracks **keyword rankings**, collects **YouTube search suggestions**, and returns **video tags, descriptions, views, likes and SEO checks**.

Schedule it with **Only report changes** and get just the news: ranking moves, keywords gained or lost, a competitor's new upload, a new title or new tags.

Export as **JSON, CSV, Excel or HTML**, or use it as a **YouTube SEO API**. No browser, no Google account, no YouTube API key or quota.

#### How it works

1. Choose what to do: **Ranked keywords**, **Keyword rankings**, **Keyword suggestions** or **Video details**
2. Add videos or channels: video links, `youtu.be` or Shorts links, channel links or `@handles`. For ranked keywords, **yours first**, then competitors
3. Add countries: `us`, `gb`, `de`, `in`, `br`... (results differ by country)
4. Optional: switch on **Only report changes** and schedule the task daily (see [Monitoring](#only-report-changes-how-monitoring-works))

#### Why this Actor

| | |
|---|---|
| 🔎 **Ranked keywords** | Which searches a video or channel ranks for (top 50 or deeper), found from its titles, tags, description and YouTube suggestions. Other trackers need you to bring the keywords |
| ⚔️ **Keyword gap** | Searches where a competitor ranks and you don't, or ranks higher: `gap`, `behind`, `ahead`, `only_you` |
| 📈 **Rank tracker** | Positions of your videos or channels for your keyword list, up to 500 results deep, in any country |
| 🏷️ **Tags & SEO checks** | Every tag of any video, title and description length, hashtags, chapters, and whether your keyword is in the title, description and tags |
| 🕵️ **Competitor changes** | New uploads, new titles, tags, descriptions, category of competitor videos |
| 🔑 **Keyword research** | YouTube search box suggestions for any seed, with A-Z expansion |
| 🔔 **Only changes** | Scheduled runs return only what changed since the last run |
| 💰 **Cheaper than YouTube SEO tools** | Pay per result instead of a monthly vidIQ or TubeBuddy plan |

#### Use cases

- **YouTube SEO audit**: see every search your video or channel already ranks for, and which ones are close to the top 10
- **Competitor research**: the searches a competitor ranks for, including branded ones, and the tags they use
- **Rank tracking**: daily positions of your videos for your target keywords in every market
- **Competitor monitoring**: know the day a rival uploads, or changes a title or tags
- **Content ideas**: YouTube autocomplete keywords for any topic
- **AI agents**: give your assistant live YouTube search data through the Apify MCP server

#### Ranked keywords

One row per search where your video (or channel) or a competitor ranks. Real example, freeCodeCamp's "Learn Python - Full Course" vs Mosh's "Python for Beginners", US, September 2026: 80 candidate searches checked in 60 seconds, 55 ranked.

| Keyword | freeCodeCamp | Mosh | Status | In suggestions |
|---|---|---|---|---|
| learn python from beginner to advanced | 3 | 12 | ahead | yes |
| python crash course | 4 | 5 | ahead | yes |
| python full course | 7 | - | only\_you | yes |
| learn python | 5 | 1 | behind | yes |
| python coding | - | 1 | gap | yes |

| Field | Description |
|---|---|
| `keyword`, `country` | The search |
| `position` | Place of your video (the first one in the list) among video results; for a channel, the place of its best video, with `rankingVideoTitle` |
| `status` | `ahead` (you rank higher), `behind`, `gap` (only a competitor ranks), `only_you`; `ranked` with one video or channel |
| `bestCompetitor`, `bestCompetitorPosition` | The highest-ranking competitor |
| `positions` | Positions of all listed videos or channels |
| `suggested` | The keyword appears in YouTube search suggestions, so people really type it |
| `source` | Where the keyword came from: `title/tags`, `description`, `suggestion`, `your keywords` |
| `topVideo`, `topChannel`, `topVideoViews` | Who is #1 for this search |
| `estimatedResults`, `searchUrl` | YouTube's result count and the search link |

**Candidate keywords per video or channel** (default 100) controls how many searches are tested. You pay only for rows, that is searches where one of your videos or channels ranks. Add your own keywords in **Keywords** to test them too. For a channel, candidates come from its latest uploads (**Videos per channel**).

#### Keyword rankings

One row per keyword, country and tracked video or channel (or every video in the results if you track none).

| Field | Description |
|---|---|
| `keyword`, `country`, `position` | Place among video results in YouTube search |
| `target`, `inResults`, `isTracked` | Your video or channel; found in results |
| `videoId`, `videoTitle`, `channelName`, `channelId`, `views`, `published`, `duration`, `isShort`, `isLive`, `snippet` | The video as shown in results |
| `resultsChecked`, `estimatedResults`, `searchUrl`, `url` | Depth checked, YouTube's result count, links |

**Position** counts video results in order, as a viewer scrolls. Shorts shelves, "People also watched" rows, playlists, channels and ads are not videos in the list and are not counted. Example: `python tutorial` (US), Mosh #2, freeCodeCamp #6.

#### Video details & SEO checks

| Field | Description |
|---|---|
| `title`, `description`, `tags`, `category`, `hashtags`, `hashtagsShown` | Metadata, including every tag of the video |
| `views`, `likes`, `commentsCount`, `publishedAt`, `durationSeconds` | Numbers, e.g. `49,348,860` views, `1,122,844` likes |
| `channelName`, `channelHandle`, `channelSubscribers` | The channel |
| `titleLength`, `descriptionLength`, `tagsCount`, `tagsCharacters` | SEO checks (YouTube allows 100 title and 500 tag characters) |
| `hasChapters`, `linksInDescription` | Timestamps in the description, links |
| `keywordChecks` | For each of your **Keywords**: in title, in description, in the first 150 characters, in tags |

Add a channel to get its latest uploads (**Videos per channel**).

#### Keyword suggestions

One row per keyword idea from the YouTube search box. Example for `sourdough` (US): `sourdough bread`, `sourdough pizza dough`, `sourdough starter feeding`, `sourdough discard recipes`... With **Expand suggestions A-Z** one seed gave 357 keywords.

| Field | Description |
|---|---|
| `seed`, `keyword`, `rank` | Your seed, the suggested keyword and its order |
| `suggestedFor` | The query that produced it, e.g. `sourdough w` |

#### Only report changes: how monitoring works

Monitoring turns a scheduled run into alerts. It works in three steps:

1. **Switch on** **Only report changes** and pick a **Monitor name** (one name per project)
2. **Save as a task and schedule it**, for example every morning (Actor page → Save as a new task → Schedule)
3. **First run** saves the current state and returns everything marked `change: new`. **Every later run** compares with the previous run and returns only the differences. An empty result means nothing changed

What you get on later runs:

| Mode | What counts as a change | Example row |
|---|---|---|
| Keyword rankings | Your video moved at least **Minimum position change** places, entered the results or dropped out | `python tutorial`: `up`, was 7, now 2 |
| Ranked keywords | A search gained (`entered`), lost (`dropped_out`) or moved | `learn python`: `down`, was 5, now 11 |
| Video details | A competitor uploaded a video (`new_video`), or changed title, description, tags, category, hashtags or length | `tags`: before `[...]`, after `[...]` |

| Field | Description |
|---|---|
| `change` | `up`, `down`, `entered`, `dropped_out`, `new` (first run), `new_video` |
| `position`, `previousPosition`, `positionChange` | Now, at the last run, places gained (+) or lost (-) |
| `field`, `oldValue`, `newValue` | Video details: what changed on a video |

Good to know: YouTube results shift by a place or two between checks. The Actor keeps the same YouTube visitor between scheduled runs to keep comparisons stable, and **Minimum position change** (default 2) filters out the small moves. Use a different **Monitor name** for each task, otherwise two tasks overwrite each other's memory. You pay for the checks, not for the changes found.

#### Pricing

Pay per result, no subscription:

| Event | Price |
|---|---|
| Run start | $0.003 |
| Ranked keyword (a search where one of your videos or channels ranks; tested searches without a match are free) | $0.002 |
| Keyword ranking check (1 keyword × 1 country, up to 100 results) | $0.002 |
| Keyword suggestion query (up to 14 ideas) | $0.0005 |
| Video details | $0.002 per video |

| Task | Cost |
|---|---|
| Ranked keywords for your video and 1 competitor, 1 country (~100 searches) | ~$0.12 |
| 20 keywords × 1 country, checked daily for 30 days | ~$1.30 per month |
| 5 competitor channels, 5 latest videos each, checked daily for 30 days | ~$1.60 per month |
| 1 seed with A-Z suggestions (~350 keywords) | ~$0.02 |

#### Ready-made tasks

Open one, change the videos, channels or keywords, and run:

| Task | What you get |
|---|---|
| [Find Every Search a YouTube Video Ranks For](https://apify.com/s_actors/youtube-seo-rank-tracker/examples/youtube-video-ranked-keywords) | Every search one video ranks for |
| [YouTube Competitor Analysis: Keyword Gap vs Rival Videos](https://apify.com/s_actors/youtube-seo-rank-tracker/examples/youtube-competitor-keyword-gap) | Searches a rival video ranks for and yours doesn't |
| [YouTube Channel Keywords Finder: Searches a Channel Ranks For](https://apify.com/s_actors/youtube-seo-rank-tracker/examples/youtube-channel-keywords) | Searches a whole channel ranks for |

#### Input example

```json
{
    "mode": "keyword_rankings",
    "keywords": ["python tutorial", "learn python"],
    "targets": ["https://www.youtube.com/@freecodecamp", "https://www.youtube.com/watch?v=kqtD5dpn9C8"],
    "countries": ["us", "gb"],
    "onlyChanges": true,
    "monitorName": "python-course"
}
```

#### Tips

- **Video ID** is the 11 characters after `v=` in the link: `youtube.com/watch?v=rfscVS0vtbw` → `rfscVS0vtbw`. Links, Shorts links and `@handles` work too.
- Ranked keywords are found, not guessed: every row was checked in YouTube search at run time. YouTube publishes no list of the searches a video ranks for, so very long-tail searches that appear nowhere in titles, tags, descriptions or suggestions can be missed; add them in **Keywords**.
- Rankings differ by country and language: add each market you care about.
- Send results to email, Slack or [Google Sheets](https://apify.com/s_actors/google-sheets-import-export) with integrations.
- App developers: [Google Play](https://apify.com/s_actors/google-play-scraper) and [App Store](https://apify.com/s_actors/app-store-scraper) rank trackers work the same way.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "Which searches does my channel rank for on YouTube in the US that my competitor's channel doesn't?"

#### Other YouTube tools

| Tool | What it does |
|---|---|
| [YouTube Comments Scraper](https://apify.com/s_actors/youtube-comments-scraper) | Comments and replies of videos, Shorts and channels, only-new monitoring |
| [Google Sheets Import & Export](https://apify.com/s_actors/google-sheets-import-export) | Send the results to a Google Sheet |

#### Is it legal?

The Actor collects only public data shown on YouTube to any visitor, without logging in: search results, suggestions and public video pages. It does not download videos or collect personal data of viewers.

# Actor input Schema

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

Ranked keywords: find every search a video or channel ranks for on YouTube (no keyword list needed), and where competitors outrank it. Keyword rankings: positions for your own keyword list (YouTube rank tracker). Keyword suggestions: YouTube search box suggestions (keyword research). Video details: tags, description, views, likes, comments and SEO checks; with "Only report changes" it reports competitors' new uploads and title, tag and description changes.

## `targets` (type: `array`):

Video links (youtube.com/watch?v=..., youtu.be/..., /shorts/...), video IDs, channel links (youtube.com/@handle, /channel/UC...) or @handles. Ranked keywords: yours first, then competitors. A channel ranks with its best video. Keyword rankings: videos or channels to track (leave empty to get the whole top). Video details: videos, or channels for their latest videos.

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

Keyword rankings: the searches to check. Keyword suggestions: seed keywords. Ranked keywords: extra searches to check on top of the ones found automatically. Video details: target keywords for the SEO checks (in title, description, tags).

## `countries` (type: `array`):

Two-letter country codes, one per line: us, gb, de, in, br... YouTube search results and suggestions differ by country. Default: us.

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

YouTube interface language, e.g. en, de, es, pt, hi. Affects suggestions and the language of dates in results.

## `maxPosition` (type: `integer`):

How many video results to check per search (YouTube shows about 20 per page; up to 500). Ranked keywords: a search counts if a video is within this position. Keyword rankings: every 100 places is one check.

## `maxKeywordsPerTarget` (type: `integer`):

Ranked keywords: how many candidate searches to test per video or channel (from titles, tags, descriptions and YouTube suggestions). More finds more long-tail keywords and takes longer. You pay only for keywords where one of your videos or channels ranks.

## `maxVideosPerChannel` (type: `integer`):

For channels: how many of the latest uploads to use. Ranked keywords: their titles and tags give candidate keywords. Video details: their details are scraped (and new uploads reported in monitoring).

## `onlyTrackedTargets` (type: `boolean`):

Keyword rankings with videos or channels listed: one row per tracked video or channel (its position, or empty if not in the results). Turn off to get every video in the results with a tracked flag.

## `expandSuggestions` (type: `boolean`):

Keyword suggestions: also ask for "seed a", "seed b" ... "seed z" to find long-tail keywords (27 queries per seed instead of 1).

## `onlyChanges` (type: `boolean`):

For scheduled runs (save the input as a task and add a schedule). The first run saves the current state and returns everything marked "new"; every later run returns only what changed since the previous run: positions that moved, keywords gained or lost, competitors' new uploads, and title, tag or description changes. An empty result means nothing changed.

## `minPositionChange` (type: `integer`):

Report a ranking move only if a video moved at least this many places. YouTube results shift by a place or two between checks; 2-3 keeps alerts to real moves.

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

Separate monitors keep separate memory. Use a different name for each scheduled task.

## `maxConcurrency` (type: `integer`):

How many requests run at the same time.

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

Requests go direct first; the proxy is used only when YouTube refuses a request.

## Actor input object example

```json
{
  "mode": "ranked_keywords",
  "targets": [
    "https://www.youtube.com/watch?v=rfscVS0vtbw",
    "https://www.youtube.com/watch?v=kqtD5dpn9C8"
  ],
  "keywords": [
    "python tutorial",
    "learn python"
  ],
  "countries": [
    "us"
  ],
  "language": "en",
  "maxPosition": 50,
  "maxKeywordsPerTarget": 30,
  "maxVideosPerChannel": 20,
  "onlyTrackedTargets": true,
  "expandSuggestions": false,
  "onlyChanges": false,
  "minPositionChange": 2,
  "monitorName": "default",
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every search a video or channel ranks for, with competitor positions and gaps.

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

One row per keyword, country and video or channel: position in YouTube search.

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

Only moves, videos entering or dropping out, keywords gained or lost (monitoring).

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

Keyword ideas from the YouTube search box.

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

Tags, views, likes, comments, category and SEO checks per video.

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

What changed on videos since the last run (monitoring).

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

Every field of every row.

# 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 = {
    "targets": [
        "https://www.youtube.com/watch?v=rfscVS0vtbw",
        "https://www.youtube.com/watch?v=kqtD5dpn9C8"
    ],
    "keywords": [
        "python tutorial",
        "learn python"
    ],
    "countries": [
        "us"
    ],
    "maxKeywordsPerTarget": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/youtube-seo-rank-tracker").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 = {
    "targets": [
        "https://www.youtube.com/watch?v=rfscVS0vtbw",
        "https://www.youtube.com/watch?v=kqtD5dpn9C8",
    ],
    "keywords": [
        "python tutorial",
        "learn python",
    ],
    "countries": ["us"],
    "maxKeywordsPerTarget": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("s_actors/youtube-seo-rank-tracker").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 '{
  "targets": [
    "https://www.youtube.com/watch?v=rfscVS0vtbw",
    "https://www.youtube.com/watch?v=kqtD5dpn9C8"
  ],
  "keywords": [
    "python tutorial",
    "learn python"
  ],
  "countries": [
    "us"
  ],
  "maxKeywordsPerTarget": 30
}' |
apify call s_actors/youtube-seo-rank-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s_actors/youtube-seo-rank-tracker"
        }
    }
}
```

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/j2hlU8Fc2zcnraLtZ/builds/J3ewhud1ZuglWJgWt/openapi.json
