# YouTube Channel Analytics & Audit (`sfoln/youtube-channel-audit`)

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.

- Family: Social media data
- Categories: Social media, Lead generation, Automation
- Availability: on request (private on Apify). Email contact@sfoln.com with subject "Access request: YouTube Channel Analytics & Audit (sfoln/youtube-channel-audit)" before calling; calls fail until it is public.
- JSON: https://www.sfoln.com/actors/youtube-channel-audit.json
- MCP: https://mcp.apify.com?tools=sfoln/youtube-channel-audit
- REST (sync): POST https://api.apify.com/v2/actors/sfoln~youtube-channel-audit/run-sync-get-dataset-items
- REST (async): POST https://api.apify.com/v2/actors/sfoln~youtube-channel-audit/runs

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 per delivered record

| Event | Price | Per 1,000 | Charged for |
| --- | --- | --- | --- |
| YouTube channel audit (`youtube-channel-audit`) | $0.015 | $15 / 1,000 | Charged 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,000 | Charged 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,000 | Charged instead of youtube-channel-audit when only the channel profile could be delivered (the channel has no public videos or the videos request failed). |

Pay-per-event, USD, billed by Apify; no platform usage charge. Only records with status `ok` are charged. Cap a run with `maxTotalChargeUsd`. Apify free plan: up to 10 per run.

## Run

```bash
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 client configuration:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/youtube-channel-audit"
    }
  }
}
```

Example prompt: Audit the YouTube channels @NASA and @SpaceX: compare subscribers, average views per video, upload frequency and their top recent videos.

## Input

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

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `channels` (required) | array | — | Channels: 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. |
| `sampleSize` | integer | `30` | Videos 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. |
| `includeVideos` | boolean | `false` | Include sampled videos: Add the sampled videos (id, title, views, duration, publish date) to each record. |
| `maxItems` | integer | `500` | Max channels: Safety cap on how many channels are processed in this run. |
| `concurrency` | integer | `3` | Concurrency: Channels processed in parallel (1–5). |
| `itemTimeoutSecs` | integer | `300` | Per-channel timeout (seconds): Time limit per channel; video paging stops early when it is near. |
| `includeRaw` | boolean | `false` | Include raw upstream response: Attach the unmodified channel and video payloads under `raw` (larger output). |

Example input:

```json
{
  "channels": [
    "https://www.youtube.com/@NASA"
  ]
}
```

## Output

One record per input item with `status` (`ok` is charged; `not_found`, `error`, `skipped_*` are free) and `charged`. The run stores an `OUTPUT` summary record.

