YouTube Competitor Intelligence & Content Gap Analyzer
Pricing
from $2.00 / 1,000 analyzed youtube videos
YouTube Competitor Intelligence & Content Gap Analyzer
๐บ Compare YouTube channels, rank videos, reveal content gaps, monitor growth signals, and export decision-ready competitor intelligence without a YouTube API key.
Pricing
from $2.00 / 1,000 analyzed youtube videos
Rating
0.0
(0)
Developer
Daniel S.
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
๐บ YouTube Channel Competitor Intelligence & Content Gap Analyzer
Compare public YouTube channels, rank recent videos, reveal content whitespace, and monitor observable changes without a YouTube Data API key.
This self-contained Apify Actor turns public YouTube channel HTML, embedded JSON, video pages, caption tracks, and RSS feeds into decision-ready competitive intelligence for creators, content agencies, media teams, sponsorship teams, and brands.
What it delivers
- ๐ Competitor leaderboard with relative channel strength, publishing cadence, average views, view velocity, engagement proxy, formats, and topics.
- ๐ฌ Video performance table with title, URL, date, views, likes, comments, duration, keywords, topics, estimated views/day, and a 0-100 performance score.
- ๐ก Content gap analysis showing which topics perform for some competitors but are missing from others.
- ๐ Monitoring changes including new videos and observable view, like, comment, subscriber, and cadence deltas versus the previous run.
- ๐ Public transcripts when requested and exposed by YouTube, returned on a best-effort basis.
- ๐ JSON, CSV, Apify Dataset views, and a visual HTML report ready for spreadsheets, dashboards, Make, Zapier, n8n, webhooks, or custom APIs.
No paid data provider, YouTube API credential, browser cookie, or third-party Apify Actor is required.
Quick start
Use two to five comparable channels for the clearest content-gap analysis:
{"channelUrls": ["https://www.youtube.com/@veritasium","https://www.youtube.com/@mkbhd","https://www.youtube.com/@LinusTechTips"],"maxVideosPerChannel": 20,"lookbackDays": 90,"keywords": ["artificial intelligence","AI tools","robotics"],"includeVideoDetails": true,"includeTranscripts": false,"historyKey": "tech-creators-weekly","resetHistory": false,"proxyConfiguration": {"useApifyProxy": false}}
Start the same input weekly with the same historyKey to unlock change
monitoring. Set resetHistory to true once when you intentionally want a new
baseline.
Inputs
| Field | Required | Default | Purpose |
|---|---|---|---|
channelUrls | Yes | Example channels | One or more YouTube channel URLs, /channel/ IDs, or @handles |
maxVideosPerChannel | No | 20 | Maximum retained recent videos per channel |
lookbackDays | No | 90 | Exclude known dates older than this; 0 disables |
keywords | No | [] | Strategic topics used for coverage and gap analysis |
includeVideoDetails | No | true | Fetch public watch pages for richer metrics |
includeTranscripts | No | false | Try public caption tracks; unavailable transcripts stay null |
historyKey | No | default | Stable identity for a recurring competitor watchlist |
resetHistory | No | false | Delete the prior baseline before this run |
requestTimeoutSecs | No | 30 | Per-request timeout |
retryCount | No | 2 | Retries for transient failures and rate limits |
maxConcurrency | No | 4 | Concurrent video detail requests |
proxyConfiguration | No | Direct | Optional Apify or custom proxy configuration |
Fast versus detailed runs
Use includeVideoDetails: false for a quick channel/RSS scan. Likes, comments,
exact duration, metadata keywords, and captions will usually be unavailable.
Use includeVideoDetails: true for the commercial intelligence workflow. It
adds one public watch-page request per retained candidate video and enriches any
metrics YouTube exposes.
Transcripts are intentionally disabled by default because availability varies by channel, video, language, consent, geography, and rate limits.
Output structure
The default dataset contains four explicit rowType values:
rowType | Meaning | Charged PPE event |
|---|---|---|
channel | One intelligence summary for each successfully analyzed channel | channel-analysis |
video | One recent video with evidence and calculated metrics | video-analysis |
content_gap | Derived topic opportunity with supporting evidence | Included |
change | Difference from the previous successful history snapshot | Included |
Practical dataset views are provided:
- ๐ Competitor leaderboard
- ๐ฌ Video performance
- ๐ก Content opportunities
- ๐ Changes since previous run
- All structured data
Example video row
{"rowType": "video","status": "partial","channelTitle": "Example Science","videoId": "abc123","videoTitle": "Quantum AI Explained","videoUrl": "https://www.youtube.com/watch?v=abc123","publishedAt": "2026-07-20T10:00:00.000Z","views": 130000,"likes": 6500,"comments": 420,"durationSeconds": 754,"format": "standard","viewVelocityPerDay": 65000,"engagementProxyPercent": 5.3231,"performanceScore": 88,"matchedKeywords": ["artificial intelligence"],"detectedTopics": ["artificial intelligence", "quantum computing"],"transcript": null,"transcriptStatus": "not_requested","dataSources": ["channel_html", "rss", "video_html"],"dataLimitations": []}
Example content opportunity
{"rowType": "content_gap","status": "ok","opportunityScore": 78,"topic": "quantum computing","gapType": "cross_channel_whitespace","channelsUsingTopic": ["Example Science"],"channelsMissingTopic": ["Example Tech"],"supportingVideoCount": 3,"averageTopicViewVelocity": 22400,"supportingVideoUrls": ["https://www.youtube.com/watch?v=abc123"],"rationale": "3 supporting video(s) across 1/2 channel(s), 22400 average views/day; missing from 1 competitor channel(s)."}
These examples demonstrate structure only. They are not claims about live channels.
How the metrics work
View velocity
viewVelocityPerDay = public view count / time since publication
The minimum denominator is one hour to avoid unstable division immediately after publication. It is an estimate from public counters, not private YouTube Analytics.
Engagement proxy
engagementProxyPercent = (available likes + available comments) / views ร 100
The engagementSignalsAvailable array states which public signals were used.
If neither likes nor comments is exposed, the value is null.
Publishing cadence
Cadence uses the median interval between videos with known publish dates. This is more robust than dividing an incomplete initial-page sample by the full lookback window.
Performance score
The deterministic 0-100 score compares a video only with videos in the current run:
- 45 points: relative view velocity
- 25 points: relative views
- 20 points: relative public engagement proxy
- 10 points: freshness
Missing metrics contribute zero rather than fabricated values.
Opportunity score
The deterministic 0-100 content-gap score combines:
- observed topic view velocity,
- observable engagement,
- whitespace across compared channels,
- repeated evidence,
- freshness,
- an explicit boost for user-supplied strategic keywords.
A requested keyword with no observed supporting video is clearly labeled
requested_keyword_without_observed_coverage; its demand metrics stay null.
The score prioritizes research. It does not guarantee future performance.
History and monitoring
History is stored in the named key-value store
youtube-competitor-intelligence-history. The user-facing historyKey is
hashed into a stable record key, so multiple watchlists can coexist.
The compact snapshot stores only:
- channel identity and public subscriber count,
- cadence,
- retained video IDs, titles, URLs, dates, and public counters,
- capture timestamp.
When a video disappears from the recent sample, the Actor reports it as
noLongerInWindowCount. It does not claim the video was deleted.
Reliability and source policy
The Actor uses:
- public channel HTML and
ytInitialData, - the public YouTube channel RSS feed as fallback and date enrichment,
- public watch-page
ytInitialPlayerResponseandytInitialData, - a public caption-track URL when requested and exposed.
Requests have bounded timeouts, retries with backoff, rotating proxy URLs when configured, per-channel isolation, and source-specific status fields.
YouTube controls its public markup and may change or withhold fields. The Actor therefore follows these rules:
- unavailable data is
null, - source text is preserved where useful,
- every video lists
dataSourcesanddataLimitations, - one failed video detail never discards its channel/RSS metadata,
- one failed channel does not discard successful competitors,
- the run fails only when no channel yields usable public data.
Use this Actor only for lawful purposes and in accordance with applicable terms, privacy rules, and rate limits. Do not use it to collect private, restricted, or personal data.
Run locally
Node.js 20 or newer is required.
npm installexport APIFY_INPUT_KEY=INPUTnpm testnpm run smokenpm start
For a local Actor run, place input at
storage/key_value_stores/default/INPUT.json, or use the Apify CLI:
$npx --yes apify-cli run --purge --input-file examples/input-fast.json
Run the live smoke test against another public channel:
$YOUTUBE_CHANNEL=@mkbhd npm run smoke
Run on Apify
npx apify-cli loginnpx apify-cli push
Then:
- Open the Actor's Input tab.
- Add comparable channels.
- Start with 10-20 videos and no transcripts.
- Inspect the dataset and report.
- Save the input as a Task.
- Schedule it weekly with the same
historyKey. - Connect a webhook, Make, Zapier, or n8n to consume change rows.
See APIFY_PUBLISHING_CHECKLIST.md for the exact Store and monetization steps.
Pricing
The launch price uses pay-per-event billing:
apify-actor-start: $0.00005 once per runvideo-analysis: $0.002 per successfully exported videochannel-analysis: $0.02 per successfully exported channel
Content-gap rows, historical changes, JSON/CSV exports, and the HTML report are included. Two channels with ten videos each cost about $0.08005. Failed sources do not create channel or video charge events.
See PRICING.md for larger examples and margin guardrails.
Saved records
The default key-value store contains:
OUTPUT.json- complete structured intelligence outputOUTPUT.csv- flattened exportREPORT.json- report-ready structured dataREPORT.html- visual decision reportRUN_SUMMARY.json- counts, configuration, and source policyERRORS.json- isolated channel/source failuresSTATE_SNAPSHOT.json- compact state saved for the next run
Cost control
- Start with 10 videos per channel.
- Leave transcripts off unless they directly support the workflow.
- Use direct requests first; add Apify Proxy only when reliability requires it.
- Keep concurrency at four or lower for public YouTube pages.
- Increase the video limit only after confirming the channel exposes enough recent items.
See PRICING.md for the proposed PPE economics.
Development
npm testnpm run validatenpm run smoke
Fixtures cover channel HTML, RSS, video details, captions, input validation, scoring, content gaps, state snapshots, and change detection.
Known limitations
- Initial public HTML and RSS do not provide a guaranteed full channel archive.
- YouTube can hide subscriber, like, comment, view, duration, or date fields.
- Public counts can be rounded.
- Captions may be missing or blocked.
- Shorts detection is based on public URL/rendering and duration evidence.
- Private YouTube Analytics metrics such as impressions, click-through rate, watch time, retention, traffic source, and revenue are unavailable.
- Deleted/private videos cannot be reliably distinguished from videos that left the retained recent sample.