# 📰 Media Pitch Leads & Journalist Source Request Monitor (`automation_studio/media-pitch-leads-scraper`) Actor

Monitor real-time journalist source requests and PR pitch leads across SourceBottle and verified journalist feeds (journa.host). Features publication authority tier scoring (Tier 1 DR 80+), urgency countdowns, contact email extraction, and instant Discord/Slack alert webhooks.

- **URL**: https://apify.com/automation\_studio/media-pitch-leads-scraper.md
- **Developed by:** [Automation Studio](https://apify.com/automation_studio) (community)
- **Categories:** Lead generation
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 verified intelligence record leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 📰 Media Pitch Leads & Journalist Source Request Monitor

> **Real-time journalist source requests, editorial queries, and digital PR pitch opportunities aggregated from live media channels — delivered straight to your dataset or instant Slack/Discord channel.**

***

### 💡 Why Media Pitch Leads Monitor?

PR agencies, SEO link builders, and startup founders routinely pay **$3,000 to $10,000+ per year** for enterprise media databases like Muck Rack and Cision. Meanwhile, journalists from top publications (**Forbes, The Wall Street Journal, BBC, TechCrunch, Bloomberg, The Daily Telegraph**) constantly publish public source queries seeking expert commentary, quotes, case studies, and founder interviews.

These media queries have a **tight 12 to 24-hour pitch window**. If you reply after the deadline, the story is already filed.

**Media Pitch Leads Monitor** solves this by continuously monitoring public journalist feeds, tagging them by **Publication Authority Tier (DR 80+)**, calculating **Urgency Countdowns**, extracting **Direct Journalist Emails & Phone Numbers**, and dispatching **Instant Alert Cards** to Discord or Slack the moment a query goes live.

***

### ⚡ Key Features

| Feature | Competitor Actors | Media Pitch Leads Monitor |
| :--- | :--- | :--- |
| **Data Sources** | Single platform / slow scrapers | **Multi-Stream**: SourceBottle (12 Industries) + journa.host (Verified Journalists) + Mastodon Network |
| **Authority Tiering** | ❌ None (treats DR 90 Forbes like a personal blog) | ✅ **Tier 1 (DR 80+)**, **Tier 2 (DR 50-79)**, and **Tier 3 (Niche)** automatic scoring |
| **Urgency & Deadlines** | ❌ Raw text only | ✅ **Calculated Hours-Remaining** with `CRITICAL (< 12h)` and `EXPIRING_SOON` flags |
| **Contact Extraction** | ❌ Buried in long text blocks | ✅ Heuristic extraction of **Direct Emails** and **Phone Numbers** |
| **Instant Alerts** | ❌ None (must manually check dataset) | ✅ **Rich Discord & Slack Embed Cards** with 1-click respond buttons |
| **Stateful Deduplication** | ❌ Delivers duplicate items on every run | ✅ **Key-Value Store memory** — scheduled runs only return brand-new opportunities |

***

### 📡 Monitored Data Feeds

1. **SourceBottle (12 Industry Sectors)**:
   - Business & Finance (`61`)
   - Technology (`70`)
   - Professional Services (`67`)
   - Health & Wellbeing (`65`)
   - Lifestyle (`66`)
   - Entertainment & Arts (`64`)
   - Public Relations & Marketing (`68`)
   - Retail & Consumer Goods (`69`)
   - Education & Non-Profit (`62`)
   - Environment & Agriculture (`63`)
   - Travel & Tourism (`71`)
   - General Interest (`72`)
2. **journa.host**:
   - The premier Mastodon server specifically built for verified reporters, editors, and columnists.
3. **mastodon.social & Federated Network**:
   - Global federated stream of `#journorequest` and `#prrequest` editorial callouts.

***

### 🏆 Publication Authority Tiers

To help SEOs and PR specialists prioritize high-authority backlinks and top-tier press mentions, every request is categorized into:

- **Tier 1 (DR 80+)**: *Forbes, The Wall Street Journal, The New York Times, BBC, Bloomberg, Reuters, Financial Times, The Guardian, TechCrunch, Business Insider, The Daily Telegraph, News Corp, CNBC, Fortune, Wired, Sydney Morning Herald, etc.*
- **Tier 2 (DR 50-79)**: *VentureBeat, Adweek, Digiday, Healthline, MarketingWeek, Search Engine Journal, Decrypt, Coindesk, The Register, etc.*
- **Tier 3 (Niche)**: *Independent podcasts, specialized trade blogs, regional magazines, local newsletters.*

***

### 📥 Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `sources` | `array` | `["sourcebottle", "journahost", "mastodon"]` | Data feeds to monitor. |
| `sourcebottleIndustries` | `array` | `["61", "70", "67", "65", "66"]` | SourceBottle industry sectors to scan. |
| `keywords` | `array` | `[]` | Keywords to filter topic, publication, or requirements (e.g. `["finance", "AI", "Forbes", "startup"]`). |
| `publicationTiers` | `array` | `[]` | Filter by `TIER_1_TOP_MEDIA`, `TIER_2_MID_MEDIA`, or `TIER_3_NICHE`. |
| `onlyOpenDeadlines` | `boolean` | `true` | Exclude requests whose submission deadline has already passed. |
| `minHoursRemaining` | `integer` | `0` | Exclude requests expiring in less than X hours. |
| `maxRequests` | `integer` | `100` | Maximum number of opportunities to retrieve. |
| `onlyNewRequests` | `boolean` | `true` | Enable stateful Key-Value Store deduplication for recurring schedules. |
| `webhookUrl` | `string` | `""` | Discord or Slack incoming webhook URL for instant alerts. |
| `webhookUrgentOnly` | `boolean` | `false` | Only fire webhooks for Tier 1 or Critical (<12h) requests. |

***

### 📤 Output Data Format

Each record pushed to the Apify dataset contains:

```json
{
  "id": "sb_161359",
  "title": "URG - TODAY: looking for Sydney home buyers!",
  "publication": "The Daily Telegraph",
  "publicationTier": "TIER_1_TOP_MEDIA",
  "category": "Business & Finance",
  "urgency": "CRITICAL (< 12 hours)",
  "deadline": "22 September 2026 @ 12pm Eastern Daylight Saving Time",
  "deadlineIso": "2026-09-22T12:00:00+00:00",
  "hoursRemaining": 8.5,
  "contactEmail": "ike.morris@news.com.au",
  "contactPhone": "0403981799",
  "targetGeography": "Australia (Sydney)",
  "summary": "Are you a family looking to buy a home but have been put off because house prices are unaffordable? We want to hear from you!",
  "requirements": "I am a reporter from The Daily Telegraph and we are looking to interview a family living in Sydney who is trying to buy a home...",
  "sourceBadge": "Journalist",
  "respondUrl": "https://www.sourcebottle.com/query.asp?iid=61&qid=161359",
  "source": "SourceBottle"
}
```

***

### 🔔 Setting Up Instant Slack & Discord Alerts

1. Create an Incoming Webhook in your Discord server (`Server Settings > Integrations > Webhooks`) or Slack app.
2. Paste the URL into the `webhookUrl` field in the actor input.
3. Schedule the actor to run every **1 hour** on Apify.
4. With `onlyNewRequests: true`, you will receive immediate push notifications whenever a journalist matches your keywords!

***

### 💰 Transparent Pay-Per-Event Pricing

- **Pricing Model**: `PAY_PER_EVENT`
- **Actor Start**: **$0.002** (one-time base execution fee per run)
- **Delivered Media Pitch Opportunity**: **$0.004** per verified lead (`apify-default-dataset-item`)

*Example: A sweep delivering 25 fresh journalist requests costs only $0.002 + (25 × $0.004) = **$0.102** (10 cents).*

# Actor input Schema

## `sources` (type: `array`):

Select the live media and journalist sources to scan for active pitch opportunities.

## `sourcebottleIndustries` (type: `array`):

Select industry sectors to scan on SourceBottle. All 12 industries are enabled by default for maximum lead volume.

## `keywords` (type: `array`):

Filter by target topics, industries, or specific media outlets (e.g., 'finance', 'AI', 'startup', 'Forbes', 'health'). Matches against publication name, summary, and requirements. Leave empty to capture all leads.

## `publicationTiers` (type: `array`):

Filter opportunities by media authority tier. Leave empty to capture all tiers.

## `onlyOpenDeadlines` (type: `boolean`):

Exclude requests whose pitch deadlines have already passed.

## `minHoursRemaining` (type: `integer`):

Filter out requests that expire in less than this number of hours. Set to 0 to include all active requests.

## `maxRequests` (type: `integer`):

Maximum total media requests to return across all sources.

## `onlyNewRequests` (type: `boolean`):

Uses Apify Key-Value Store to track previously seen request IDs. When enabled, scheduled runs will ONLY return fresh leads that have not been delivered before.

## `webhookUrl` (type: `string`):

Optional: Discord or Slack incoming webhook URL to receive instant, formatted alert cards whenever new journalist requests match your criteria.

## `webhookUrgentOnly` (type: `boolean`):

When enabled, webhooks will only trigger for Tier 1 publications (DR 80+) or Critical (<12 hours) deadlines.

## `proxyConfiguration` (type: `object`):

Public journalist feeds do not require proxies by default. Enable Apify Proxy if running frequent high-volume sweeps.

## Actor input object example

```json
{
  "sources": [
    "sourcebottle",
    "journahost",
    "mastodon"
  ],
  "sourcebottleIndustries": [
    "61",
    "62",
    "63",
    "64",
    "65",
    "66",
    "67",
    "68",
    "69",
    "70",
    "71",
    "72"
  ],
  "keywords": [],
  "publicationTiers": [],
  "onlyOpenDeadlines": true,
  "minHoursRemaining": 0,
  "maxRequests": 200,
  "onlyNewRequests": true,
  "webhookUrgentOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing verified journalist requests, deadlines, authority tiers, and contact emails

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sources": [
        "sourcebottle",
        "journahost",
        "mastodon"
    ],
    "sourcebottleIndustries": [
        "61",
        "62",
        "63",
        "64",
        "65",
        "66",
        "67",
        "68",
        "69",
        "70",
        "71",
        "72"
    ],
    "keywords": [],
    "publicationTiers": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_studio/media-pitch-leads-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sources": [
        "sourcebottle",
        "journahost",
        "mastodon",
    ],
    "sourcebottleIndustries": [
        "61",
        "62",
        "63",
        "64",
        "65",
        "66",
        "67",
        "68",
        "69",
        "70",
        "71",
        "72",
    ],
    "keywords": [],
    "publicationTiers": [],
}

# Run the Actor and wait for it to finish
run = client.actor("automation_studio/media-pitch-leads-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sources": [
    "sourcebottle",
    "journahost",
    "mastodon"
  ],
  "sourcebottleIndustries": [
    "61",
    "62",
    "63",
    "64",
    "65",
    "66",
    "67",
    "68",
    "69",
    "70",
    "71",
    "72"
  ],
  "keywords": [],
  "publicationTiers": []
}' |
apify call automation_studio/media-pitch-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation_studio/media-pitch-leads-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/jmyd1ndw7b38IC4TL/builds/yo9R5hjg59IpVc3gB/openapi.json