| Field | Type | Meaning |
| --- | --- | --- |
| `input` | string | object | Input: The input item this record corresponds to. |
| `status` | string | Status: ok (auditType full or profile-only, charged) \| not_found (unknown channel, not charged) \| error \| skipped_invalid \| skipped_budget \| skipped_free_plan |
| `charged` | boolean | Charged: Whether this record incurred a pay-per-event charge. |
| `chargedEvent` | string | Charged event: Pay-per-event event charged for this record. |
| `source` | string | Source: Upstream data source (scrapecreators = ScrapeCreators, public YouTube data). |
| `fetchedAt` | string | Fetched at: ISO timestamp. |
| `error` | object | Error: code / message when status is not ok (or a partial failure). |
| `warnings` | array | Warnings: Non-fatal notes (partial data, stopped early, free-plan caps). |
| `found` | boolean | null | Found: Channel exists. |
| `auditType` | string | null | Audit type: full (profile + video stats) or profile-only (no videos could be sampled). |
| `channelId` | string | null | Channel id: UC… channel id. |
| `handle` | string | null | Handle: @handle without @. |
| `name` | string | null | Name: Channel name. |
| `channelUrl` | string | null | Channel URL: Channel page URL. |
| `description` | string | null | Description: Channel description. |
| `subscribers` | integer | null | Subscribers: Subscriber count (YouTube rounds it, e.g. 13.2M). |
| `totalVideos` | integer | null | Total videos: Videos on the channel. |
| `totalViews` | integer | null | Total views: Lifetime channel views. |
| `country` | string | null | Country: Country shown on the channel's about page. |
| `joinedAt` | string | null | Joined: Channel creation date (ISO). |
| `links` | array | Links: External links from the channel header / about page. |
| `avatarUrl` | string | null | Avatar: Largest avatar image URL. |
| `isVerified` | boolean | null | Verified: Verified badge, when reported. |
| `keywords` | array | Channel keywords: Channel tags set by the owner. |
| `sampleSizeRequested` | integer | null | Sample size requested: Effective sampleSize (30 on the free plan). |
| `videosAnalyzed` | integer | null | Videos analyzed: Latest videos in the sample. |
| `avgViews` | integer | null | Avg views: Mean views per sampled video (videos without a view count excluded). |
| `medianViews` | number | null | Median views: Median views per sampled video. |
| `avgDurationSecs` | integer | null | Avg duration (s): Mean length of sampled videos. |
| `uploadsPerWeek` | number | null | Uploads per week: Sampled uploads ÷ weeks from the oldest sampled upload to fetch time. |
| `sampleWindowDays` | number | null | Sample window (days): Days from the oldest sampled upload to fetch time. |
| `viewsPerSubscriberPct` | number | null | Views / subscriber %: avgViews ÷ subscribers × 100. |
| `topVideos` | array | Top videos: Up to 3 most viewed sampled videos { videoId, url, title, views, publishedAt, durationSecs }. |
| `shortsSharePct` | number | null | Shorts share %: Share of sampled items typed short or ≤ 60 s. |
| `trendWindow` | integer | null | Trend window: k in 'newest k vs previous k' (min(10, half the sample)). |
| `recentAvgViews` | integer | null | Recent avg views: Mean views of the newest k videos. |
| `previousAvgViews` | integer | null | Previous avg views: Mean views of the k videos before them. |
| `trendChangePct` | number | null | Trend change %: (recent − previous) ÷ previous × 100. Newer videos have had less time to collect views. |
| `newestVideoAt` | string | null | Newest video: ISO (approximate). |
| `oldestVideoAt` | string | null | Oldest sampled video: ISO (approximate). |
| `titleKeywords` | array | Title keywords: Up to 15 { keyword, count }: titles containing the word (stop words removed). |
| `titleBigrams` | array | Title phrases: Up to 10 { phrase, count } two-word phrases. |
| `pagesFetched` | integer | null | Pages fetched: Video listing pages fetched. |
| `extraPagesCharged` | integer | null | Extra pages charged: Pages charged as youtube-audit-extra-page. |
| `sampleStopReason` | string | null | Sample stop reason: limit \| end \| budget \| deadline \| aborted \| empty_pages \| max_pages \| error. |
| `videos` | array | Sampled videos: Only with includeVideos: { videoId, url, title, publishedAt, durationSecs, viewCount, … }. |

Example record:

```json
{
  "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"
}
```

## Related

- [YouTube Channel Videos Scraper](https://www.sfoln.com/actors/youtube-channel-videos.md) (`sfoln/youtube-channel-videos`)
- [YouTube Video Details Scraper](https://www.sfoln.com/actors/youtube-video-lookup.md) (`sfoln/youtube-video-lookup`)
- [TikTok Engagement Rate & Audit](https://www.sfoln.com/actors/tiktok-account-audit.md) (`sfoln/tiktok-account-audit`)
- [Instagram Engagement Rate & Audit](https://www.sfoln.com/actors/instagram-account-audit.md) (`sfoln/instagram-account-audit`)
- [Twitter (X) Account Audit – Engagement](https://www.sfoln.com/actors/x-account-overview.md) (`sfoln/x-account-overview`)

Publisher: SFOLN LLC, contact@sfoln.com. Catalogue: https://www.sfoln.com/catalog.json. Agent guide: https://www.sfoln.com/agents.md.
