scraping-youtube-videos-by-keyword
About scraping-youtube-videos-by-keyword
A skill for collecting YouTube video metadata from keyword searches, channels, URLs, or trending results. It is intended for research and analysis workflows that need video and channel details, including engagement metrics.
Key features
- 01Search by keywords, channels, or URLs
- 02Retrieve trending videos
- 03Filter by date, duration, and features
- 04Collect video and channel metrics
- 05Transform output with a custom function
Use cases
- 01Build a video dataset for a search topic
- 02Compare engagement across videos
- 03Collect videos from selected channels
MCP support
Can run the Apify actor through the Apify MCP server when available.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ apidojo-io/ apidojo-skills --skill scraping-youtube-videos-by-keywordAfter installing, type/scraping-youtube-videos-by-keywordin Claude Code to confirm it loaded.
Details
From the project READMEScraping YouTube Videos by Keyword
Raw YouTube video dataset for any search query. Returns video-level metadata including engagement metrics and channel info.
Prerequisites
APIFY_TOKENenvironment 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):
# 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_TOKENmust be set in environment or.envfile.
If Apify MCP is available:
Tool: apify:run-actor
Actor: "apidojo~youtube-scraper"
Input:
{
"searchKeywords": "<query>",
"maxResults": 50,
"sortBy": "relevance"
}
REST API fallback:
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:
curl "https://api.apify.com/v2/actor-runs/$RUN_ID?token=$APIFY_TOKEN" | grep '"status"'
Fetch results:
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.