YouTube Competitor Intelligence & Content Gap Analyzer avatar

YouTube Competitor Intelligence & Content Gap Analyzer

Pricing

from $2.00 / 1,000 analyzed youtube videos

Go to Apify Store
YouTube Competitor Intelligence & Content Gap Analyzer

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.

Daniel S.

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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

FieldRequiredDefaultPurpose
channelUrlsYesExample channelsOne or more YouTube channel URLs, /channel/ IDs, or @handles
maxVideosPerChannelNo20Maximum retained recent videos per channel
lookbackDaysNo90Exclude known dates older than this; 0 disables
keywordsNo[]Strategic topics used for coverage and gap analysis
includeVideoDetailsNotrueFetch public watch pages for richer metrics
includeTranscriptsNofalseTry public caption tracks; unavailable transcripts stay null
historyKeyNodefaultStable identity for a recurring competitor watchlist
resetHistoryNofalseDelete the prior baseline before this run
requestTimeoutSecsNo30Per-request timeout
retryCountNo2Retries for transient failures and rate limits
maxConcurrencyNo4Concurrent video detail requests
proxyConfigurationNoDirectOptional 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:

rowTypeMeaningCharged PPE event
channelOne intelligence summary for each successfully analyzed channelchannel-analysis
videoOne recent video with evidence and calculated metricsvideo-analysis
content_gapDerived topic opportunity with supporting evidenceIncluded
changeDifference from the previous successful history snapshotIncluded

Practical dataset views are provided:

  1. ๐Ÿ† Competitor leaderboard
  2. ๐ŸŽฌ Video performance
  3. ๐Ÿ’ก Content opportunities
  4. ๐Ÿ“ˆ Changes since previous run
  5. 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:

  1. public channel HTML and ytInitialData,
  2. the public YouTube channel RSS feed as fallback and date enrichment,
  3. public watch-page ytInitialPlayerResponse and ytInitialData,
  4. 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 dataSources and dataLimitations,
  • 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 install
export APIFY_INPUT_KEY=INPUT
npm test
npm run smoke
npm 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 login
npx apify-cli push

Then:

  1. Open the Actor's Input tab.
  2. Add comparable channels.
  3. Start with 10-20 videos and no transcripts.
  4. Inspect the dataset and report.
  5. Save the input as a Task.
  6. Schedule it weekly with the same historyKey.
  7. 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 run
  • video-analysis: $0.002 per successfully exported video
  • channel-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 output
  • OUTPUT.csv - flattened export
  • REPORT.json - report-ready structured data
  • REPORT.html - visual decision report
  • RUN_SUMMARY.json - counts, configuration, and source policy
  • ERRORS.json - isolated channel/source failures
  • STATE_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 test
npm run validate
npm 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.