New: Earn 20% as an AgentAlley affiliate. Share your link and earn on every sale you refer. Join now New: Earn 20% as an affiliate. Join now

Find Twitter/X influencers to promote a product or brand

Find twitter influencers

by gooseworks-ai · MIT license · ★ 1,220 on GitHub · updated Sep 21

Find twitter influencers cover

Find Twitter/X influencers to promote a product or brand. Use when asked to find influencers, discover Twitter accounts for partnerships, identify creators in a niche, or build an influencer outreach list.

---
name: find-twitter-influencers
description: Find Twitter/X influencers to promote a product or brand. Use when asked to find influencers, discover Twitter accounts for partnerships, identify creators in a niche, or build an influencer outreach list.
source: orthogonal
---


# Find Twitter Influencers

## Setup

Choose the available runtime before doing any credential setup:

- **Terminal-free client:** skip the shell commands below. Use connected MCP tools. For ScrapeCreators operations, read `scrapecreators-api` and prefer `call_data_provider`. For another provider step without a connected tool, use an equivalent built-in public-web method when it preserves the workflow, or clearly report that step as unavailable.
- **Local terminal:** use the GooseWorks credentials and proxy commands below.

Read your credentials from ~/.gooseworks/credentials.json:
```bash

Overview

Choose the available runtime before doing any credential setup:

Manual install (npx, ZIP)
Claude Codenpx skills add gooseworks-ai/goose-skills --skill find-twitter-influencers -g -a claude-code
Claude Code (manual)mkdir -p ~/.claude/skills && curl -sL https://codeload.github.com/gooseworks-ai/goose-skills/tar.gz/615c685f34f8 \ | tar -xz -C ~/.claude/skills --strip-components=4 goose-skills-615c685f34f8/skills/social/capabilities/find-twitter-influencers
Windows (PowerShell)New-Item -ItemType Directory -Force "$HOME\.claude\skills" | Out-Null; Invoke-WebRequest "https://m.agentalley.io/zip/8a82d6c2ba43ac464a2d/find-twitter-influencers.zip" -OutFile "$env:TEMP\find-twitter-influencers.zip"; Expand-Archive "$env:TEMP\find-twitter-influencers.zip" -DestinationPath "$HOME\.claude\skills" -Force
Claude.ai / desktopDownload the ZIP and upload it under Settings → Capabilities → Skills.
Codex, Cursor, other agentsPoint them at SKILL.md. The other files are plain text.

Connects with Agent Alley MCP · agentalley.io/mcp

Files included

  • SKILL.md25.4 KB
  • skill.meta.json340 B
Read the files here
gooseworks-ai/615c6852 files
SKILL.md
Show the full text435 lines

Find Twitter Influencers

Setup

Choose the available runtime before doing any credential setup:

  • Terminal-free client: skip the shell commands below. Use connected MCP tools. For ScrapeCreators operations, read scrapecreators-api and prefer call_data_provider. For another provider step without a connected tool, use an equivalent built-in public-web method when it preserves the workflow, or clearly report that step as unavailable.
  • Local terminal: use the GooseWorks credentials and proxy commands below.

Read your credentials from ~/.gooseworks/credentials.json:

export GOOSEWORKS_API_KEY=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json'))['api_key'])")
export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))")

If ~/.gooseworks/credentials.json does not exist, tell the user to run: npx gooseworks login

The local proxy endpoints use Bearer auth: -H "Authorization: Bearer $GOOSEWORKS_API_KEY". ScrapeCreators operation descriptions below remain environment-neutral in both runtimes.

Discover, score, and enrich Twitter/X influencers relevant to a company, product, or niche. Returns a ranked list with engagement metrics, relevance reasoning, and contact info.

Workflow

1. Parse the Request

Extract from the user's query:

  • Company name or domain (required) — the brand seeking influencers
  • Niche/vertical (optional) — e.g., "fintech Twitter", "AI/ML creators", "DTC beauty"
  • Size preference (optional) — mid-tier (10K-100K), macro (100K+), or mixed (default: 10K+ minimum)
  • Max results (optional, default 20 — scale up or down if the user asks)
2. Resolve the Company

Use Brand.dev to get domain, industry, description, target audience, and keywords. This context drives all subsequent searches.

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"brand-dev","path":"/v1/brand/retrieve-by-name","query":{"name":"Acme","Corp":""}}'

If a domain is provided directly:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"brand-dev","path":"/v1/brand/retrieve","query":{"domain":"acme.com"}}'

From the result, build a company context string: company name, domain, industry, description, and target audience keywords. Example: "Acme Corp acme.com developer tools API platform engineering teams". Use this in all search queries.

3. Discover Candidates

Run three strategies in parallel to maximize coverage:

Strategy A — Exa search for curated influencer lists (primary, highest signal):

IMPORTANT: x.com and twitter.com profiles are NOT in Exa's search index, so includeDomains: ["x.com"] will return zero Twitter results. Instead, search for curated list pages, blog posts, and articles about influencers in the niche. Use contents.text to get the page content so you can extract Twitter handles from it.

Run 5+ query variations to maximize coverage. Include the core niche AND adjacent niches — many influencers span related topics. Each query returns 10 results with text content:

# Query 1: Core niche — curated lists
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"exa","path":"/search"}'
  "query": "best {niche} Twitter accounts to follow",
  "numResults": 10,
  "contents": {"text": {"maxCharacters": 5000}}
}'

# Query 2: Core niche — different phrasing
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"exa","path":"/search"}'
  "query": "top {industry} influencers on X Twitter must follow",
  "numResults": 10,
  "contents": {"text": {"maxCharacters": 5000}}
}'

# Query 3: Core niche — thought leaders
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"exa","path":"/search"}'
  "query": "{niche} thought leaders creators Twitter handles",
  "numResults": 10,
  "contents": {"text": {"maxCharacters": 5000}}
}'

# Query 4: Adjacent niche 1 (e.g., if niche is "identity verification", try "fraud prevention")
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"exa","path":"/search"}'
  "query": "top {adjacent_niche_1} influencers Twitter accounts to follow",
  "numResults": 10,
  "contents": {"text": {"maxCharacters": 5000}}
}'

# Query 5: Adjacent niche 2 (e.g., "cybersecurity", "regtech", "biometrics")
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"exa","path":"/search"}'
  "query": "best {adjacent_niche_2} experts creators on X Twitter",
  "numResults": 10,
  "contents": {"text": {"maxCharacters": 5000}}
}'

Choosing adjacent niches: From the company context (Step 2), identify 2-3 related verticals. Examples:

  • Identity verification → fraud prevention, cybersecurity, regtech, biometrics
  • Fintech → banking, payments, DeFi, financial regulation
  • AI/ML → data science, MLOps, developer tools
  • DTC beauty → skincare, wellness, lifestyle, clean beauty

These queries return listicle pages (e.g., "Top 60 Fintech Influencers", "FinTwit Accounts to Follow") whose text content contains Twitter handles, bios, and follower counts. Parse these in Step 4.

Strategy B — Exa findSimilar (expand from strong listicle finds):

After Strategy A returns results, pick 1-2 of the best curated list URLs and find similar pages:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"exa","path":"/findSimilar"}'
  "url": "https://example.com/top-fintech-twitter-influencers",
  "numResults": 5,
  "contents": {"text": {"maxCharacters": 5000}}
}'

This surfaces additional curated lists that keyword search may miss. Do NOT use Twitter/X profile URLs for findSimilar — they are not in Exa's index and will return empty results.

Strategy C — Fiber natural-language-search (catch LinkedIn-heavy professionals):

Some influencers are better indexed on LinkedIn but have active Twitter accounts. Fiber can surface these. Run 2-3 queries covering the core niche and adjacent topics:

# Core niche
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/natural-language-search/profiles"}'
  "query": "{niche} thought leader content creator with Twitter presence at {industry} companies",
  "pageSize": 20
}'

# Adjacent niche — broader coverage
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/natural-language-search/profiles"}'
  "query": "{adjacent_niche} influencer expert with large social media following",
  "pageSize": 20
}'

Cross-reference Fiber results with Twitter in Step 5 — only keep people with active Twitter accounts. Also extract LinkedIn URLs from Fiber results — these are critical for contact enrichment in Step 7.

4. Extract & Deduplicate Usernames

From the text content of Exa listicle pages, parse Twitter handles using multiple patterns:

  • @username mentions in the article text
  • URLs matching x.com/username or twitter.com/username
  • Strip trailing URL paths (e.g., /status/123, /followers) — only keep base profile usernames
  • Discard non-profile patterns (search pages, hashtag pages, x.com/home, x.com/search)
  • Deduplicate by username (case-insensitive)
  • Flag and remove obvious brand/company accounts (e.g., @stripe, @shopify) — focus on individual creators

From Fiber results, extract any Twitter/X URLs from social profiles. Add new handles to the candidate pool.

Also extract LinkedIn URLs mentioned alongside Twitter handles in listicle pages — save these for contact enrichment in Step 7.

Target: ~100-150 unique handles after dedup. Curated list pages typically mention 20-50 handles each, so 5+ good listicle results across core and adjacent niches yield a large candidate pool.

5. Get Twitter Profiles + Engagement

Use Scrape Creators to fetch structured Twitter data. This is a two-step process: fetch profiles for ALL candidates (cheap, 1 credit each), then fetch tweets for the top ~2x the target result count after profile filtering (e.g., ~40 if targeting 20 results).

Step 1 — Fetch profiles for all candidates:

provider: scrapecreators
method: GET
path: /v1/twitter/profile
query:
  handle: examplehandle

Returns nested JSON. Key fields are inside core and legacy objects:

  • core.screen_name, core.name — handle and display name
  • legacy.description — bio text
  • legacy.followers_count, legacy.friends_count, legacy.statuses_count — counts
  • legacy.location, legacy.created_at — location and account age
  • is_blue_verified — verification status

The profile URL is https://x.com/{screen_name}.

IMPORTANT — Parallelize profile fetches: Do NOT fetch profiles one-by-one in a sequential loop. Instead, launch ALL profile fetch calls in parallel (multiple tool calls in a single message). This dramatically reduces total wait time from minutes to seconds. Group into batches of 10-15 parallel calls if needed.

Apply hard filters to narrow the pool:

  • Fewer than 10,000 followers (default minimum — adjustable if user specifies a different threshold)
  • Empty bio or bio completely unrelated to the niche
  • Suspended or not-found accounts (API returns error)
  • Bio indicates they've left X (e.g., "find me on Mastodon/Bluesky", "abandoned this site")
  • Too broad/generic accounts — Remove accounts whose content is not specifically relevant to the target niche. For example, a general "tech evangelist" account with 500K+ followers that rarely tweets about the niche is less valuable than a 20K-follower specialist. If an account's bio and recent tweets show no specific connection to the target niche or adjacent niches, exclude it regardless of follower count

Step 2 — Fetch tweets for top candidates (after profile filtering — fetch ~2x the target result count to allow for filtering, e.g., ~40 if targeting 20 results):

provider: scrapecreators
method: GET
path: /v1/twitter/user-tweets
query:
  handle: examplehandle

Returns an array of tweet objects. IMPORTANT — The data is nested inside each tweet object:

  • legacy.full_text — tweet text
  • legacy.favorite_count — likes (integer)
  • legacy.retweet_count — retweets (integer)
  • legacy.reply_count — replies (integer)
  • legacy.created_at — timestamp
  • views.count — view count (may not always be present)
  • url — direct link to the tweet (top-level field)

Note: favorite_count, retweet_count, reply_count are inside the legacy object, NOT at the top level of each tweet.

IMPORTANT — Parallelize tweet fetches: Just like profile fetches, launch ALL tweet fetch calls in parallel (multiple tool calls in a single message). Do NOT use sequential for-loops. This is the single biggest speed optimization.

For each candidate, identify the top 3 tweets by engagement (likes + retweets + replies). Save the best one with its URL for inclusion in the final results table.

From the tweet data, calculate:

  • Average likes per tweet
  • Average retweets per tweet
  • Average replies per tweet
  • Engagement rate: (avg likes + avg retweets + avg replies) / followers * 100
  • Post frequency: inferred from created_at dates
  • Content themes: what topics they tweet about most (from full_text)

Additional hard filters (applied after tweet fetch):

  • No tweets in the last 30 days (inactive)
  • Protected/private accounts

Skip reply-only accounts (>80% of tweets are replies to others with minimal engagement).

6. Score & Rank

Apply a composite scoring model:

Factor Weight Signal
Relevance 40% Bio keywords, content themes, audience overlap with target company
Engagement rate 25% Higher is better; micro-influencers often outperform macro here
Follower count 15% Log-scaled — diminishing returns above 100K
Content quality 10% Original content vs retweets, thread depth, media usage
Audience alignment 10% Do their followers match the company's target audience? Inferred from bio + content themes

Scoring guidelines:

  • Relevance: Compare bio and recent tweet topics against the company context string from Step 2. Exact niche match = high score. Adjacent niche = medium. Generic/unrelated = low.
  • Engagement rate benchmarks: >3% excellent, 1-3% good, <1% below average (varies by follower tier)
  • Content quality: Penalize accounts that are >50% retweets. Reward original threads, insights, and media-rich posts.

Rank all candidates by composite score. Select the top N (default 20) for the final list. 20 is a good default — enough to give the user real options without overwhelming them. Scale up if the user asks for more, but always include at least the top 20 if that many qualify.

7. Enrich Contacts

For the final list, find email addresses and LinkedIn profiles. The key insight: discover LinkedIn URLs first — they dramatically improve match rates for all enrichment APIs.

Step 1 — Collect what you already have: From previous steps, gather:

  • Emails visible in Twitter bios (many influencers list them directly)
  • LinkedIn URLs extracted from Exa listicle page text (Step 4)
  • LinkedIn URLs from Fiber NL search results (Step 3, Strategy C)
  • Website URLs from Twitter profile data (Step 5)
  • "DM for collabs" or "Open DMs" notes from bios

Step 2 — Discover LinkedIn URLs for candidates missing them:

# Exa search to find LinkedIn profiles by name
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"exa","path":"/search"}'
  "query": "Jane Smith site:linkedin.com/in",
  "numResults": 3,
  "includeDomains": ["linkedin.com"]
}'

Launch ALL these Exa searches in parallel (multiple tool calls in a single message). Match by name + job title/company from their Twitter bio. LinkedIn URLs are indexed by Exa, unlike Twitter profiles.

Step 3 — Fiber kitchen-sink (best coverage for professionals):

# With LinkedIn URL (best match rate — ALWAYS prefer this):
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/kitchen-sink/person"}'
  "profileIdentifier": "https://linkedin.com/in/janesmith"
}'

Note: Fiber kitchen-sink does NOT accept a Twitter URL parameter. Use profileIdentifier (LinkedIn URL) for best results. The name+company fallback has low match rates for influencers — invest in finding LinkedIn URLs in Step 2 instead.

Step 4 — Hunter email-finder (if you have their name + domain from their website/LinkedIn):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"hunter","path":"/v2/email-finder","query":{"domain":"janesmithcreative.com"}}'

Step 5 — Tomba LinkedIn-to-email (if LinkedIn URL was discovered):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"tomba","path":"/v1/linkedin","query":{"url":"https://linkedin.com/in/janesmith"}}'

Also extract from enrichment results:

  • LinkedIn URL (for outreach or further research)
  • Personal website or newsletter link
  • Other social profiles
8. Present Results

Output a ranked markdown table with ALL qualifying influencers. Use full plain-text URLs — do NOT use markdown link syntax like [text](url) or [@handle](url) because these often don't render as clickable links in all contexts. Instead, write out the full URL directly.

## Twitter Influencers for {Company} — {Niche}

Found {N} influencers ranked by relevance and engagement:

| # | Name | Twitter | Followers | Eng. Rate | Why They Fit | Top Tweet | Email | LinkedIn |
|---|------|---------|-----------|-----------|--------------|-----------|-------|----------|
| 1 | Jane Smith | https://x.com/janesmith | 45.2K | 3.8% | {1-line reason} | https://x.com/janesmith/status/123 | jane@... | https://linkedin.com/in/janesmith |
| 2 | ... | ... | ... | ... | ... | ... | ... | ... |

### Size Distribution
- Mid-tier (10K-100K): {count}
- Macro (100K+): {count}

### Notes
- Engagement rates above 3% are excellent for partnership ROI
- Influencers marked with "DM preferred" indicated in their bio they prefer DMs over email
- {Any caveats about the search — e.g., niche is small so fewer results}

Default to showing 20 results. This is double the old default of 10, giving the user more options without overwhelming them. If fewer than 20 qualify, show all that qualify. If the user asks for more, scale up accordingly.

The Top Tweet column should contain the URL to each influencer's highest-engagement tweet (by likes + retweets + replies). This gives the user an immediate feel for the influencer's content style and reach.

Include a brief summary of search coverage: how many candidates were found, how many passed filtering, and any gaps (e.g., "Few macro influencers found in this niche — consider broadening to adjacent topics").

9. Optional Deep Dive

Only if the user requests more detail on specific influencers:

Full tweet analysis (recent content, top tweets, audience reactions): Run both ScrapeCreators operations defined in Steps 1 and 2 for the selected handle.

If deeper tweet history is needed, Nyne can fetch recent newsfeed data asynchronously:

# Step 1: POST to start async retrieval
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"","path":"","body":{"social_media_url":"https://x.com/TARGET"}}'
# Step 2: Poll with GET using request_id
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"nyne","path":"/person/newsfeed","query":{"request_id":"REQUEST_ID"}}'

LinkedIn profile (full work history, credentials, other ventures):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/linkedin-live-fetch/profile/single","body":{"identifier":"https://linkedin.com/in/TARGET"}}'

Deep enrichment (AI-powered research — slow, ~30-60s):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"sixtyfour","path":"/enrich-lead"}'
  "lead_info": {"first_name": "Jane", "last_name": "Smith", "linkedin_url": "https://linkedin.com/in/janesmith"},
  "struct": {"work_email": "Work email", "personal_email": "Personal email", "phone": "Phone number", "audience_size": "Total audience across platforms", "collab_history": "Known brand collaborations", "content_style": "Content style and themes"}
}'

Tips

  • Exa cannot search Twitter directly — x.com/twitter.com profiles are NOT in Exa's search index. includeDomains: ["x.com"] returns zero Twitter results. Instead, search for curated list pages and listicles about influencers, then extract handles from the page text
  • Request text content from Exa — Always use contents: { text: { maxCharacters: 5000 } } when searching for influencer lists. The page text contains @handles, profile URLs, and bios that you need to parse
  • Query variation is key — Vary phrasing across queries: "best fintech Twitter accounts to follow", "top finance creators on X", "FinTwit must-follow" all surface different listicle pages
  • findSimilar works on listicle pages, not Twitter URLs — Use findSimilar on the best curated list URLs from Strategy A to find more lists. Do NOT pass x.com URLs — they return empty results
  • Mid-tier influencers often outperform — accounts with 10K-100K followers frequently have 2-3x the engagement rate of 500K+ accounts. Include a healthy mix of mid-tier and macro
  • Brand accounts vs personal — Filter out corporate accounts (@stripe, @shopify). Look for individual creators even if they work at companies (e.g., @pmarca not @a16z)
  • Engagement rate varies by tier — >5% is elite for any size. 2-3% is strong for 50K+ followers. <0.5% is a red flag regardless of follower count
  • Content themes matter more than follower count — An account with 8K followers tweeting daily about the exact niche beats a 200K account that occasionally mentions it
  • Scrape Creators returns nested JSON — Profile data is inside core (name, screen_name) and legacy (followers_count, description, etc.) objects. Tweet engagement data is inside each tweet's legacy object (legacy.favorite_count, legacy.retweet_count, legacy.reply_count), NOT at the top level. Always access tweet['legacy']['favorite_count'], not tweet['favorite_count']
  • Two-step profile + tweets — Fetch profiles first for all candidates (1 credit each), apply hard filters (followers, bio relevance), then fetch tweets for ~2x the target result count. This saves credits compared to fetching tweets for everyone
  • Each tweet includes a direct URL — The url field on each tweet object (top-level, not inside legacy) gives you https://x.com/{handle}/status/{id}. The profile URL is https://x.com/{screen_name}
  • ALWAYS parallelize API calls — The single biggest performance improvement. Never fetch profiles or tweets in sequential for-loops. Always use multiple parallel tool calls in a single message. For example, fetch 10-15 profiles simultaneously, wait for results, then fetch the next batch. Same for tweets, LinkedIn lookups, and email enrichment. This can reduce total execution time from 10+ minutes to 2-3 minutes
  • Default to 20 results — Double the old default of 10. Enough to give real options without overwhelming. Scale up if the user asks for more
  • Use full URLs, not markdown links — Write https://x.com/handle and https://linkedin.com/in/name as plain text in the results table. Markdown link syntax like [@handle](url) or [Profile](url) often doesn't render as clickable links and makes the output harder to use
  • Check for newsletters/Substacks — Many Twitter influencers run newsletters. These are high-signal for partnership potential and often listed in the bio
  • Fiber catches LinkedIn-heavy people — Some professionals (B2B especially) are more discoverable via LinkedIn but still have active Twitter accounts. Don't skip Strategy C for B2B niches
  • Fiber kitchen-sink has no Twitter URL param — Use profileIdentifier (LinkedIn URL) for best match rate. The name+company fallback has very low match rates for influencers
  • LinkedIn URL discovery is critical — Fiber kitchen-sink with name+company often returns "could not find anyone". Invest in finding LinkedIn URLs first via Exa (site:linkedin.com/in "Jane Smith") or from listicle page text. LinkedIn URLs in profileIdentifier have dramatically better match rates
  • Contact enrichment is a waterfall — Check Twitter bio first (free), then Fiber with LinkedIn URL (best coverage), then Hunter/Tomba only if needed
  • DM culture — Many influencers prefer Twitter DMs for collaboration inquiries. Note "DM for collabs" or "Open DMs" from bios as a contact method
  • Adjacent niches expand the pool — Narrow B2B niches (identity verification, regtech, etc.) may only have 10-20 active influencers on X. Always search 2-3 adjacent verticals to hit the target count. For example: identity verification → fraud prevention, cybersecurity, biometrics, regtech
  • X migration is real — Many B2B/security influencers have migrated to Mastodon, Bluesky, or Threads since 2022. Filter out accounts whose bio says "find me on [other platform]" or that haven't tweeted in 30+ days. Note migration trends in the results summary so the user can consider multi-platform outreach
  • Scrape Creators returns tweets sorted by popularity — The user-tweets endpoint returns top tweets, not chronologically sorted. To check if an account is truly active, look at the created_at dates across all returned tweets — if the newest tweet is months old, the account may be inactive even though it has high historical engagement
1---
2name: find-twitter-influencers
3description: Find Twitter/X influencers to promote a product or brand. Use when asked to find influencers, discover Twitter accounts for partnerships, identify creators in a niche, or build an influencer outreach list.
4source: orthogonal
5---
6 
7 
8# Find Twitter Influencers
9 
10## Setup
11 
12Choose the available runtime before doing any credential setup:
13 
14- **Terminal-free client:** skip the shell commands below. Use connected MCP tools. For ScrapeCreators operations, read `scrapecreators-api` and prefer `call_data_provider`. For another provider step without a connected tool, use an equivalent built-in public-web method when it preserves the workflow, or clearly report that step as unavailable.
15- **Local terminal:** use the GooseWorks credentials and proxy commands below.
16 
17Read your credentials from ~/.gooseworks/credentials.json:
18```bash
19export GOOSEWORKS_API_KEY=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json'))['api_key'])")
20export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))")
21```
22 
23If ~/.gooseworks/credentials.json does not exist, tell the user to run: `npx gooseworks login`
24 
25The local proxy endpoints use Bearer auth: `-H "Authorization: Bearer $GOOSEWORKS_API_KEY"`. ScrapeCreators operation descriptions below remain environment-neutral in both runtimes.
26 
27 
28Discover, score, and enrich Twitter/X influencers relevant to a company, product, or niche. Returns a ranked list with engagement metrics, relevance reasoning, and contact info.
29 
30## Workflow
31 
32### 1. Parse the Request
33 
34Extract from the user's query:
35- **Company name or domain** (required) — the brand seeking influencers
36- **Niche/vertical** (optional) — e.g., "fintech Twitter", "AI/ML creators", "DTC beauty"
37- **Size preference** (optional) — mid-tier (10K-100K), macro (100K+), or mixed (default: 10K+ minimum)
38- **Max results** (optional, default 20 — scale up or down if the user asks)
39 
40### 2. Resolve the Company
41 
42Use Brand.dev to get domain, industry, description, target audience, and keywords. This context drives all subsequent searches.
43 
44```bash
45curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
46 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
47 -H "Content-Type: application/json" \
48 -d '{"api":"brand-dev","path":"/v1/brand/retrieve-by-name","query":{"name":"Acme","Corp":""}}'
49```
50 
51If a domain is provided directly:
52```bash
53curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
54 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
55 -H "Content-Type: application/json" \
56 -d '{"api":"brand-dev","path":"/v1/brand/retrieve","query":{"domain":"acme.com"}}'
57```
58 
59From the result, build a **company context string**: company name, domain, industry, description, and target audience keywords. Example: `"Acme Corp acme.com developer tools API platform engineering teams"`. Use this in all search queries.
60 
61### 3. Discover Candidates
62 
63Run three strategies **in parallel** to maximize coverage:
64 
65**Strategy A — Exa search for curated influencer lists** (primary, highest signal):
66 
67IMPORTANT: x.com and twitter.com profiles are NOT in Exa's search index, so `includeDomains: ["x.com"]` will return zero Twitter results. Instead, search for curated list pages, blog posts, and articles about influencers in the niche. Use `contents.text` to get the page content so you can extract Twitter handles from it.
68 
69Run 5+ query variations to maximize coverage. Include the **core niche** AND **adjacent niches** — many influencers span related topics. Each query returns 10 results with text content:
70 
71```bash
72# Query 1: Core niche — curated lists
73curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
74 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
75 -H "Content-Type: application/json" \
76 -d '{"api":"exa","path":"/search"}'
77 "query": "best {niche} Twitter accounts to follow",
78 "numResults": 10,
79 "contents": {"text": {"maxCharacters": 5000}}
80}'
81 
82# Query 2: Core niche — different phrasing
83curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
84 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
85 -H "Content-Type: application/json" \
86 -d '{"api":"exa","path":"/search"}'
87 "query": "top {industry} influencers on X Twitter must follow",
88 "numResults": 10,
89 "contents": {"text": {"maxCharacters": 5000}}
90}'
91 
92# Query 3: Core niche — thought leaders
93curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
94 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
95 -H "Content-Type: application/json" \
96 -d '{"api":"exa","path":"/search"}'
97 "query": "{niche} thought leaders creators Twitter handles",
98 "numResults": 10,
99 "contents": {"text": {"maxCharacters": 5000}}
100}'
101 
102# Query 4: Adjacent niche 1 (e.g., if niche is "identity verification", try "fraud prevention")
103curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
104 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
105 -H "Content-Type: application/json" \
106 -d '{"api":"exa","path":"/search"}'
107 "query": "top {adjacent_niche_1} influencers Twitter accounts to follow",
108 "numResults": 10,
109 "contents": {"text": {"maxCharacters": 5000}}
110}'
111 
112# Query 5: Adjacent niche 2 (e.g., "cybersecurity", "regtech", "biometrics")
113curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
114 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
115 -H "Content-Type: application/json" \
116 -d '{"api":"exa","path":"/search"}'
117 "query": "best {adjacent_niche_2} experts creators on X Twitter",
118 "numResults": 10,
119 "contents": {"text": {"maxCharacters": 5000}}
120}'
121```
122 
123**Choosing adjacent niches**: From the company context (Step 2), identify 2-3 related verticals. Examples:
124- Identity verification → fraud prevention, cybersecurity, regtech, biometrics
125- Fintech → banking, payments, DeFi, financial regulation
126- AI/ML → data science, MLOps, developer tools
127- DTC beauty → skincare, wellness, lifestyle, clean beauty
128 
129These queries return listicle pages (e.g., "Top 60 Fintech Influencers", "FinTwit Accounts to Follow") whose text content contains Twitter handles, bios, and follower counts. Parse these in Step 4.
130 
131**Strategy B — Exa findSimilar** (expand from strong listicle finds):
132 
133After Strategy A returns results, pick 1-2 of the best curated list URLs and find similar pages:
134 
135```bash
136curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
137 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
138 -H "Content-Type: application/json" \
139 -d '{"api":"exa","path":"/findSimilar"}'
140 "url": "https://example.com/top-fintech-twitter-influencers",
141 "numResults": 5,
142 "contents": {"text": {"maxCharacters": 5000}}
143}'
144```
145 
146This surfaces additional curated lists that keyword search may miss. Do NOT use Twitter/X profile URLs for findSimilar — they are not in Exa's index and will return empty results.
147 
148**Strategy C — Fiber natural-language-search** (catch LinkedIn-heavy professionals):
149 
150Some influencers are better indexed on LinkedIn but have active Twitter accounts. Fiber can surface these. Run 2-3 queries covering the core niche and adjacent topics:
151 
152```bash
153# Core niche
154curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
155 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
156 -H "Content-Type: application/json" \
157 -d '{"api":"fiber","path":"/v1/natural-language-search/profiles"}'
158 "query": "{niche} thought leader content creator with Twitter presence at {industry} companies",
159 "pageSize": 20
160}'
161 
162# Adjacent niche — broader coverage
163curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
164 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
165 -H "Content-Type: application/json" \
166 -d '{"api":"fiber","path":"/v1/natural-language-search/profiles"}'
167 "query": "{adjacent_niche} influencer expert with large social media following",
168 "pageSize": 20
169}'
170```
171 
172Cross-reference Fiber results with Twitter in Step 5 — only keep people with active Twitter accounts. Also extract LinkedIn URLs from Fiber results — these are critical for contact enrichment in Step 7.
173 
174### 4. Extract & Deduplicate Usernames
175 
176From the **text content** of Exa listicle pages, parse Twitter handles using multiple patterns:
177- `@username` mentions in the article text
178- URLs matching `x.com/username` or `twitter.com/username`
179- Strip trailing URL paths (e.g., `/status/123`, `/followers`) — only keep base profile usernames
180- Discard non-profile patterns (search pages, hashtag pages, `x.com/home`, `x.com/search`)
181- Deduplicate by username (case-insensitive)
182- Flag and remove obvious brand/company accounts (e.g., `@stripe`, `@shopify`) — focus on individual creators
183 
184From Fiber results, extract any Twitter/X URLs from social profiles. Add new handles to the candidate pool.
185 
186Also extract LinkedIn URLs mentioned alongside Twitter handles in listicle pages — save these for contact enrichment in Step 7.
187 
188Target: ~100-150 unique handles after dedup. Curated list pages typically mention 20-50 handles each, so 5+ good listicle results across core and adjacent niches yield a large candidate pool.
189 
190### 5. Get Twitter Profiles + Engagement
191 
192Use Scrape Creators to fetch structured Twitter data. This is a two-step process: fetch profiles for ALL candidates (cheap, 1 credit each), then fetch tweets for the top ~2x the target result count after profile filtering (e.g., ~40 if targeting 20 results).
193 
194**Step 1 — Fetch profiles for all candidates:**
195 
196```yaml
197provider: scrapecreators
198method: GET
199path: /v1/twitter/profile
200query:
201 handle: examplehandle
202```
203 
204Returns nested JSON. Key fields are inside `core` and `legacy` objects:
205- `core.screen_name`, `core.name` — handle and display name
206- `legacy.description` — bio text
207- `legacy.followers_count`, `legacy.friends_count`, `legacy.statuses_count` — counts
208- `legacy.location`, `legacy.created_at` — location and account age
209- `is_blue_verified` — verification status
210 
211The profile URL is `https://x.com/{screen_name}`.
212 
213**IMPORTANT — Parallelize profile fetches:** Do NOT fetch profiles one-by-one in a sequential loop. Instead, launch ALL profile fetch calls in parallel (multiple tool calls in a single message). This dramatically reduces total wait time from minutes to seconds. Group into batches of 10-15 parallel calls if needed.
214 
215Apply **hard filters** to narrow the pool:
216- Fewer than 10,000 followers (default minimum — adjustable if user specifies a different threshold)
217- Empty bio or bio completely unrelated to the niche
218- Suspended or not-found accounts (API returns error)
219- Bio indicates they've left X (e.g., "find me on Mastodon/Bluesky", "abandoned this site")
220- **Too broad/generic accounts** — Remove accounts whose content is not specifically relevant to the target niche. For example, a general "tech evangelist" account with 500K+ followers that rarely tweets about the niche is less valuable than a 20K-follower specialist. If an account's bio and recent tweets show no specific connection to the target niche or adjacent niches, exclude it regardless of follower count
221 
222**Step 2 — Fetch tweets for top candidates** (after profile filtering — fetch ~2x the target result count to allow for filtering, e.g., ~40 if targeting 20 results):
223 
224```yaml
225provider: scrapecreators
226method: GET
227path: /v1/twitter/user-tweets
228query:
229 handle: examplehandle
230```
231 
232Returns an array of tweet objects. **IMPORTANT — The data is nested inside each tweet object:**
233- `legacy.full_text` — tweet text
234- `legacy.favorite_count` — likes (integer)
235- `legacy.retweet_count` — retweets (integer)
236- `legacy.reply_count` — replies (integer)
237- `legacy.created_at` — timestamp
238- `views.count` — view count (may not always be present)
239- `url` — direct link to the tweet (top-level field)
240 
241Note: `favorite_count`, `retweet_count`, `reply_count` are inside the `legacy` object, NOT at the top level of each tweet.
242 
243**IMPORTANT — Parallelize tweet fetches:** Just like profile fetches, launch ALL tweet fetch calls in parallel (multiple tool calls in a single message). Do NOT use sequential for-loops. This is the single biggest speed optimization.
244 
245For each candidate, identify the **top 3 tweets by engagement** (likes + retweets + replies). Save the best one with its URL for inclusion in the final results table.
246 
247From the tweet data, calculate:
248- **Average likes** per tweet
249- **Average retweets** per tweet
250- **Average replies** per tweet
251- **Engagement rate**: (avg likes + avg retweets + avg replies) / followers * 100
252- **Post frequency**: inferred from `created_at` dates
253- **Content themes**: what topics they tweet about most (from `full_text`)
254 
255**Additional hard filters** (applied after tweet fetch):
256- No tweets in the last 30 days (inactive)
257- Protected/private accounts
258 
259Skip reply-only accounts (>80% of tweets are replies to others with minimal engagement).
260 
261### 6. Score & Rank
262 
263Apply a composite scoring model:
264 
265| Factor | Weight | Signal |
266|--------|--------|--------|
267| **Relevance** | 40% | Bio keywords, content themes, audience overlap with target company |
268| **Engagement rate** | 25% | Higher is better; micro-influencers often outperform macro here |
269| **Follower count** | 15% | Log-scaled — diminishing returns above 100K |
270| **Content quality** | 10% | Original content vs retweets, thread depth, media usage |
271| **Audience alignment** | 10% | Do their followers match the company's target audience? Inferred from bio + content themes |
272 
273**Scoring guidelines:**
274- Relevance: Compare bio and recent tweet topics against the company context string from Step 2. Exact niche match = high score. Adjacent niche = medium. Generic/unrelated = low.
275- Engagement rate benchmarks: >3% excellent, 1-3% good, <1% below average (varies by follower tier)
276- Content quality: Penalize accounts that are >50% retweets. Reward original threads, insights, and media-rich posts.
277 
278Rank all candidates by composite score. Select the top N (default 20) for the final list. 20 is a good default — enough to give the user real options without overwhelming them. Scale up if the user asks for more, but always include at least the top 20 if that many qualify.
279 
280### 7. Enrich Contacts
281 
282For the final list, find email addresses and LinkedIn profiles. The key insight: **discover LinkedIn URLs first** — they dramatically improve match rates for all enrichment APIs.
283 
284**Step 1 — Collect what you already have**: From previous steps, gather:
285- Emails visible in Twitter bios (many influencers list them directly)
286- LinkedIn URLs extracted from Exa listicle page text (Step 4)
287- LinkedIn URLs from Fiber NL search results (Step 3, Strategy C)
288- Website URLs from Twitter profile data (Step 5)
289- "DM for collabs" or "Open DMs" notes from bios
290 
291**Step 2 — Discover LinkedIn URLs** for candidates missing them:
292```bash
293# Exa search to find LinkedIn profiles by name
294curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
295 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
296 -H "Content-Type: application/json" \
297 -d '{"api":"exa","path":"/search"}'
298 "query": "Jane Smith site:linkedin.com/in",
299 "numResults": 3,
300 "includeDomains": ["linkedin.com"]
301}'
302```
303 
304Launch ALL these Exa searches in parallel (multiple tool calls in a single message). Match by name + job title/company from their Twitter bio. LinkedIn URLs are indexed by Exa, unlike Twitter profiles.
305 
306**Step 3 — Fiber kitchen-sink** (best coverage for professionals):
307```bash
308# With LinkedIn URL (best match rate — ALWAYS prefer this):
309curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
310 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
311 -H "Content-Type: application/json" \
312 -d '{"api":"fiber","path":"/v1/kitchen-sink/person"}'
313 "profileIdentifier": "https://linkedin.com/in/janesmith"
314}'
315```
316 
317Note: Fiber kitchen-sink does NOT accept a Twitter URL parameter. Use `profileIdentifier` (LinkedIn URL) for best results. The name+company fallback has low match rates for influencers — invest in finding LinkedIn URLs in Step 2 instead.
318 
319**Step 4 — Hunter email-finder** (if you have their name + domain from their website/LinkedIn):
320```bash
321curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
322 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
323 -H "Content-Type: application/json" \
324 -d '{"api":"hunter","path":"/v2/email-finder","query":{"domain":"janesmithcreative.com"}}'
325```
326 
327**Step 5 — Tomba LinkedIn-to-email** (if LinkedIn URL was discovered):
328```bash
329curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
330 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
331 -H "Content-Type: application/json" \
332 -d '{"api":"tomba","path":"/v1/linkedin","query":{"url":"https://linkedin.com/in/janesmith"}}'
333```
334 
335Also extract from enrichment results:
336- LinkedIn URL (for outreach or further research)
337- Personal website or newsletter link
338- Other social profiles
339 
340### 8. Present Results
341 
342Output a ranked markdown table with ALL qualifying influencers. Use **full plain-text URLs** — do NOT use markdown link syntax like `[text](url)` or `[@handle](url)` because these often don't render as clickable links in all contexts. Instead, write out the full URL directly.
343 
344```
345## Twitter Influencers for {Company} — {Niche}
346 
347Found {N} influencers ranked by relevance and engagement:
348 
349| # | Name | Twitter | Followers | Eng. Rate | Why They Fit | Top Tweet | Email | LinkedIn |
350|---|------|---------|-----------|-----------|--------------|-----------|-------|----------|
351| 1 | Jane Smith | https://x.com/janesmith | 45.2K | 3.8% | {1-line reason} | https://x.com/janesmith/status/123 | jane@... | https://linkedin.com/in/janesmith |
352| 2 | ... | ... | ... | ... | ... | ... | ... | ... |
353 
354### Size Distribution
355- Mid-tier (10K-100K): {count}
356- Macro (100K+): {count}
357 
358### Notes
359- Engagement rates above 3% are excellent for partnership ROI
360- Influencers marked with "DM preferred" indicated in their bio they prefer DMs over email
361- {Any caveats about the search — e.g., niche is small so fewer results}
362```
363 
364**Default to showing 20 results.** This is double the old default of 10, giving the user more options without overwhelming them. If fewer than 20 qualify, show all that qualify. If the user asks for more, scale up accordingly.
365 
366The **Top Tweet** column should contain the URL to each influencer's highest-engagement tweet (by likes + retweets + replies). This gives the user an immediate feel for the influencer's content style and reach.
367 
368Include a brief summary of search coverage: how many candidates were found, how many passed filtering, and any gaps (e.g., "Few macro influencers found in this niche — consider broadening to adjacent topics").
369 
370### 9. Optional Deep Dive
371 
372Only if the user requests more detail on specific influencers:
373 
374**Full tweet analysis** (recent content, top tweets, audience reactions):
375Run both ScrapeCreators operations defined in Steps 1 and 2 for the selected handle.
376 
377If deeper tweet history is needed, Nyne can fetch recent newsfeed data asynchronously:
378```bash
379# Step 1: POST to start async retrieval
380curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
381 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
382 -H "Content-Type: application/json" \
383 -d '{"api":"","path":"","body":{"social_media_url":"https://x.com/TARGET"}}'
384# Step 2: Poll with GET using request_id
385curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
386 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
387 -H "Content-Type: application/json" \
388 -d '{"api":"nyne","path":"/person/newsfeed","query":{"request_id":"REQUEST_ID"}}'
389```
390 
391**LinkedIn profile** (full work history, credentials, other ventures):
392```bash
393curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
394 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
395 -H "Content-Type: application/json" \
396 -d '{"api":"fiber","path":"/v1/linkedin-live-fetch/profile/single","body":{"identifier":"https://linkedin.com/in/TARGET"}}'
397```
398 
399**Deep enrichment** (AI-powered research — slow, ~30-60s):
400```bash
401curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
402 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
403 -H "Content-Type: application/json" \
404 -d '{"api":"sixtyfour","path":"/enrich-lead"}'
405 "lead_info": {"first_name": "Jane", "last_name": "Smith", "linkedin_url": "https://linkedin.com/in/janesmith"},
406 "struct": {"work_email": "Work email", "personal_email": "Personal email", "phone": "Phone number", "audience_size": "Total audience across platforms", "collab_history": "Known brand collaborations", "content_style": "Content style and themes"}
407}'
408```
409 
410## Tips
411 
412- **Exa cannot search Twitter directly** — x.com/twitter.com profiles are NOT in Exa's search index. `includeDomains: ["x.com"]` returns zero Twitter results. Instead, search for curated list pages and listicles about influencers, then extract handles from the page text
413- **Request text content from Exa** — Always use `contents: { text: { maxCharacters: 5000 } }` when searching for influencer lists. The page text contains @handles, profile URLs, and bios that you need to parse
414- **Query variation is key** — Vary phrasing across queries: "best fintech Twitter accounts to follow", "top finance creators on X", "FinTwit must-follow" all surface different listicle pages
415- **findSimilar works on listicle pages, not Twitter URLs** — Use findSimilar on the best curated list URLs from Strategy A to find more lists. Do NOT pass x.com URLs — they return empty results
416- **Mid-tier influencers often outperform** — accounts with 10K-100K followers frequently have 2-3x the engagement rate of 500K+ accounts. Include a healthy mix of mid-tier and macro
417- **Brand accounts vs personal** — Filter out corporate accounts (@stripe, @shopify). Look for individual creators even if they work at companies (e.g., @pmarca not @a16z)
418- **Engagement rate varies by tier** — >5% is elite for any size. 2-3% is strong for 50K+ followers. <0.5% is a red flag regardless of follower count
419- **Content themes matter more than follower count** — An account with 8K followers tweeting daily about the exact niche beats a 200K account that occasionally mentions it
420- **Scrape Creators returns nested JSON** — Profile data is inside `core` (name, screen_name) and `legacy` (followers_count, description, etc.) objects. Tweet engagement data is inside each tweet's `legacy` object (`legacy.favorite_count`, `legacy.retweet_count`, `legacy.reply_count`), NOT at the top level. Always access `tweet['legacy']['favorite_count']`, not `tweet['favorite_count']`
421- **Two-step profile + tweets** — Fetch profiles first for all candidates (1 credit each), apply hard filters (followers, bio relevance), then fetch tweets for ~2x the target result count. This saves credits compared to fetching tweets for everyone
422- **Each tweet includes a direct URL** — The `url` field on each tweet object (top-level, not inside legacy) gives you `https://x.com/{handle}/status/{id}`. The profile URL is `https://x.com/{screen_name}`
423- **ALWAYS parallelize API calls** — The single biggest performance improvement. Never fetch profiles or tweets in sequential for-loops. Always use multiple parallel tool calls in a single message. For example, fetch 10-15 profiles simultaneously, wait for results, then fetch the next batch. Same for tweets, LinkedIn lookups, and email enrichment. This can reduce total execution time from 10+ minutes to 2-3 minutes
424- **Default to 20 results** — Double the old default of 10. Enough to give real options without overwhelming. Scale up if the user asks for more
425- **Use full URLs, not markdown links** — Write `https://x.com/handle` and `https://linkedin.com/in/name` as plain text in the results table. Markdown link syntax like `[@handle](url)` or `[Profile](url)` often doesn't render as clickable links and makes the output harder to use
426- **Check for newsletters/Substacks** — Many Twitter influencers run newsletters. These are high-signal for partnership potential and often listed in the bio
427- **Fiber catches LinkedIn-heavy people** — Some professionals (B2B especially) are more discoverable via LinkedIn but still have active Twitter accounts. Don't skip Strategy C for B2B niches
428- **Fiber kitchen-sink has no Twitter URL param** — Use `profileIdentifier` (LinkedIn URL) for best match rate. The name+company fallback has very low match rates for influencers
429- **LinkedIn URL discovery is critical** — Fiber kitchen-sink with name+company often returns "could not find anyone". Invest in finding LinkedIn URLs first via Exa (`site:linkedin.com/in "Jane Smith"`) or from listicle page text. LinkedIn URLs in `profileIdentifier` have dramatically better match rates
430- **Contact enrichment is a waterfall** — Check Twitter bio first (free), then Fiber with LinkedIn URL (best coverage), then Hunter/Tomba only if needed
431- **DM culture** — Many influencers prefer Twitter DMs for collaboration inquiries. Note "DM for collabs" or "Open DMs" from bios as a contact method
432- **Adjacent niches expand the pool** — Narrow B2B niches (identity verification, regtech, etc.) may only have 10-20 active influencers on X. Always search 2-3 adjacent verticals to hit the target count. For example: identity verification → fraud prevention, cybersecurity, biometrics, regtech
433- **X migration is real** — Many B2B/security influencers have migrated to Mastodon, Bluesky, or Threads since 2022. Filter out accounts whose bio says "find me on [other platform]" or that haven't tweeted in 30+ days. Note migration trends in the results summary so the user can consider multi-platform outreach
434- **Scrape Creators returns tweets sorted by popularity** — The `user-tweets` endpoint returns top tweets, not chronologically sorted. To check if an account is truly active, look at the `created_at` dates across all returned tweets — if the newest tweet is months old, the account may be inactive even though it has high historical engagement
435 
View all files on GitHub →

