Catalogskills.sh · apidojo-io

scraping-youtube-channel-data

Scrapes YouTube channel statistics and video catalog for any list of channels using apidojo's YouTube scraper on Apify. Triggers when the user asks to: get YouTube channel stats, fetch subscriber count and video count for YouTube channels, scrape channel metadata in bulk, export YouTube channel information by URL or handle, get all videos from a YouTube channel, or check channel growth data for a list of creators. Returns channel name, subscriber count, total views, video count, and recent video data. Ideal for competitor analysis, creator research, and audience benchmarking.

Review advisedVerified hub738 installs

Savant verdict: Review advised

Security analysis or source-hub review identified patterns requiring attention.

Live evaluation

Not evaluated yet. Workspaces can request a live evaluation.

Security assessment

Risk score
13/100
Recommendation
CAUTION
Severity
LOW
Savant decision
Passed (low risk)
The assessment recommended caution, but its risk score is below 20/100, so Savant's policy passes it. Its findings are still listed for review. Static security analysis completed.

5 patterns found

  • Data Exfiltration: curl -X POST \ "https://api.apify.com/v2/acts/apidojo~youtube-channel-scraper/runs?token=%2A%2A%2A" \ -H "Content-Type: application/json" \ -dmedium · SKILL.md:91 · Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
  • Data Exfiltration: https://api.apify.com/medium · SKILL.md:92 · Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
  • Data Exfiltration: https://api.apify.com/medium · SKILL.md:99 · Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
  • Data Exfiltration: https://api.apify.com/medium · SKILL.md:104 · Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
  • Trigger Abuse: Overly Broad Triggerlow · SKILL.md:1 · Overly Broad Trigger: description clause 'Triggers when the user asks to' activates on 'to', which is too short and may match unintended inputs

Structure

  • 1 referenced file isn't in the packagescripts/run_actor.js. They may be binary, too large to catalog, or missing upstream.
  • The source hub's security checks flagged this skillSocket: warn (1 alert: gptSecurity); Snyk: warn (Risk: MEDIUM · 1 issue)

SKILL.md

---
name: scraping-youtube-channel-data
description: >
  Scrapes YouTube channel statistics and video catalog for any list of channels using
  apidojo's YouTube scraper on Apify. Triggers when the user asks to: get YouTube channel
  stats, fetch subscriber count and video count for YouTube channels, scrape channel
  metadata in bulk, export YouTube channel information by URL or handle, get all videos
  from a YouTube channel, or check channel growth data for a list of creators.
  Returns channel name, subscriber count, total views, video count, and recent video data.
  Ideal for competitor analysis, creator research, and audience benchmarking.
license: Apache-2.0
metadata:
  author: apidojo
  version: "1.0"
  apify-actor: apidojo/youtube-scraper
---

# Scraping YouTube Channel Data

Exports channel-level statistics and optional video catalog for any YouTube channel URL or handle.

## Prerequisites

- `APIFY_TOKEN` environment variable set
- Optional: Apify MCP server installed

## Inputs

| Parameter | Type | Required | Default | Notes |
|-----------|------|----------|---------|-------|
| `startUrls` | array | Optional | `[]` | YouTube URLs — channels, playlists, Shorts, search results |
| `youtubeHandles` | array | Optional | `[]` | YouTube channel handles (e.g. `@kurzgesagt`) |
| `getTrending` | boolean | Optional | `false` | Retrieve trending videos |
| `keywords` | array | Optional | `[]` | Search keywords |
| `gl` | string | Optional | `us` | Country code for results (e.g. `US`, `GB`) |
| `hl` | string | Optional | `en` | Language code (e.g. `en`, `de`) |
| `uploadDate` | string | Optional | `all` | Upload date filter: `any`, `hour`, `today`, `week`, `month`, `year` |
| `duration` | string | Optional | `all` | Duration filter: `any`, `short`, `long` |
| `features` | string | Optional | `all` | Feature filter: `4k`, `hd`, `live`, `cc`, `3d`, `hdr`, etc. |
| `sort` | string | Optional | `r` | Sort order for search results |
| `maxItems` | number | Optional | Unlimited | Maximum videos to return |
| `customMapFunction` | string | Optional | — | JavaScript function to transform each output object |

## Workflow

```
Progress:
- [ ] Step 1: Normalize channel URLs
- [ ] Step 2: Run youtube-scraper
- [ ] Step 3: Poll for SUCCEEDED
- [ ] Step 4: Deliver channel dataset
```

### Step 2: Run the Actor


**Recommended — run_actor.js (handles waiting, output, and file saving automatically):**
```bash
# Quick answer (prints table to chat)
node scripts/run_actor.js \
  --actor "apidojo~youtube-channel-scraper" \
  --input '{"param": "value"}'

# Save as CSV
node scripts/run_actor.js \
  --actor "apidojo~youtube-channel-scraper" \
  --input '{"param": "value"}' \
  --output YYYY-MM-DD_results.csv --format csv

# Save as JSON
node scripts/run_actor.js \
  --actor "apidojo~youtube-channel-scraper" \
  --input '{"param": "value"}' \
  --output YYYY-MM-DD_results.json --format json
```
> `APIFY_TOKEN` must be set in environment or `.env` file.

**If Apify MCP is available:**
```
Tool: apify:run-actor
Actor: "apidojo~youtube-channel-scraper"
Input:
{
  "channelUrls": ["https://www.youtube.com/@channelhandle"],
  "maxVideos": 30
}
```

**REST API fallback:**
```bash
curl -X POST \
  "https://api.apify.com/v2/acts/apidojo~youtube-channel-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"channelUrls": ["https://www.youtube.com/@channelhandle"], "maxVideos": 30}'
```

Save `id` as `RUN_ID`. Poll until `status = SUCCEEDED`:
```bash
curl "https://api.apify.com/v2/actor-runs/$RUN_ID?token=$APIFY_TOKEN" | grep '"status"'
```

Fetch results:
```bash
curl "https://api.apify.com/v2/actor-runs/$RUN_ID/dataset/items?token=$APIFY_TOKEN&format=json"
```

### Step 3: Handle Edge Cases

- **Channel URL not found**: Handle may have changed — verify on YouTube.
- **Hidden subscriber count**: Some channels hide subscriber counts; field returns null — flag these.
- **Age-restricted channel**: May return limited metadata.

## Output Format

```
# YouTube Channel Dataset
Channels requested: N | Returned: N

| Channel | Subscribers | Total Views | Videos | Joined | Country | Recent Avg Views |
|---------|-------------|-------------|--------|--------|---------|-----------------|
| ...     | ...         | ...         | ...    | ...    | ...     | ...             |

Available fields: channelName, channelId, subscriberCount, viewCount, videoCount,
country, joinedDate, description, channelUrl, recentVideos[]
```

## Troubleshooting

**Hidden subscriber count:** YouTube allows channels to hide this — return `null` and note in output.
**Large video catalogs:** Set `maxVideos: 100` max per run to avoid timeouts.