# PR Newswire Scraper (`crawlerbros/pr-newswire-scraper`) Actor

Scrape PR Newswire - one of the world's largest press-release distribution networks. Search press releases by keyword, or browse the latest releases across 16 industry categories (technology, healthcare, finance, energy, and more) with title, publish date, summary, and source organization.

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

## Pricing

from $3.00 / 1,000 results

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

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## PR Newswire Scraper

Scrape [PR Newswire](https://www.prnewswire.com) — one of the world's largest press-release distribution networks — for structured, up-to-the-minute press releases. Search by keyword, or browse the latest releases across 16 industry categories (technology, healthcare, finance, energy, and more). No login, no API key, no cookies required.

### What this actor does

- **Five modes:** `search` (free-text keyword search across headlines and body text), `byCategory` (latest releases in an industry, via PR Newswire's own RSS feeds), `byOrganization` (every release issued by one company's newsroom page), `latest` (newest releases across all industries, unfiltered), and `byUrls` (fetch full text of exact press-release URLs)
- **16 industry categories:** Automotive & Transportation, Business Technology, Consumer Products & Retail, Consumer Technology, Energy, Entertainment & Media, Environment, Financial Services, General Business, Health, Heavy Industry & Manufacturing, Multicultural, Policy & Public Interest, Sports, Telecommunications, Travel
- **Filters:** language (2-letter code) — PR Newswire distributes releases in dozens of languages; publish-date range (`dateFrom`/`dateTo`), applied client-side against each release's real timestamp
- **Live data:** title, publish date, summary, source organization, and industry tags — scraped fresh on every run
- **Empty fields are omitted** — every record only contains fields that were actually found on the page/feed

### Output per press release

- `title`
- `url` — direct link to the full press release
- `guid` — PR Newswire's unique release ID (mode=byCategory, mode=latest)
- `publishedAt` — ISO 8601 UTC timestamp
- `summary` — plain-text excerpt
- `industries[]` — PR Newswire's industry tags for this release (mode=byCategory, mode=latest, mode=byUrls when the page carries the tag module)
- `category` — the industry category slug this record was matched against (mode=byCategory only)
- `organization` — the company/organization that issued the release (mode=byCategory, mode=latest, mode=search, mode=byOrganization)
- `language` — BCP-47 language code (e.g. `en-US`, `ja`, `de`, `zh-hant`) — all modes except byUrls
- `publisher` — always "PR Newswire Association LLC." (mode=byCategory, mode=latest)
- `imageUrl` — thumbnail image if the release has one (mode=search, mode=byUrls)
- `searchQuery` — the query that produced this record (mode=search)
- `organizationSlug` — the company/organization newsroom slug that issued this release; feed it into `mode=byOrganization` to browse that company's full newsroom (mode=byOrganization, mode=search)
- `updatedAt` — ISO 8601 UTC last-modified timestamp (mode=byUrls)
- `description` — the lead sentence/dek of the release (mode=byUrls)
- `datelineLocation` — the release's dateline city/state, e.g. "SAN MATEO, Calif." (mode=byUrls)
- `sourceOrganization` — the company credited as "SOURCE" at the end of the release (mode=byUrls)
- `bodyText` — the full plain-text press-release body (mode=byUrls)
- `mediaContactName`, `mediaContactPhone`, `mediaContactEmail` — the release's own media/investor/press contact, when one is explicitly listed (mode=byUrls). `mediaContactPhone` is only present when a real phone number (not PR Newswire's own switchboard) appears right alongside that contact.
- `tickerSymbols[]` — stock-ticker mentions found in the release body, formatted `EXCHANGE:SYMBOL` (e.g. `NASDAQ:PODD`) — covers any publicly traded company named in the text (the issuer itself, or a third party such as a lawsuit defendant), present only on releases that mention one (mode=byUrls)
- `recordType: "pressRelease"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search`, `byCategory`, `byOrganization`, `latest`, or `byUrls` |
| `searchQuery` | string | `artificial intelligence` | Free-text query (mode=search) |
| `category` | string | `business-technology` | Industry category to browse (mode=byCategory) |
| `organizationSlug` | string | `microsoft-corporation` | Company/organization newsroom slug to browse, e.g. `microsoft-corporation` (mode=byOrganization) |
| `urls` | array | `[]` | Exact prnewswire.com press-release URLs to fetch full text for (mode=byUrls) |
| `language` | string | – | Only keep releases in this language, e.g. `en`, `fr`, `de` — applies to search/byCategory/byOrganization/latest modes |
| `dateFrom` | string | – | Only keep releases published on/after this date (`YYYY-MM-DD`) — applies to search/byCategory/byOrganization/latest modes |
| `dateTo` | string | – | Only keep releases published on/before this date (`YYYY-MM-DD`) — applies to search/byCategory/byOrganization/latest modes |
| `maxItems` | integer | `30` | Hard cap on emitted records |
| `pageSize` | integer | `25` | Cards per page fetch: `25`/`50`/`75`/`100` — higher values mean fewer requests to reach `maxItems` (mode=search, mode=byOrganization) |