Details

Updated
Sep 21, 2026
License
MIT
Stars on the repo
★ 1,220
Checked
Source
gooseworks-ai/goose-skills ↗
Creator
gooseworks-ai · 206 listings
View creator

Made with find-twitter-influencers

Find twitter influencers — CleanShot 2026-07-13 at 20 16 54@2x (from the gooseworks-ai/goose-skills README)
Find twitter influencers — CleanShot 2026-07-13 at 20 16 54@2x (from the gooseworks-ai/goose-skills README)

by gooseworks-ai

Similar skills

See all →
SkillResearch what people actually say about any topicSTEP 0: STALE-CLONE SELF-CHECK — RUN BEFORE READING BELOWmvanhorn/last30days-skill · by mvanhornResearch what people actually say about any topic in the last 30 days. Pulls posts and engagement from Reddit, X, YouTube, TikTok, Hacker News, Polymarket, GitHub, and the web. Includes a doctor health check to diagnose broken or missing sources.★ 63.5k GitHub starsSkillScrapes social platforms, business dataApifydanielmiessler/LifeOS · by danielmiesslerScrapes social platforms, business data, and e-commerce via Apify actors — Instagram, LinkedIn, TikTok, YouTube, Facebook, Google Maps, Amazon, and web crawls — filtering in code. USE WHEN scrape Instagram, scrape LinkedIn, scrape TikTok, scrape YouTube, scrape Facebook, Google Maps leads, Amazon reviews, business intelligence, multi-platform social listening, competitive analysis, lead generation, social monitoring, Apify actors, web crawl, extract contacts. NOT FOR X/Twitter account operations like posting, threads, or bookmarks (those need a dedicated X API client), 4-tier progressive scraping with proxy escalation (use BrightData), or real-Chrome bot bypass and computer use (use Interceptor).★ 19.3k GitHub starsSkill微信公众号长文增长闭环 ——tsingyuai/growth-lab · by tsingyuai微信公众号长文增长闭环 —— 从读者问题与复刻锚选题、写出可验证的公众号长文、预览与合规检查、同步微信草稿、三重确认下受控发布,到回收阅读与转化数据并复盘。用户要求写公众号、把内容改成公众号、同步或发布微信草稿、查看公众号数据或复盘时使用。★ 2k GitHub starsSkillSearch and retrieve content from Twitter/XTwitter/X SkillReScienceLab/opc-skills · by ReScienceLabSearch and retrieve content from Twitter/X. Get user info, tweets, replies, followers, communities, spaces, and trends via twitterapi.io. Use when user mentions Twitter, X, or tweets.★ 1.8k GitHub starsSkillSays 'YouTube script', 'video script'🎬 YouTube Script: Writing retention-optimized video script...cwinvestments/memstack · by cwinvestmentsUse this skill when the user says 'YouTube script', 'video script', 'write script for YouTube', 'YouTube video outline', or is creating scripted content for a YouTube video with hooks, chapters, and CTAs. Do NOT use for TikTok/Reels short-form scripts or webinar presentations.★ 423 GitHub starsSkillAgent Reach — 互联网能力路由器Ootto-AI/claude-content-skills · by Ootto-AIMUST USE when user wants to 调研/research/搜索/search/查/找/look up anything on the internet — e.g. 全网调研 X / 帮我调研一下 X / 查一下 X / 搜搜 X / 看看大家怎么评价 X / X 上有什么讨论 / research this topic。 Also MUST USE when user mentions any platform or shares any URL/链接: 小红书/xiaohongshu/xhs, Twitter/推特/X, B站/bilibili, Reddit, V2EX, LinkedIn/领英/招聘/求职/jobs, YouTube, GitHub code search, 小宇宙播客, 雪球/股票行情, RSS feeds, or any web URL. 13 platforms, multi-backend routing (OpenCLI / per-platform CLIs / APIs). Zero config for 6 channels. Run `agent-reach doctor --json` to see which backend serves each platform right now. NOT for: 写报告/数据分析/翻译等内容加工(本 skill 只负责从互联网获取内容); 发帖/评论/点赞等写操作;已有专门 skill 的平台(先用专门 skill)。 【路由方式】SKILL.md 包含路由表和常用命令,复杂场景需按需阅读对应分类的 references/*.md。 分类:search / social (小红书/推特/B站/V2EX/Reddit) / career(LinkedIn) / dev(github) / web(网页/文章/RSS) / video(YouTube/B站/播客)。★ 139 GitHub stars

More from gooseworks-ai

SkillMine the highest-converting ad angles from customer reviewsAd angle minergooseworks-ai/goose-skills · by gooseworks-aiMine the highest-converting ad angles from customer reviews, Reddit complaints, support tickets, and competitor ads. Extracts actual pain language, competitor weaknesses, and outcome phrases that real buyers use. Outputs a ranked angle bank with proof quotes and recommended ad formats per angle.★ 1.2k GitHub starsSkillAnalyze ad campaign performance data to identify what'sAd campaign analyzergooseworks-ai/goose-skills · by gooseworks-aiAnalyze ad campaign performance data (Google, Meta, LinkedIn) to identify what's working, what's wasting budget, and specific cut/scale/test recommendations. Runs statistical analysis, funnel diagnostics, and multi-channel budget reallocation with specific dollar-amount shift recommendations and scenario modeling.★ 1.2k GitHub starsSkillFor paid lead-gen and participant-recruitment adsAd lead quality analyzergooseworks-ai/goose-skills · by gooseworks-aiFor paid lead-gen and participant-recruitment ads, replaces vanity CPA with true CAC per qualified lead by joining ad-platform data with downstream funnel events, surfaces tracking gaps, and classifies every creative into Scale / Keep / Investigate / Cut.★ 1.2k GitHub starsSkillAnalyze the message match between your ads and landing pagesAd to landing page auditorgooseworks-ai/goose-skills · by gooseworks-aiAnalyze the message match between your ads and landing pages. Checks if the promise in the ad copy carries through to the landing page headline, body, and CTA. Flags disconnects that kill conversion rates. Works with Google, Meta, and LinkedIn ads.★ 1.2k GitHub starsSkillCheck and improve your brand's visibility across AI searchAeogooseworks-ai/goose-skills · by gooseworks-aiCheck and improve your brand's visibility across AI search engines (ChatGPT, Perplexity, Gemini, Grok, Claude, DeepSeek). Set up tracking, run visibility analyses, audit your website for AI readability, and get actionable recommendations. Uses the npx goose-aeo@latest CLI.★ 1.2k GitHub starsSkillSearch Amazon products - find items, compare pricesAmazon Product Searchgooseworks-ai/goose-skills · by gooseworks-aiSearch Amazon products - find items, compare prices, read reviews★ 1.2k GitHub stars