scraping-youtube-videos-by-keyword — Claude Code skill
Extracts YouTube video metadata and engagement stats matching search terms via Apify. Built for research, competitor tracking, and query analysis.
npx skills add apidojo-io/apidojo-skills --skill scraping-youtube-videos-by-keyword -a claude-codeWhat scraping-youtube-videos-by-keyword does
This skill queries YouTube based on search keywords, URLs, or channel handles like @kurzgesagt using Apify's apidojo/youtube-scraper actor. Returned records include the video title, channel name, view count, like count, comment count, duration, and publication date. Built-in filters allow narrowing down by country code (gl), language (hl), duration, and upload date.
Execution runs through a helper script scripts/run_actor.js, the Apify MCP tool apify:run-actor, or direct REST API calls. The Node.js script prints formatted tables directly to your terminal or dumps results to CSV and JSON files.
Without an APIFY_TOKEN environment variable set, runs fail immediately. Extremely narrow queries may return fewer than 20 results, and age-restricted videos often omit the view count field.
What it helps with
- collect view and like metrics for a YouTube search query
- scrape video uploads from specific channel handles
- filter search results by upload date, duration, and country
- export YouTube video metadata to CSV or JSON files
Example prompts for the agent
- Scrape the top 50 YouTube videos for query 'llm evaluation' and save to CSV
- Fetch recent long-form uploads from channel handle
@kurzgesagt - Search YouTube for 4k videos on 'home gym setup' published this month
How to install scraping-youtube-videos-by-keyword
1Skills CLI (Vercel)
npx skills add apidojo-io/apidojo-skills --skill scraping-youtube-videos-by-keyword -a claude-code2Manually: put the files in place
~/.claude/skills/scraping-youtube-videos-by-keyword/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/scraping-youtube-videos-by-keyword/
1Skills CLI (Vercel)
npx skills add apidojo-io/apidojo-skills --skill scraping-youtube-videos-by-keyword -a codex2Manually: put the files in place
.agents/skills/scraping-youtube-videos-by-keyword/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add apidojo-io/apidojo-skills --skill scraping-youtube-videos-by-keyword -a cursor2Manually: put the files in place
.cursor/skills/scraping-youtube-videos-by-keyword/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install apidojo-io/apidojo-skills scraping-youtube-videos-by-keyword2Manually: put the files in place
.github/skills/scraping-youtube-videos-by-keyword/SKILL.md1Skills CLI (Vercel)
npx skills add apidojo-io/apidojo-skills --skill scraping-youtube-videos-by-keyword -a gemini-cli2Platform CLI
gemini skills install https://github.com/apidojo-io/apidojo-skills --path skills/primitives/scraping-youtube-videos-by-keywordManually: put the files in place
.devin/skills/scraping-youtube-videos-by-keyword/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add apidojo-io/apidojo-skills --skill scraping-youtube-videos-by-keyword -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about scraping-youtube-videos-by-keyword
How do I install scraping-youtube-videos-by-keyword in Claude Code?
Run npx skills add apidojo-io/apidojo-skills --skill scraping-youtube-videos-by-keyword -a claude-code. The definition will be saved to ~/.claude/skills/scraping-youtube-videos-by-keyword/SKILL.md.
What is required before running this skill?
You need an active Apify account with the APIFY_TOKEN environment variable exported. You can run it via Node.js using scripts/run_actor.js or through an installed Apify MCP server.
Which data fields does the scraper return?
It outputs videoId, title, channelName, channelId, viewCount, likeCount, commentCount, duration, publishedAt, videoUrl, thumbnailUrl, and description.
Source text
SKILL.md · Apache-2.0
---
name: scraping-youtube-videos-by-keyword
description: >
Scrapes YouTube videos matching any keyword or search query using apidojo's YouTube
scraper on Apify. Triggers when the user asks to: get YouTube videos for a keyword,
scrape YouTube search results for a topic, export YouTube video data for a query,
fetch video metadata for a YouTube search term, collect YouTube videos about a subject,
or download YouTube video stats by keyword. Returns video title, channel name, view
count, like count, comment count, duration, and publish date per video.
Ideal for content researchers, SEO analysts, and market intelligence teams.
license: Apache-2.0
metadata:
author: apidojo
version: "1.0"
apify-actor: apidojo/youtube-scraper
---
# Scraping YouTube Videos by Keyword
Raw YouTube video dataset for any search query. Returns video-level metadata including engagement metrics and channel info.
## 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: Build search query
- [ ] Step 2: Run youtube-scraper
- [ ] Step 3: Poll for SUCCEEDED
- [ ] Step 4: Deliver video 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-scraper" \
--input '{"param": "value"}'
# Save as CSV
node scripts/run_actor.js \
--actor "apidojo~youtube-scraper" \
--input '{"param": "value"}' \
--output YYYY-MM-DD_results.csv --format csv
# Save as JSON
node scripts/run_actor.js \
--actor "apidojo~youtube-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-scraper"
Input:
{
"searchKeywords": "<query>",
"maxResults": 50,
"sortBy": "relevance"
}
```
**REST API fallback:**
```bash
curl -X POST \
"https://api.apify.com/v2/acts/apidojo~youtube-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchKeywords": "<query>", "maxResults": 50}'
```
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
- **< 20 results**: Query may be too narrow; broaden search term.
- **Age-restricted content in results**: These may have limited metadata — flag rows with missing `viewCount`.
- **Duplicate video IDs**: Deduplicate by `videoId`.
## Output Format
```
# YouTube Video Dataset: "<query>"
Videos collected: N | Sort: <sortBy>
| Video ID | Title | Channel | Views | Likes | Comments | Duration | Published |
|----------|-------|---------|-------|-------|----------|----------|-----------|
| ... | ... | ... | ... | ... | ... | ... | ... |
Available fields: videoId, title, channelName, channelId, viewCount, likeCount,
commentCount, duration, publishedAt, videoUrl, thumbnailUrl, description
```
## Troubleshooting
**Fewer results than requested:** YouTube search may have limited results for niche queries.
**Missing like counts:** YouTube hides dislikes but likes are still available; some videos hide all counts.
© apidojo · Apache-2.0 · apidojo-io/apidojo-skills