building-journalist-outreach-list-from-twitter

Builds targeted journalist and media contact lists from Twitter/X using apidojo's Twitter scrapers on Apify. Triggers when the user asks to: find journalists covering a specific be…

API Dojo

@apidojo-io

Install

$ openclaw skills install @apidojo-io/building-journalist-outreach-list-from-twitter

Building a Journalist Outreach List from Twitter

Finds journalists and media professionals on Twitter/X who cover a specific beat, industry, or topic. Journalists are the heaviest users of Twitter for professional networking — it's the best platform to build a media contact list.

Prerequisites

  • APIFY_TOKEN environment variable set
  • Optional: Apify MCP server installed

Inputs

ParameterTypeRequiredDefaultNotes
startUrlsarrayOptional[]Twitter profile or tweet URLs
twitterHandlesarrayOptional[]Twitter usernames (without @)
twitterUserIdsarrayOptional[]Twitter user IDs
getFollowersbooleanOptionalfalseExtract follower lists
getFollowingbooleanOptionalfalseExtract following lists
getRetweetersbooleanOptionalfalseExtract retweeters of a tweet URL
includeUnavailableUsersbooleanOptionalfalseInclude unavailable/suspended users
maxItemsnumberOptionalUnlimitedMaximum users to return
customMapFunctionstringOptionalJavaScript function to transform each output object

Workflow

Progress:
- [ ] Step 1: Define beat, industry, and target publications
- [ ] Step 2: Search for journalists tweeting about the beat
- [ ] Step 3: Enrich profiles to extract publication affiliation
- [ ] Step 4: Filter and verify journalist signals
- [ ] Step 5: Deliver press contact list

Step 1: Clarify Parameters

Ask the user for:

  • Beat/topic (e.g., "artificial intelligence", "climate tech", "fintech", "B2B SaaS")
  • Target publications (optional — e.g., "TechCrunch", "Forbes", "Wired", "any tier-1 tech media")
  • Type — staff writers, freelancers, or both
  • Geography (optional — US, UK, global)
  • List size (default: 30 contacts)

Step 2: Search for Beat-Relevant Tweets

Find journalists actively tweeting about the beat — recency of coverage matters for outreach.

Recommended — run_actor.js (handles waiting, output, and file saving automatically):

# Quick answer (prints table to chat)
node scripts/run_actor.js \
  --actor "apidojo~twitter-user-scraper" \
  --input '{"param": "value"}'

# Save as CSV
node scripts/run_actor.js \
  --actor "apidojo~twitter-user-scraper" \
  --input '{"param": "value"}' \
  --output YYYY-MM-DD_results.csv --format csv

# Save as JSON
node scripts/run_actor.js \
  --actor "apidojo~twitter-user-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] journalist",
    "[TOPIC] reporter",
    "writing about [TOPIC]",
    "[TOPIC] story [current year]"
  ],
  "maxItems": 300,
  "tweetLanguage": "en"
}

Also run a second query for article link tweets (journalists tweet their published work):

Input:
{
  "searchTerms": ["[TOPIC] [publication_domain OR article link signal]"],
  "maxItems": 200
}

REST API fallback:

curl -X POST \
  "https://api.apify.com/v2/acts/apidojo~tweet-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchTerms": ["[TOPIC] journalist", "[TOPIC] reporter", "writing about [TOPIC]"],
    "maxItems": 300
  }'

Collect unique author usernames from all results.

Step 3: Enrich Profiles

If Apify MCP is available:

Tool: apify:run-actor
Actor: "apidojo~twitter-user-scraper"
Input:
{
  "usernames": ["[username1]", "...", "up to 150 usernames"]
}

REST API fallback:

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 for Journalist Signals

Keep accounts where bio contains ANY of:

  • Publication names (e.g., "TechCrunch", "@Forbes", "Bloomberg", "@Wired")
  • Journalist titles: "reporter", "journalist", "editor", "correspondent", "writer at", "staff writer", "freelance writer", "contributing editor"
  • Byline signals: "bylines at", "writes for", "covering"
  • Press credentials: "press", "media"

Follower range: 1,000–500,000 (removes complete unknowns and major TV anchors who don't respond to pitches)

Remove: PR/comms people (bio says "PR", "communications", "agency"), brand accounts, academics without journalist credentials.

Step 5: Format Output

Output Format

# Journalist Outreach List: [BEAT/TOPIC]
Contacts found: [N] | Publication filter: [if any] | Date: [DATE]

## Contact List

| # | Name | @Handle | Publication | Beat | Followers | Recent Coverage |
|---|------|---------|-------------|------|-----------|-----------------|
| 1 | [name] | @[handle] | [pub] | [beat] | [N] | [recent tweet/article topic] |

## By Publication

### [Publication Name] ([N] contacts)
1. **[Name]** (@[handle]) — [title from bio] | [N] followers
   Recent tweet: "[excerpt showing beat relevance]"

2. **[Name]** (@[handle]) — [title] | [N] followers

### Freelancers / Independent ([N] contacts)
1. **[Name]** (@[handle]) — writes for [pubs mentioned in bio] | [N] followers

## Pitch Angle Notes
Based on recent tweets, the top 5 contacts are actively covering:
1. @[handle]: recently tweeted about [specific topic] — pitch angle: [suggestion]
2. @[handle]: covering [topic] — pitch angle: [suggestion]

Personalization Tip

Before pitching, read the journalist's last 3 tweets and their most recent published article. Reference something specific. Generic pitches fail. The recent tweet data in this output enables that personalization without additional research.

Troubleshooting

Too many non-journalists in results: Strengthen bio filter — require "reporter" OR "journalist" OR "editor" as exact words, not just a publication name. Can't find journalists for obscure beats: Widen the search to adjacent beats or try the publication name directly as a search term. Follower counts seem stale: For final outreach list, spot-check the top 10 contacts directly on Twitter.

Top skills in this category

Humanizer

@biostartechnology

Remove signs of AI-generated writing from text. Use when editing or reviewing text to make it sound more natural and human-written. Based on Wikipedia's comprehensive "Signs of AI writing" guide. Detects and fixes patterns including: inflated symbolism, promotional language, superficial -ing analyses, vague attributions, em dash overuse, rule of three, AI vocabulary words, negative parallelisms, and excessive conjunctive phrases.

712130k

Answer Overflow

@rhyssullivan

Search indexed Discord community discussions via Answer Overflow. Find solutions to coding problems, library issues, and community Q&A that only exist in Discord conversations.

18122k

Video Subtitles

@ngutman

Generate SRT subtitles from video/audio with translation support. Transcribes Hebrew (ivrit.ai) and English (whisper), translates between languages, burns subtitles into video. Use for creating captions, transcripts, or hardcoded subtitles for WhatsApp/social media.

179.9k

Moltbot Best Practices

@nextfrontierbuilds

Best practices for AI agents - Cursor, Claude, ChatGPT, Copilot. Avoid common mistakes. Confirms before executing, drafts before publishing. Vibe-coding essential.

205.4k

Zero Trust

@doonot

Security-first behavioral guidelines for cautious agent operation. Use this skill for ALL operations involving external resources, installations, credentials, or actions with external effects. Triggers on - any URL/link interaction, package installations, API key handling, sending emails/messages, social media posts, financial transactions, or any action that could expose data or have irreversible effects.

136.7k