building-twitter-prospect-lists
Finds people on Twitter or X who match what you are looking for so you can reach out to them.
Installation
Paste this into Claude Code, Cursor, or any agent that can run commands.
SKILL.mdShow the author's original SKILL.md
---
name: building-twitter-prospect-lists
description: >
Builds targeted B2B prospect lists from Twitter/X profiles and posts using apidojo's Twitter scrapers on Apify.
Triggers when the user asks to: find Twitter users with a specific job title or keyword in bio,
build a list of founders or executives on Twitter, find people tweeting about a topic for outreach,
identify potential customers on X, scrape Twitter profiles matching an ICP description,
find decision-makers in a specific industry on Twitter, or export a list of leads from Twitter bios.
Returns name, username, bio, follower count, location, and recent tweet samples per prospect.
Ideal for B2B SDRs, growth hackers, founder-led sales teams, and partnership managers.
license: Apache-2.0
metadata:
author: apidojo
version: "1.0"
apify-actors: apidojo/tweet-scraper, apidojo/twitter-user-scraper
---
# Building Twitter Prospect Lists
Searches Twitter/X for profiles matching a target ICP (Ideal Customer Profile) using bio keywords and topic-based tweet search. Delivers a contact-ready list with engagement signals and bio context.
## 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: Define ICP and search strategy
- [ ] Step 2: Run tweet-scraper for keyword/topic tweets
- [ ] Step 3: Extract unique authors from results
- [ ] Step 4: Enrich with twitter-user-scraper for bio + follower data
- [ ] Step 5: Filter, rank, and deliver prospect list
```
### Step 1: Define ICP and Strategy
Ask the user:
- **Job title keywords** for Twitter bio search (e.g., "Head of Growth", "Founder", "CTO")
- **Topic keywords** — what topics does the ICP tweet about? (e.g., "SaaS metrics", "PLG", "RevOps")
- **Industry signals** — keywords that suggest the right industry in bio (e.g., "SaaS", "fintech", "healthcare")
- **Follower range** (optional) — e.g., 1,000–50,000 (avoids both nobodies and celebrities)
- **Location** (optional) — e.g., "San Francisco", "London"
- **List size** — how many prospects needed?
### Step 2: Search for Topic-Based Tweets
Search Twitter for tweets about topics your ICP cares about. People who actively tweet about a topic are warmer prospects.
**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": ["[TOPIC_KEYWORD_1]", "[TOPIC_KEYWORD_2]"],
"maxItems": 200,
"tweetLanguage": "en"
}
```
**If Apify MCP is not available:**
```bash
curl -X POST \
"https://api.apify.com/v2/acts/apidojo~tweet-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"searchTerms": ["[TOPIC_KEYWORD]"],
"maxItems": 200
}'
```
Run for each topic keyword. Collect all `author.username` values. Deduplicate. This gives you a candidate pool.
### Step 3: Enrich Candidates with Profile Data
Take the top 100-200 unique usernames from Step 2. Fetch full profile data to filter by bio keywords and follower count.
**If Apify MCP is available:**
```
Tool: apify:run-actor
Actor: "apidojo~twitter-user-scraper"
Input:
{
"usernames": ["[username1]", "[username2]", "..."],
"maxItems": 100
}
```
**If Apify MCP is not available:**
```bash
curl -X POST \
"https://api.apify.com/v2/acts/apidojo~twitter-user-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"usernames": ["[username1]", "[username2]"]
}'
```
### Step 4: Filter Against ICP Criteria
From profile data, keep only users where ALL of these are true:
1. Bio contains at least one job title keyword OR industry signal keyword
2. Follower count is within the specified range (if given)
3. Location matches (if specified) — check `location` field
4. Account is not a bot (has profile picture, has >10 tweets, account age >6 months)
Remove:
- Accounts with default profile images
- Accounts with 0 tweets
- Verified mega-influencers (follower count above range)
- Obviously automated accounts
### Step 5: Rank and Format
Rank filtered prospects by:
1. Relevance score = number of ICP keywords matched in bio
2. Engagement proxy = (likes + retweets on recent tweets) / follower count
## Output Format
```
# Twitter Prospect List: [ICP DESCRIPTION]
Generated: [N] prospects | Filters applied: [summary] | Date: [DATE]
| # | Name | Handle | Followers | Job / Bio | Location | Last Active | Profile |
|---|------|--------|-----------|-----------|----------|-------------|---------|
| 1 | [name] | @[handle] | [N] | [bio excerpt] | [city] | [date] | [url] |
| 2 | [name] | @[handle] | [N] | [bio excerpt] | [city] | [date] | [url] |
## Top 10 Highest-Priority Prospects
1. **@[handle]** — "[bio]" | [N] followers | Recently tweeted about: [topic]
2. **@[handle]** — "[bio]" | [N] followers | Recently tweeted about: [topic]
...
## Notes
- [N] candidates found in topic search
- [N] filtered out (didn't match ICP criteria)
- [N] final prospects delivered
- Engagement signals are 24-48h delayed
```
## Personalizing Outreach
For each top prospect, the recent tweet sample can be used to personalize outreach. Note their recent topics to reference in a first message.
## Troubleshooting
**Too few results after filtering:** Broaden bio keywords (use OR logic, not AND). Try more topic keywords in Step 2.
**Too many irrelevant accounts:** Add industry-specific keywords to bio filter (e.g., require "SaaS" or "B2B" in bio).
**Location filter not working:** Twitter location is self-reported and inconsistent — treat it as a soft signal, not a hard filter.
Mirrored from the author's public source. Install counts from the open skills registry.