# GlobeNewswire Press Releases Scraper (`scrapyx/globenewswire-press-releases-scraper`) Actor

Fetches company press releases from GlobeNewswire's public RSS feeds -- title, summary, issuing company, publisher, subjects and keywords -- either the latest across all of GlobeNewswire or narrowed by keyword/company/ticker search terms.

- **URL**: https://apify.com/scrapyx/globenewswire-press-releases-scraper.md
- **Developed by:** [Ibnu Adzim](https://apify.com/scrapyx) (community)
- **Categories:** News, Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 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.
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?

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

## GlobeNewswire Press Releases Scraper

Fetches company press releases from GlobeNewswire's public RSS feeds --
either the latest across all of GlobeNewswire, or narrowed by one or more
keyword/company/ticker search terms, each with its own result set.

### What you get

One `SEARCH_SUMMARY` row per query plus one `PRESS_RELEASE` row per release,
most-recent-first:

- `releaseTitle`, `releaseSummary`, `releaseUrl`
- `releaseContent` -- the complete press release body,
  fetched from the release's own detail page (on by default, one extra
  request per release; see "Full body" below)
- `releaseCompany` -- the issuing organization (upstream's `dc:contributor`)
- `releasePublisher`, `releasePublishedAt`, `releaseModifiedAt`
- `releaseSubjects` / `releaseKeywords` -- upstream's own topic tags
- `releaseId`, `releaseLanguage`

### Query modes

Leave `keywords` empty to fetch the latest 20 press releases across all of
GlobeNewswire. Add one or more keywords (company name, ticker, industry
term) to instead fetch the latest 20 matching each one -- each keyword gets
its own `SEARCH_SUMMARY` row. A keyword with no matches returns a genuinely
empty result (verified during recon: 0 overlap with the "latest" feed for a
nonsense keyword), not a silent fallback to the unfiltered list.

### The feed window: 20 items, no pagination

Every GlobeNewswire RSS response documents itself as "Contains the last 20
releases" and recon found no working page/offset parameter. This actor does
not offer one because it could not honestly serve it -- `maxItemsPerQuery`
only caps *below* that 20-item ceiling, it cannot raise it. Run this actor
on a schedule and de-duplicate downstream on `releaseId` if you want an
accumulating history.

### No WAF, no auth

Both the RSS feed and the `news-release/*.html` detail page answered clean
on every TLS profile tested (chrome124, firefox133, safari17\_0,
chrome99\_android), cold, no warmup. robots.txt's `User-agent: *` group
disallows `/newsroom/rss/`, `/search`, `/api/` and several other paths, but
**not** `/RssFeed/` (a distinct, undocumented path this actor uses) and
explicitly `Allow: /news-release/`. See CRAWLING\_METHOD.md for the full
robots.txt capture and the policy reasoning.

### Full body: fetched from the detail page, not from RSS or JSON-LD

The RSS `<description>` is only a short summary, and (checked this session)
the detail page's own `NewsArticle` JSON-LD also only repeats that same
summary -- neither carries the full release text. The complete body DOES
exist on the detail page itself, in a plain HTML container
(`div.main-body-container.article-body`), found by grepping a live page for
body-like class names rather than assuming JSON-LD was the only structured
option. Verified against 3 different releases (2,429 / 2,809 / 5,325
characters, genuinely complete start-to-boilerplate-contact-info). On by
default (`includeFullBody`) -- turning it off saves one request per release
if only the summary/metadata is needed.

### Known limits

- No fetch of each release's detail page for the fuller `NewsArticle`
  JSON-LD (author org URL, dateline location) -- the body-text fetch above
  already visits that page, so this would be free to add later, just not
  built this session.
- On rare non-standard release templates, the body container may not be
  found -- handled explicitly with a `releaseContentFetchError` field on that
  row rather than a silent null (verified: 0 misses across every sample
  checked during recon, but the field exists so a future miss is visible,
  not invisible).

# Actor input Schema

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

One search per entry, each with its own SEARCH\_SUMMARY row -- e.g. a company name, ticker, or industry term. Verified during recon: a keyword with no matches returns 0 releases honestly, never the unfiltered 'latest' feed. Leave empty to fetch the latest press releases across all of GlobeNewswire instead.

## `maxItemsPerQuery` (type: `integer`):

Cap on returned releases per keyword (or per the 'latest' fetch). Set to 0 for unlimited -- in practice this just means 'everything the feed returns', since GlobeNewswire's RSS itself is hard-capped at the 20 most recent matches with no pagination parameter (verified during recon).

## `includeFullBody` (type: `boolean`):

Fetch each release's own detail page and extract the complete press release text and HTML (RSS's own <description> is only a short summary). On by default -- the full release text is the main reason to use this actor. Adds one extra request per release; set to false only to save payload weight/requests when the summary alone is enough.

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

Upper bound on requests in flight at once across all keyword queries and detail-page fetches.

## `minRequestInterval` (type: `number`):

Shared pacing floor across all requests this run makes, independent of 'Max concurrent requests'. robots.txt sets no Crawl-delay for this host; the default is this portfolio's own politeness baseline, not a site requirement.

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

No bot-mitigation gate was observed anywhere in recon (4 TLS profiles clean, cold, on both the RSS feed and the news-release detail page). Residential is still this portfolio's standard cloud default.

## Actor input object example

```json
{
  "keywords": [
    "artificial intelligence"
  ],
  "maxItemsPerQuery": 0,
  "includeFullBody": true,
  "maxConcurrency": 5,
  "minRequestInterval": 0.25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `items` (type: `string`):

One row per scraped record. See the dataset's default view for field definitions.

# 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": [
        "artificial intelligence"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapyx/globenewswire-press-releases-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": ["artificial intelligence"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapyx/globenewswire-press-releases-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": [
    "artificial intelligence"
  ]
}' |
apify call scrapyx/globenewswire-press-releases-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapyx/globenewswire-press-releases-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/iGS3IPLEKvq537fvk/builds/3gedcrgCnnaBy1EWX/openapi.json
