Competitor research on YouTube starts with one thing: knowing which channels you are actually competing against. Channel IDs are how you track them reliably — here is the full process.
When you track competitors for YouTube SEO, you cannot rely on channel names or handles alone:
A Channel ID (UCBcRF18a7Qf58cCRy5xuWwQ) is permanent and unique. It is the correct anchor for any serious competitor research setup.
Before collecting Channel IDs, identify which channels you are actually competing with. The right competitors are channels ranking for the same keywords you are targeting.
YouTube videos appear in Google search results. Search your target keywords on Google and check which YouTube channels appear in the video carousel and "Videos" tab. These channels are ranking in both YouTube and Google.
Once you have a list of competitor channels, get their Channel IDs.
Fastest method: channelid.app
For 20+ channels, use channelid.app's bulk input: paste all URLs at once and download the CSV.
| Channel Name | Channel ID | Handle | Niche | Subscribers | Notes |
|---|---|---|---|---|---|
| MKBHD | UCBcRF18a7Qf58cCRy5xuWwQ | @mkbhd | Tech reviews | 18M | Top competitor |
| Linus Tech Tips | UCXuqSBlHAE6Xw-yeJA0Tunw | @linustechtips | Tech | 15M | Different format |
The Channel ID column is the stable anchor. Everything else in the row can be updated as it changes.
With Channel IDs, monitor what your competitors are publishing and identify keyword opportunities.
import requests
def get_recent_video_titles(channel_id: str, api_key: str, count: int = 20) -> list[str]:
ch = requests.get(
"https://www.googleapis.com/youtube/v3/channels",
params={"part": "contentDetails", "id": channel_id, "key": api_key}
).json()
uploads_playlist = ch["items"][0]["contentDetails"]["relatedPlaylists"]["uploads"]
vids = requests.get(
"https://www.googleapis.com/youtube/v3/playlistItems",
params={"part": "snippet", "playlistId": uploads_playlist, "maxResults": count, "key": api_key}
).json()
return [item["snippet"]["title"] for item in vids.get("items", [])]
Scan titles for: keywords you are not targeting yet, video formats that get high engagement, topics your audience is searching for that competitors are covering.
https://www.youtube.com/feeds/videos.xml?channel_id=UCBcRF18a7Qf58cCRy5xuWwQ
Subscribe in any RSS reader (Feedly, Inoreader) to get notified when competitors publish new videos.
def get_top_videos(channel_id: str, api_key: str, count: int = 50) -> list[dict]:
ch = requests.get(
"https://www.googleapis.com/youtube/v3/channels",
params={"part": "contentDetails", "id": channel_id, "key": api_key}
).json()
uploads_id = ch["items"][0]["contentDetails"]["relatedPlaylists"]["uploads"]
pl_items = requests.get(
"https://www.googleapis.com/youtube/v3/playlistItems",
params={"part": "snippet", "playlistId": uploads_id, "maxResults": count, "key": api_key}
).json()
video_ids = [item["snippet"]["resourceId"]["videoId"] for item in pl_items.get("items", [])]
stats_resp = requests.get(
"https://www.googleapis.com/youtube/v3/videos",
params={"part": "snippet,statistics", "id": ",".join(video_ids), "key": api_key}
).json()
videos = []
for item in stats_resp.get("items", []):
videos.append({
"title": item["snippet"]["title"],
"views": int(item["statistics"].get("viewCount", 0)),
"published": item["snippet"]["publishedAt"],
})
return sorted(videos, key=lambda x: x["views"], reverse=True)
High-view videos on competitor channels = proven keyword demand. Those are topics worth targeting.
n8n workflow: 1. Schedule — run weekly 2. Google Sheets — read competitor Channel IDs 3. HTTP Request — YouTube API: get latest video titles per channel 4. Google Sheets — append new titles with date 5. Slack/Email — alert when competitors publish on specific keywords
Make scenario: 1. YouTube module: Watch Videos → By Channel ID 2. Filter: title contains your target keyword 3. Slack: post alert with video title and URL
Both approaches use the Channel ID as the stable input. Without it, these automations break every time a competitor changes their handle.
| Tool | How Channel ID Is Used |
|---|---|
| vidIQ | Track competitor channels by ID |
| TubeBuddy | Channel audit and comparison |
| Social Blade | Stats history tracking |
| n8n | YouTube trigger nodes |
| Make (Integromat) | YouTube Watch Videos module |
The Channel ID is what makes all of this repeatable. Handles and display names change — Channel IDs do not.
Paste any channel URL — @handle, /c/, /channel/, or /user/ format — and get the Channel ID in one click.
Try channelid.app — Free