#### Example: keyword search

```json
{
  "mode": "search",
  "searchQuery": "artificial intelligence",
  "maxItems": 30
}
```

#### Example: browse an industry category

```json
{
  "mode": "byCategory",
  "category": "health",
  "maxItems": 20
}
```

#### Example: a company's full newsroom

```json
{
  "mode": "byOrganization",
  "organizationSlug": "microsoft-corporation",
  "maxItems": 50
}
```

#### Example: fetch full text of exact releases

```json
{
  "mode": "byUrls",
  "urls": ["https://www.prnewswire.com/news-releases/example-press-release-300000000.html"]
}
```

### Use cases

- **PR/comms teams** — monitor competitor press-release cadence by industry or company
- **Media monitoring platforms** — ingest a real-time press-release firehose across 16 industries
- **Investor relations research** — pull a public company's full newsroom history via `byOrganization`
- **Market research** — track announcement trends (product launches, funding, M\&A) by keyword
- **Financial signal extraction** — use `tickerSymbols[]` from `mode=byUrls` to flag releases mentioning publicly traded companies
- **Content aggregation** — republish or summarize the latest releases in a niche industry vertical

### Notes

- `mode=byCategory` reads PR Newswire's general RSS feed (the site's per-category RSS feeds were discontinued upstream — every category slug now serves the same ~20-item firehose feed of the most recent releases across all industries) and keeps only the releases whose real `<prn:industry>` tags match the selected category. Because that shared feed only ever holds ~20 releases total, a niche category can legitimately return 0–5 items on a given run — that reflects how few of the current 20 releases fall in that industry, not a bug. For broader/historical coverage of a specific industry, use `mode=search` with an industry keyword instead.
- `mode=latest` reads the same general RSS feed as `mode=byCategory` but skips the industry filter entirely, returning the newest ~20 releases across every industry — use this when you just want the freshest firehose without picking a category. Once those ~20 RSS items are exhausted, it automatically continues into PR Newswire's real paginated "all releases" HTML listing so `maxItems` values above 20 are still reachable; records sourced from that continuation don't carry `organization`/`industries` (not present in that page's card markup) but do carry `title`/`url`/`publishedAt`/`summary`/`imageUrl`/`language`.
- `mode=search` paginates the HTML search-results page up to `maxItems`.
- `mode=byOrganization` paginates a company's own newsroom page (`prnewswire.com/news/<slug>/`), which lists every release the company has issued through PR Newswire — going back further than `mode=search`'s general index for that company. Find a company's slug by searching for it on prnewswire.com and copying the last path segment of its newsroom URL.
- `mode=byUrls` fetches the full body text of exact press-release pages — use this to get the complete release (not just the summary) after finding URLs via `search` or `byCategory`.
- If a page fails to load, the actor automatically retries with backoff and, as a last resort, falls back to the free Apify datacenter proxy (AUTO group) — no residential proxy or paid add-ons required.
- `publishedAt` for `mode=search` is converted from PR Newswire's displayed Eastern Time using a standard EDT/EST offset (PR Newswire only ever displays "ET" without distinguishing daylight/standard time).
- `dateFrom`/`dateTo` are applied client-side against each release's extracted `publishedAt`. PR Newswire's own `startdate`/`enddate` search query parameters are silently ignored server-side (verified live — a request scoped to a single past month still returns today's releases), so this is the only reliable way to date-filter results.

### FAQ

**Do I need an account or API key?**
No. This actor scrapes publicly available RSS feeds and search-results pages, both explicitly allowed by prnewswire.com's robots.txt.

**Why are some fields missing on some releases?**
Only fields that were actually present in the feed/page are included in each record — e.g. `industries` only appears for `byCategory` records since search results don't carry industry tags.

**How current is the data?**
Both RSS-backed and HTML-backed modes scrape live at run time — PR Newswire's feeds update continuously throughout the day.

**Is this affiliated with PR Newswire?**
No, this is an independent third-party actor that reads PR Newswire's public feeds and pages. It is not affiliated with or endorsed by PR Newswire Association LLC.

**Why does a niche `byCategory` category sometimes return very few results?**
PR Newswire's per-category RSS feeds were discontinued upstream, so every category now filters the same shared ~20-item firehose feed by its real industry tags. A niche category can legitimately return 0–5 items on a given run. Use `mode=search` with an industry keyword for broader/historical coverage.

**Can I get the full press-release text, not just the summary?**
Yes — use `mode=byUrls` with the exact release URL(s) to get `bodyText`, the complete plain-text body, plus dateline, source organization and media contacts.

**Can I filter by publish date?**
Yes, via `dateFrom`/`dateTo` (`YYYY-MM-DD`). These are applied client-side against each release's real timestamp, since PR Newswire's own date-range search parameters are ignored server-side.

**What timezone are the dates in?**
`publishedAt`/`updatedAt` are always normalized to UTC ISO 8601, regardless of PR Newswire's own Eastern Time display.

**Does this work for non-English releases?**
Yes — PR Newswire distributes releases in dozens of languages. Use the `language` filter (e.g. `en`, `fr`, `de`, `ja`) to restrict results to a single language.

**How do I find a company's newsroom slug for `byOrganization`?**
Search the company on prnewswire.com and copy the last path segment of its newsroom URL, e.g. `microsoft-corporation` from `prnewswire.com/news/microsoft-corporation/`.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `organizationSlug` (type: `string`):

PR Newswire's URL slug for the issuing company, e.g. `microsoft-corporation` for https://www.prnewswire.com/news/microsoft-corporation/. Find the slug by searching the company on prnewswire.com and copying the last path segment of its newsroom URL.

## `urls` (type: `array`):

Exact prnewswire.com press-release URLs to fetch full text for. Returns full body text, dateline, and source organization in addition to title/date/summary.

## `searchQuery` (type: `string`):

Free-text keyword to search press-release headlines and body text for, e.g. `artificial intelligence`.

## `category` (type: `string`):

PR Newswire's top-level industry taxonomy. Returns the latest press releases in that industry.

## `language` (type: `string`):

Only keep releases published in this 2-letter language code (e.g. `en`, `fr`, `de`, `es`). PR Newswire distributes releases in many languages; leave blank to keep all.

## `dateFrom` (type: `string`):

Only keep releases published on/after this date (UTC). Applied client-side against each release's actual publish timestamp — PR Newswire's own search date-range parameters are ignored server-side.

## `dateTo` (type: `string`):

Only keep releases published on/before this date (UTC). Applied client-side against each release's actual publish timestamp — PR Newswire's own search date-range parameters are ignored server-side.

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

Hard cap on emitted records.

## `pageSize` (type: `string`):

How many cards PR Newswire returns per page fetch. Higher values mean fewer HTTP requests to reach `maxItems`. Only applies to `mode=search` and `mode=byOrganization`.

## Actor input object example

```json
{
  "mode": "search",
  "organizationSlug": "microsoft-corporation",
  "urls": [],
  "searchQuery": "artificial intelligence",
  "category": "business-technology",
  "maxItems": 30,
  "pageSize": "25"
}
```

# Actor output Schema

## `pressReleases` (type: `string`):

Dataset containing all scraped PR Newswire press releases.

# 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 = {
    "mode": "search",
    "organizationSlug": "microsoft-corporation",
    "urls": [],
    "searchQuery": "artificial intelligence",
    "category": "business-technology",
    "maxItems": 30,
    "pageSize": "25"
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/pr-newswire-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 = {
    "mode": "search",
    "organizationSlug": "microsoft-corporation",
    "urls": [],
    "searchQuery": "artificial intelligence",
    "category": "business-technology",
    "maxItems": 30,
    "pageSize": "25",
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/pr-newswire-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "mode": "search",
  "organizationSlug": "microsoft-corporation",
  "urls": [],
  "searchQuery": "artificial intelligence",
  "category": "business-technology",
  "maxItems": 30,
  "pageSize": "25"
}' |
apify call crawlerbros/pr-newswire-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/pr-newswire-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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