# Journalist Requests Scraper — SourceBottle Media Call-Outs (`fabrikit/journalist-requests-scraper`) Actor

Journalist requests scraper for SourceBottle: open media call-outs for expert sources, case studies and product samples by category and country edition, with outlet, summary, posted date and deadline. Keyword filter, no login, no API key.

- **URL**: https://apify.com/fabrikit/journalist-requests-scraper.md
- **Developed by:** [Fabrikit](https://apify.com/fabrikit) (community)
- **Categories:** Lead generation, News, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 journalist request scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Journalist Requests Scraper — SourceBottle Media Call-Outs

Journalist Requests Scraper extracts open media call-outs from sourcebottle.com: requests from journalists, bloggers, podcasters and PR professionals who need expert sources, case studies, interviewees or product samples for a story. Pick the industry categories and country editions you care about, optionally filter by keyword and age, and get clean JSON, CSV or Excel with the title, what the journalist is looking for, the outlet, the deadline and the link to the call-out. No login, no API key, no browser.

**Pay per event.** The full call-out page (target countries, verified-media tick, details text, paid flag) is an optional add-on.

### What you get

**Every call-out (listing data):** SourceBottle ID and URL, title, summary of what the poster needs, outlet or organisation ("Retail News", "Lifestyle Blog", "Independent Journalist"), who posted it (Journalist, Blogger, PR Pro, Content Creator, Event Manager), industry category, country edition, posted date (ISO) and deadline (ISO local time plus the text shown on the site).

**With `includeDetails` (add-on):** every country the call-out is open to, the "Verified Media" tick, whether the source must be local, the full "Details" text, the deadline timezone label and whether successful sources are paid.

Journalist names, e-mail addresses and phone numbers are never part of the output: the Actor reads only the public call-out pages and removes e-mails, phone numbers and personal LinkedIn profile links that posters paste into the free text.

### Why this instead of a HARO-style inbox

Source-request newsletters bury the three pitches you care about under hundreds you don't. This Actor turns SourceBottle's public call-outs into rows you can filter, store and route: schedule it every morning with `postedWithinDays: 1`, keep the categories and keywords that match your clients, and push the matches to Slack, a sheet, your CRM or an AI agent that drafts the pitch.

### Input examples

The default run: the newest call-outs in the Australian edition, all 11 call-out categories, 50 items.

```json
{ "countries": ["australia"], "maxItems": 50 }
```

Technology and business call-outs open in the US and UK editions, posted in the last 3 days, with the full call-out page:

```json
{
  "categories": ["technology", "business-finance"],
  "countries": ["united-states", "uk-ireland"],
  "postedWithinDays": 3,
  "includeDetails": true,
  "maxItems": 200
}
```

Keyword watch across every edition and category (for a daily schedule):

```json
{ "keywords": ["cybersecurity", "fintech", "startup founder"], "postedWithinDays": 1, "maxItems": 500 }
```

Product-sample and prize requests from bloggers and event organisers live in the `samples-prizes-sponsorship` category, crawled only when you select it.

### Input fields

| Field | Description |
|---|---|
| `keywords` | Words or phrases; a call-out is kept when any of them appears in the title, summary or outlet (case-insensitive) |
| `categories` | `business-finance`, `environment`, `general`, `health-wellbeing`, `lifestyle-food-fashion`, `parenting-education`, `pr-media-marketing`, `professional-services`, `property`, `technology`, `travel-leisure`, `samples-prizes-sponsorship`. Empty = the 11 call-out categories |
| `countries` | `australia`, `new-zealand`, `uk-ireland`, `canada`, `united-states`, `singapore`. Empty = all six editions |
| `postedWithinDays` | Only call-outs posted in the last N days (0 = no limit); the crawl stops early because lists are newest first |
| `includeDetails` | Open each call-out page (add-on price) |
| `maxItems` | Exact limit (default 50) |
| `proxyConfiguration` | Apify Proxy; datacenter IPs are enough in our tests, the Actor switches to residential automatically if it gets blocked |

SourceBottle's own keyword search needs an account, so keywords are matched by the Actor while it walks the category lists. Each list page holds 12 call-outs, so a keyword run over all editions and categories costs a few hundred page requests at most.

### Output example

```json
{
  "id": "163106",
  "url": "https://www.sourcebottle.com/query.asp?qid=163106",
  "title": "Retail/Product safety experts for comment",
  "summary": "Seeking retail and product safety experts for an Inside Retail feature following the ACCC's action against Kmart. How should retailers respond to customer injury reports, and when should they pause sales or recall a product?",
  "outlet": "Retail News",
  "posterType": "Journalist",
  "category": "General",
  "categoryId": 63,
  "countryEdition": "Australia",
  "postedDate": "2026-10-20",
  "deadline": "2026-10-20T17:00:00",
  "deadlineText": "20 October 2026 @ 5pm",
  "scrapedAt": "2026-10-20T07:18:42.104Z"
}
```

With `includeDetails` each record also carries `countries` (array), `verifiedMedia`, `localSourceRequired`, `localSourceText`, `details`, `sourcesPaid`, `deadlineTimezone` and `detailsFetched`.

### Pricing

| Event | When |
|---|---|
| Call-out scraped (`request-result`) | every call-out saved to the dataset |
| Call-out details (`request-details`) | only with `includeDetails` |

See the Pricing tab for current prices; paid Apify plans get lower rates. Platform compute is included.

### How it compares

Other journalist-request Actors on Apify mostly monitor social hashtags such as #journorequest. This Actor reads one moderated public source (SourceBottle's editions for Australia, New Zealand, the UK and Ireland, Canada, the US and Singapore), returns outlet, deadline and category as separate fields. It does not cover HARO/Connectively, Qwoted or social networks.

### Integrations

Run it from the Apify API or the JavaScript and Python clients, schedule it in Apify Console, and send the dataset to n8n, Make, Zapier, Google Sheets, Slack or a webhook with the standard Apify integrations. Through Apify's MCP server it also works as a tool for AI agents ("open technology call-outs in the US edition posted today").

### FAQ

**Is this legal?** The Actor collects call-outs that SourceBottle publishes openly without an account and stores no personal contact data. It is not affiliated with SourceBottle. Use the data in line with the site's terms and the laws that apply to you (GDPR, Australian Privacy Act and similar).

**Do I need a proxy?** The default Apify Proxy (datacenter) is enough in our tests; if SourceBottle starts blocking, the Actor moves to a residential proxy on its own.

**Why does the same call-out appear in several editions?** A call-out can be open to several countries and is listed in each edition. The Actor removes duplicates by ID; `countryEdition` says where it was found first and `countries` (with `includeDetails`) lists every target country.

**What timezone is the deadline?** Australian Eastern time, as shown by SourceBottle. `deadline` keeps that local time without a UTC offset; `deadlineTimezone` carries the label.

**Why are there no journalist names or e-mails?** The public pages do not show them, and the Actor would strip them anyway. To respond, open the call-out `url` and use SourceBottle's own form.

**Are there limits?** A category list holds up to a few hundred open call-outs (12 per page); the Actor walks every page until `maxItems`, your date window or the end of the list.

### Changelog

- **0.1 (October 2026)** — first release: category and country-edition listings, keyword and age filters, optional call-out details, personal-data scrubbing, exact `maxItems`, pay-per-event pricing.

***

### En español

Scraper de **pedidos de periodistas** (call-outs de medios) desde SourceBottle: periodistas, blogueros y profesionales de PR que buscan expertos, casos y productos para una nota. Filtra por categoría, edición por país, palabra clave y antigüedad, y obtén título, resumen, medio, fecha y plazo en JSON, CSV o Excel. Sin login ni API key. Detalle completo opcional. Consulta la pestaña Pricing para ver los precios vigentes; los planes de pago de Apify tienen tarifas más bajas. No entrega nombres, correos ni teléfonos de periodistas.

# Actor input Schema

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

Only call-outs whose title, summary or outlet contains at least one of these words or phrases (case-insensitive). Leave empty for every call-out.

## `categories` (type: `array`):

SourceBottle industry categories to crawl. Leave empty for all 11 call-out categories. 'Samples, prizes & sponsorship' (product requests from bloggers and event organisers) is only crawled when you select it.

## `countries` (type: `array`):

SourceBottle country editions to crawl. A call-out open to several countries is listed in each of them (the Actor removes duplicates). Leave empty for all six editions.

## `postedWithinDays` (type: `integer`):

Only call-outs posted in the last N days. 0 = no limit. Lists are newest first, so the crawl stops early when older call-outs are reached.

## `includeDetails` (type: `boolean`):

Open each call-out page to add the target countries, the 'Verified Media' tick, whether a local source is required, the full details text, the deadline timezone and the paid/unpaid flag. One extra request per call-out, charged as a 'request-details' event.

## `maxItems` (type: `integer`):

Stop after this many call-outs (exact). The default run returns 50.

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

Apify Proxy settings. Datacenter IPs are enough for SourceBottle in our tests; if the site starts blocking them the Actor switches to a residential proxy automatically.

## Actor input object example

```json
{
  "keywords": [],
  "categories": [],
  "countries": [
    "australia"
  ],
  "postedWithinDays": 0,
  "includeDetails": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `requests` (type: `string`):

All call-outs collected during the run

# 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 = {
    "keywords": [],
    "categories": [],
    "countries": [
        "australia"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fabrikit/journalist-requests-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 = {
    "keywords": [],
    "categories": [],
    "countries": ["australia"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("fabrikit/journalist-requests-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 '{
  "keywords": [],
  "categories": [],
  "countries": [
    "australia"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call fabrikit/journalist-requests-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fabrikit/journalist-requests-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/tg5UtrsQ4YhXKfux3/builds/czI1ZTQzrksU8dmcY/openapi.json
