scraping-tweets-by-keyword — Claude Code skill: how to install
Gathers tweets matching keywords, phrases, or hashtags via Apify. Delivers structured datasets with engagement metrics and author details.
npx skills add apidojo-io/apidojo-skills --skill scraping-tweets-by-keyword -a claude-codeWhat scraping-tweets-by-keyword does
The skill manages queries against Twitter search using the apidojo/tweet-scraper Apify actor. It pulls 15 fields per record, capturing tweet text, author handles, like and retweet counters, timestamps, and direct URLs.
Execution works through scripts/run_actor.js saving to CSV or JSON, or via the apify:run-actor tool when using the Apify MCP server. Available parameters handle language codes, user verification, coordinate bounds, and minimum reply counts.
Without an APIFY_TOKEN environment variable set, runs fail immediately. Large extractions need a ceiling of maxItems: 500 per run to avoid network timeouts.
What it helps with
- export Twitter search results to CSV or JSON files
- filter posts by engagement counts, author, or language
- track mentions and hashtags with boolean search syntax
- fetch geotagged tweets within a defined radius
Example prompts for the agent
- Fetch the latest 100 tweets containing #AI in English and export to CSV
- Pull all tweets from @NASA posted this month with at least 50 retweets
- Search for tweets mentioning machine learning from verified accounts
How to install scraping-tweets-by-keyword
1Skills CLI (Vercel)
npx skills add apidojo-io/apidojo-skills --skill scraping-tweets-by-keyword -a claude-code2Manually: put the files in place
~/.claude/skills/scraping-tweets-by-keyword/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/scraping-tweets-by-keyword/
1Skills CLI (Vercel)
npx skills add apidojo-io/apidojo-skills --skill scraping-tweets-by-keyword -a codex2Manually: put the files in place
.agents/skills/scraping-tweets-by-keyword/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add apidojo-io/apidojo-skills --skill scraping-tweets-by-keyword -a cursor2Manually: put the files in place
.cursor/skills/scraping-tweets-by-keyword/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install apidojo-io/apidojo-skills scraping-tweets-by-keyword2Manually: put the files in place
.github/skills/scraping-tweets-by-keyword/SKILL.md1Skills CLI (Vercel)
npx skills add apidojo-io/apidojo-skills --skill scraping-tweets-by-keyword -a gemini-cli2Platform CLI
gemini skills install https://github.com/apidojo-io/apidojo-skills --path skills/primitives/scraping-tweets-by-keywordManually: put the files in place
.devin/skills/scraping-tweets-by-keyword/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add apidojo-io/apidojo-skills --skill scraping-tweets-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-tweets-by-keyword
How do I install scraping-tweets-by-keyword in Claude Code?
Run npx skills add apidojo-io/apidojo-skills --skill scraping-tweets-by-keyword -a claude-code. The file will be placed in ~/.claude/skills/scraping-tweets-by-keyword/SKILL.md.
What does scraping-tweets-by-keyword do?
It triggers the Apify apidojo/tweet-scraper actor to collect search matches and returns tweet records with complete engagement statistics.
What credentials are required?
You need an Apify API token configured as the APIFY_TOKEN environment variable or inside your local .env file.
Source text
SKILL.md · Apache-2.0
---
name: scraping-tweets-by-keyword
description: >
Scrapes tweets matching any keyword, hashtag, phrase, or boolean query using apidojo's
Twitter Search scraper on Apify. Triggers when the user asks to: scrape tweets about
a topic, fetch tweets containing a keyword or hashtag, export Twitter search results to
a dataset, get all tweets mentioning a phrase, pull recent tweets for a search term,
or collect tweet data for analysis or research. Returns tweet text, author, likes,
retweets, replies, timestamp, and tweet URL per result.
Ideal for researchers, data analysts, journalists, and social listening teams.
license: Apache-2.0
metadata:
author: apidojo
version: "1.0"
apify-actor: apidojo/tweet-scraper
---
# Scraping Tweets by Keyword
Raw tweet collection for any keyword, hashtag, or boolean search query. No assumed use case — returns the full tweet dataset for downstream analysis.
## Prerequisites
- `APIFY_TOKEN` environment variable set
- Optional: Apify MCP server installed
## Inputs
| Parameter | Type | Required | Default | Notes |
|-----------|------|----------|---------|-------|
| `searchTerms` | array | ✅ | `[]` | Twitter advanced search queries (e.g. `["#AI lang:en", "from:NASA"]`) |
| `sort` | string | Optional | `Top` | Sort order: `Latest`, `Top`, or `Latest+Top` |
| `tweetLanguage` | string | Optional | — | ISO 639-1 language code (e.g. `en`) |
| `maxItems` | number | Optional | Unlimited | Maximum tweets to return |
| `onlyVerifiedUsers` | boolean | Optional | `false` | Only tweets from verified users |
| `onlyTwitterBlue` | boolean | Optional | `false` | Only Twitter Blue subscribers |
| `onlyImage` | boolean | Optional | `false` | Only tweets with images |
| `onlyVideo` | boolean | Optional | `false` | Only tweets with videos |
| `onlyQuote` | boolean | Optional | `false` | Only quote tweets |
| `author` | string | Optional | — | Filter to a specific author handle |
| `inReplyTo` | string | Optional | — | Tweets replying to a specific handle |
| `mentioning` | string | Optional | — | Tweets mentioning a specific handle |
| `geotaggedNear` | string | Optional | — | Tweets near a location |
| `withinRadius` | string | Optional | — | Radius around geotaggedNear |
| `geocode` | string | Optional | — | Lat/lng + radius string |
| `placeObjectId` | string | Optional | — | Tweets tagged with a place |
| `minimumRetweets` | number | Optional | — | Minimum retweet count |
| `minimumFavorites` | number | Optional | — | Minimum like count |
| `minimumReplies` | number | Optional | — | Minimum reply count |
| `start` | string | Optional | — | Tweets after this date (YYYY-MM-DD) |
| `end` | string | Optional | — | Tweets before this date (YYYY-MM-DD) |
| `includeSearchTerms` | boolean | Optional | `false` | Add the matched search term to each tweet |
| `customMapFunction` | string | Optional | — | JavaScript function to transform each output object |
## Workflow
```
Progress:
- [ ] Step 1: Build search query string
- [ ] Step 2: Run tweet-scraper
- [ ] Step 3: Poll for SUCCEEDED
- [ ] Step 4: Fetch and deliver dataset
```
### Step 1: Build Search Query
- Hashtag search → `#keyword`
- Exact phrase → `"exact phrase"`
- Boolean → `word1 AND word2 -exclude`
- From account → `from:username`
- Mention → `@username`
### 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~tweet-scraper" \
--input '{"param": "value"}'
# Save as CSV
node scripts/run_actor.js \
--actor "apidojo~tweet-scraper" \
--input '{"param": "value"}' \
--output YYYY-MM-DD_results.csv --format csv
# Save as JSON
node scripts/run_actor.js \
--actor "apidojo~tweet-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~tweet-scraper"
Input:
{
"searchTerms": ["<query>"],
"maxItems": 200,
"since": "<YYYY-MM-DD>",
"lang": "<lang_code>"
}
```
**REST API fallback:**
```bash
curl -X POST \
"https://api.apify.com/v2/acts/apidojo~tweet-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchTerms": ["<query>"], "maxItems": 200}'
```
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
- **0 results**: Query may be too narrow, misspelled, or language-filtered. Broaden term, remove language filter, extend date range.
- **< 20 results**: Try removing `since`/`until` constraints. Some low-volume terms have sparse data.
- **Duplicate tweet IDs**: Deduplicate by `id` field before delivering.
- **Suspended/deleted accounts**: Tweets from suspended accounts return with empty author fields — flag these rows.
## Output Format
```
# Tweet Dataset: "<query>"
Total collected: N | Date range: SINCE – UNTIL | Language: LANG
| Tweet ID | Author | Text (truncated) | Likes | Retweets | Replies | Timestamp |
|----------|--------|-----------------|-------|----------|---------|-----------|
| ... | ... | ... | ... | ... | ... | ... |
Full dataset: N rows × 15 fields
Available fields: id, text, author_id, author_username, likeCount, retweetCount,
replyCount, quoteCount, lang, createdAt, tweetUrl, media, isRetweet, isQuote, source
```
## Troubleshooting
**Empty results for a valid hashtag:** Twitter API indexing lag — try again after 15 minutes.
**Rate limit error:** Reduce `maxItems` to 100 and retry.
**Timeout on large requests:** Set `maxItems: 500` max per run; chain multiple runs with date ranges for larger datasets.
© apidojo · Apache-2.0 · apidojo-io/apidojo-skills