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

Scrape press releases from PR Newswire by category listing, company page or direct release URL — full text, metadata, images and contact details. No login, no API key.

- **URL**: https://apify.com/kibaale/pr-newswire-scraper.md
- **Developed by:** [kibalee](https://apify.com/kibaale) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.30 / 1,000 results

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?

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

Every press release on PR Newswire, as clean structured records — full text,
publication time, source company, images and contact details. Paste in the
pages you want (or a whole category), get one record per release out. No
login, no API key, nothing to install.

### What you get

- **Full release text** — every paragraph of the article in order, with the
  boilerplate ("About the company", media-contact block, SOURCE line) cut off
- **Exact metadata** — publication time with time-zone offset, release ID
  (PR Newswire's own ever-increasing number), language, headline
- **Source & contact details** — the company behind the release, the
  dateline location, phone and contact name — and the contact email,
  decoded automatically
- **Images** — image URLs straight from the release page
- **Whole categories** — crawl an industry category from page 1 to the end
  (large ones hold 30,000+ releases), a single company's feed, search
  results, or a mix of everything in one run
- **Listing-only mode** — if you only need *that* a release exists (monitoring,
  alerting), turn off full text and get title/timestamp/summary records at a
  fraction of the cost
- **No browser, no API key** — lightweight requests, so runs are
  fast and cheap
- **Always fresh** — every run fetches the live page at that moment

### Quick start

Input — one URL per row; category pages, company pages, search pages and
direct release URLs can be mixed freely:

```json
{
  "startUrls": [
    "https://www.prnewswire.com/news-releases/business-technology-latest-news/computer-software-list/",
    "https://www.prnewswire.com/news/cloudintelligence.ai-llc/",
    "https://www.prnewswire.com/news-releases/aicostai-expands-its-independent-ai-cost-policy-and-governance-decision-intelligence-platform-for-the-agentic-multi-model-enterprise-302869728.html"
  ],
  "maxItemsPerListing": 100,
  "fetchFullText": true,
  "maxConcurrency": 4
}
```

#### Finding category URLs

Browse PR Newswire's industry menus — every category link looks like
`prnewswire.com/news-releases/<industry>-latest-news/<topic>-list/`. All of
them work here; search-result URLs (`/search/news/?keyword=...`) work too.

### Example record

One record per release in your dataset (with full text on):

```json
{
  "url": "https://www.prnewswire.com/news-releases/...-302869728.html",
  "releaseId": 302869728,
  "title": "AICost.ai Expands Its Independent AI Cost, Policy and Governance ...",
  "language": "en-US",
  "publishedAt": "2026-09-04T09:21:00-04:00",
  "source": "CloudIntelligence.ai llc",
  "dateline": "IRVINE, Calif., Sept. 4, 2026",
  "description": "AICost.ai, developed by Irvine-based CloudIntelligence.ai, today ...",
  "body": ["IRVINE, Calif., Sept. 4, 2026 /PRNewswire/ -- AICost.ai, ...", "..."],
  "images": ["https://mmx.prnewswire.com/media/MS1981030/aicost-ai-...jpg"],
  "emails": ["Subu.Vdaygiri@CloudIntelligence.ai"],
  "phone": "(949) 378-7860",
  "contactName": "Subu Vdaygiri",
  "fullText": true
}
```

### Input fields

| Field | Description |
|---|---|
| `startUrls` | PR Newswire pages to scrape — category/company/search listings or direct release URLs (mixed freely) |
| `maxItemsPerListing` | Stop after this many releases per listing URL. `0` = crawl the whole listing (large categories: 30,000+) |
| `fetchFullText` | On: opens every release page (body, images, contacts). Off: listing data only (title, timestamp, summary) |
| `maxConcurrency` | Parallel release pages fetched at once (1–16) |

Direct release URLs are always returned in full regardless of
`fetchFullText`.

### Record fields

With full text on:

| Field | Meaning |
|---|---|
| `url`, `releaseId` | Release page URL and PR Newswire's release ID (higher = newer) |
| `title`, `language` | Headline and language (e.g. `en-US`, `de`) |
| `publishedAt` | Publication time, ISO 8601 with Eastern-Time offset |
| `source` | Company that issued the release |
| `dateline` | City/state and date line as shown on the release |
| `description` | Lead summary without the "/PRNewswire/ --" prefix |
| `body` | Release paragraphs in order, boilerplate excluded |
| `images` | Image URLs from the release |
| `emails`, `phone`, `contactName` | Decoded contact details from the media-contact block (empty when the release lists none) |
| `fullText` | `true` |

With full text off: `url`, `releaseId`, `title`, `language`, `publishedAt`,
`summary`, `fullText: false`.

### Tips

- **Monitoring:** PR Newswire release IDs increase over time. Crawl a
  category in listing-only mode and compare `releaseId` values against your
  last run to spot new releases cheaply.
- **Multilingual:** categories mix languages; each record carries its own
  `language`, so filtering is easy.
- **Fair use:** the actor adds a short pause between pages and obeys the
  site's request patterns. Large categories take a while — start with
  `maxItemsPerListing` small to see the pace.

### How much does it cost you?

Each release record you scrape is billed as one dataset item. You pay
per item only when a run actually finishes a record — failed or empty runs
cost nothing.

### FAQ

**Does it work on the international PR Newswire sites?** The main global
site (prnewswire.com) is supported. Country editions and language sites
(e.g. prnewswire.co.uk, /es/, /de/) may use the same markup but are not
verified yet — if a page produces no data, drop a note in the actor's
discussion.

**Why are some email fields empty?** Not every release publishes contact
details; short distributor releases often end at the SOURCE line with no
email or phone at all.

**What is `publishedAt`'s time zone?** Releases are stamped with US Eastern
Time; the offset (-04:00 in summer, -05:00 in winter) is included, so the
instant is unambiguous.

# Actor input Schema

## `startUrls` (type: `array`):

One PR Newswire page URL per row — category listings, company pages, search pages and direct release URLs can be mixed freely in a single run. Category pages are crawled page by page until the max-items limit or the end of the category.

## `maxItemsPerListing` (type: `integer`):

Stop after this many releases for each listing URL (category / company / search). 0 = scrape the whole listing — beware, large categories hold 30,000+ releases. Direct release URLs are always scraped regardless of this value.

## `fetchFullText` (type: `boolean`):

Open every release page to get the full body, images, source company, dateline and contact details. When off, only the listing data is returned (title, timestamp, summary) — much cheaper, useful for monitoring.

## `maxConcurrency` (type: `integer`):

How many release pages to fetch at the same time. Higher values finish faster but send more parallel requests. Listing pages are always fetched one at a time.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.prnewswire.com/news-releases/computer-software-latest-news/software-list/"
  ],
  "maxItemsPerListing": 100,
  "fetchFullText": true,
  "maxConcurrency": 4
}
```

# Actor output Schema

## `results` (type: `string`):

Press release records stored in the run's default dataset

# 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 = {
    "startUrls": [
        "https://www.prnewswire.com/news-releases/computer-software-latest-news/software-list/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kibaale/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 = { "startUrls": ["https://www.prnewswire.com/news-releases/computer-software-latest-news/software-list/"] }

# Run the Actor and wait for it to finish
run = client.actor("kibaale/pr-newswire-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 '{
  "startUrls": [
    "https://www.prnewswire.com/news-releases/computer-software-latest-news/software-list/"
  ]
}' |
apify call kibaale/pr-newswire-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kibaale/pr-newswire-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/ISWWYNeNabZT72Vz0/builds/AYqNY3tHVYhY1rjzO/openapi.json
