SFOLN

Catalogue / Social media data

YouTube Channel Analytics & Audit

sfoln/youtube-channel-audit · Social media, Lead generation, Automation On request

Audit any YouTube channel in one row: subscribers, total views and videos plus average and median views, uploads per week, views per subscriber, top videos, Shorts share and views trend over its latest ~30 videos. $15 per 1,000 channels; bigger samples $0.007 per page.

About

What it does

YouTube Channel Analytics & Audit gives a one-row audit of any YouTube channel: the channel profile (name, handle, subscribers, total videos and views, description, country, join date, external links) plus statistics computed over its latest videos: average and median views, average length, uploads per week, views per subscriber, the three most viewed recent videos, Shorts share, a recent-vs-previous views trend and the most frequent title keywords. Built for influencer vetting, sponsorship pricing, competitor benchmarking and agency reporting.

Price

Price per delivered record

EventPricePer 1,000Charged for
YouTube channel audit
youtube-channel-audit
$0.015$15 / 1,000Charged once per channel: channel profile plus stats, top videos, upload cadence, trend and title keywords over the latest ~30 videos.
Extra videos page
youtube-audit-extra-page
$0.007$7 / 1,000Charged per additional page of ~30 videos sampled when sampleSize is above 30 (e.g. 2 extra pages for 90 videos).
YouTube channel snapshot
youtube-channel-profile-only
$0.0065$6.5 / 1,000Charged instead of youtube-channel-audit when only the channel profile could be delivered (the channel has no public videos or the videos request failed).

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~youtube-channel-audit/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"channels":["https://www.youtube.com/@NASA"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/youtube-channel-audit"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~youtube-channel-audit/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Audit the YouTube channels @NASA and @SpaceX: compare subscribers, average views per video, upload frequency and their top recent videos.

Input

Input fields

List YouTube channels. Each channel produces one dataset record with its profile and statistics over its latest videos.

FieldTypeDefaultMeaning
channels *arrayrequiredChannels
Channel URLs (https://www.youtube.com/@handle, /channel/UC…, /c/…), @handles or channel ids (UC…), one per line. Duplicates are removed. Accounts on the Apify free plan can process up to 10 channels per run.
sampleSizeinteger30Videos to analyze
Latest videos sampled per channel (5–100). Up to 30 are included in the audit price; each further page of ~30 videos is charged as youtube-audit-extra-page. Range 5–100.
includeVideosbooleanfalseInclude sampled videos
Add the sampled videos (id, title, views, duration, publish date) to each record.
maxItemsinteger500Max channels
Safety cap on how many channels are processed in this run. Range 1–5000.
concurrencyinteger3Concurrency
Channels processed in parallel (1–5). Range 1–5.
itemTimeoutSecsinteger300Per-channel timeout (seconds)
Time limit per channel; video paging stops early when it is near. Range 60–1800.
includeRawbooleanfalseInclude raw upstream response
Attach the unmodified channel and video payloads under `raw` (larger output).
Example input
{
  "channels": [
    "https://www.youtube.com/@NASA"
  ]
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The input item this record corresponds to.
statusstringStatus
ok (auditType full or profile-only, charged) | not_found (unknown channel, not charged) | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
chargedbooleanCharged
Whether this record incurred a pay-per-event charge.
chargedEventstringCharged event
Pay-per-event event charged for this record.
sourcestringSource
Upstream data source (scrapecreators = ScrapeCreators, public YouTube data).
fetchedAtstringFetched at
ISO timestamp.
errorobjectError
code / message when status is not ok (or a partial failure).
warningsarrayWarnings
Non-fatal notes (partial data, stopped early, free-plan caps).
foundboolean | nullFound
Channel exists.
auditTypestring | nullAudit type
full (profile + video stats) or profile-only (no videos could be sampled).
channelIdstring | nullChannel id
UC… channel id.
handlestring | nullHandle
@handle without @.
namestring | nullName
Channel name.
channelUrlstring | nullChannel URL
Channel page URL.
descriptionstring | nullDescription
Channel description.
subscribersinteger | nullSubscribers
Subscriber count (YouTube rounds it, e.g. 13.2M).
totalVideosinteger | nullTotal videos
Videos on the channel.
totalViewsinteger | nullTotal views
Lifetime channel views.
countrystring | nullCountry
Country shown on the channel's about page.
joinedAtstring | nullJoined
Channel creation date (ISO).
linksarrayLinks
External links from the channel header / about page.
avatarUrlstring | nullAvatar
Largest avatar image URL.
isVerifiedboolean | nullVerified
Verified badge, when reported.
keywordsarrayChannel keywords
Channel tags set by the owner.
sampleSizeRequestedinteger | nullSample size requested
Effective sampleSize (30 on the free plan).
videosAnalyzedinteger | nullVideos analyzed
Latest videos in the sample.
avgViewsinteger | nullAvg views
Mean views per sampled video (videos without a view count excluded).
medianViewsnumber | nullMedian views
Median views per sampled video.
avgDurationSecsinteger | nullAvg duration (s)
Mean length of sampled videos.
uploadsPerWeeknumber | nullUploads per week
Sampled uploads ÷ weeks from the oldest sampled upload to fetch time.
sampleWindowDaysnumber | nullSample window (days)
Days from the oldest sampled upload to fetch time.
viewsPerSubscriberPctnumber | nullViews / subscriber %
avgViews ÷ subscribers × 100.
topVideosarrayTop videos
Up to 3 most viewed sampled videos { videoId, url, title, views, publishedAt, durationSecs }.
shortsSharePctnumber | nullShorts share %
Share of sampled items typed short or ≤ 60 s.
trendWindowinteger | nullTrend window
k in 'newest k vs previous k' (min(10, half the sample)).
recentAvgViewsinteger | nullRecent avg views
Mean views of the newest k videos.
previousAvgViewsinteger | nullPrevious avg views
Mean views of the k videos before them.
trendChangePctnumber | nullTrend change %
(recent − previous) ÷ previous × 100. Newer videos have had less time to collect views.
newestVideoAtstring | nullNewest video
ISO (approximate).
oldestVideoAtstring | nullOldest sampled video
ISO (approximate).
titleKeywordsarrayTitle keywords
Up to 15 { keyword, count }: titles containing the word (stop words removed).
titleBigramsarrayTitle phrases
Up to 10 { phrase, count } two-word phrases.
pagesFetchedinteger | nullPages fetched
Video listing pages fetched.
extraPagesChargedinteger | nullExtra pages charged
Pages charged as youtube-audit-extra-page.
sampleStopReasonstring | nullSample stop reason
limit | end | budget | deadline | aborted | empty_pages | max_pages | error.
videosarraySampled videos
Only with includeVideos: { videoId, url, title, publishedAt, durationSecs, viewCount, … }.
Example record
{
  "input": "https://www.youtube.com/@NASA",
  "found": true,
  "auditType": "full",
  "channelId": "UCLA_DiR1FfKNvjuUpBHmylQ",
  "handle": "NASA",
  "name": "NASA",
  "channelUrl": "https://www.youtube.com/@NASA",
  "description": "Explore the universe and discover our home planet…",
  "subscribers": 13200000,
  "totalVideos": 9123,
  "totalViews": 1234567890,
  "country": "United States",
  "joinedAt": "2006-01-19T00:00:00.000Z",
  "links": [
    "https://www.nasa.gov/",
    "https://x.com/NASA"
  ],
  "sampleSizeRequested": 30,
  "videosAnalyzed": 30,
  "avgViews": 84211,
  "medianViews": 41250,
  "avgDurationSecs": 1312,
  "uploadsPerWeek": 4.2,
  "sampleWindowDays": 50,
  "viewsPerSubscriberPct": 0.638,
  "topVideos": [
    {
      "videoId": "abc123def45",
      "url": "https://www.youtube.com/watch?v=abc123def45",
      "title": "Artemis II Launch",
      "views": 910000,
      "publishedAt": "2026-09-30T00:00:00.000Z",
      "durationSecs": 7260
    }
  ],
  "shortsSharePct": 6.7,
  "trendWindow": 10,
  "recentAvgViews": 52000,
  "previousAvgViews": 61000,
  "trendChangePct": -14.8,
  "newestVideoAt": "2026-10-13T00:00:00.000Z",
  "oldestVideoAt": "2026-08-25T00:00:00.000Z",
  "titleKeywords": [
    {
      "keyword": "artemis",
      "count": 7
    },
    {
      "keyword": "space",
      "count": 5
    }
  ],
  "titleBigrams": [
    {
      "phrase": "space station",
      "count": 4
    }
  ],
  "pagesFetched": 1,
  "extraPagesCharged": 0,
  "sampleStopReason": "limit",
  "status": "ok",
  "charged": true,
  "chargedEvent": "youtube-channel-audit",
  "source": "scrapecreators",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents