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
Run `npx skills add "https://github.com/apidojo-io/apidojo-skills" --skill "building-twitter-prospect-lists"` to install this skill, then follow its SKILL.md instructions for my next request.

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.

The systems behind these skills get built for partners every week.

Partner with us