# RSS Feed Scraper: RSS to JSON & Google News RSS (`sysco32/rss-feed-reader`) Actor

Feed parser for any RSS, Atom or JSON Feed, Google News RSS, or just a website URL (feeds are auto-discovered). Clean items: title, link, date, author, summary, full text, images. Keyword and date filters plus an only-new-items news feed monitor. $0.30 per 1,000 items.

- **URL**: https://apify.com/sysco32/rss-feed-reader.md
- **Developed by:** [Gabor Sziladi](https://apify.com/sysco32) (community)
- **Categories:** News, Automation, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.30 / 1,000 feed items

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

## RSS Feed Reader & Monitor: RSS, Atom & JSON Feed to JSON

Read any **RSS**, **Atom** or **JSON Feed**, or just paste a **website URL** and let the Actor discover its feed, and get clean, normalized items with the same fields for every source: title, link, published date, author, summary, full text, categories, image and enclosures (podcast audio, video). Add keyword and date filters, or switch on **Only new items** to use it as a feed monitor for alerts, Slack or newsletters.

- ✅ RSS 0.9x/1.0/2.0, Atom and **JSON Feed**, including gzip and odd encodings
- ✅ **Feed auto-discovery** from a homepage or article URL (`<link rel="alternate">` and common feed paths)
- ✅ One clean schema: dates in ISO 8601 UTC, HTML turned into plain text, plus the original HTML
- ✅ **Keyword include/exclude filters**, max age in days, or a published-after date
- ✅ **Only new items** monitoring with a stable `item_key` per item. You only pay for new items.
- ✅ Many feeds per run, read in parallel. A broken feed is reported in `OUTPUT` and doesn't fail the run.

### Input examples

Three news feeds (default):

```json
{
  "feedUrls": [
    "https://feeds.bbci.co.uk/news/world/rss.xml",
    "https://github.blog/feed/",
    "https://www.nasa.gov/feed/"
  ],
  "maxItemsPerFeed": 20
}
```

A keyword alert across websites (schedule it every 15 minutes):

```json
{
  "feedUrls": [
    "https://www.theverge.com",
    "https://techcrunch.com",
    "https://hnrss.org/frontpage"
  ],
  "keywords": [
    "openai",
    "nvidia"
  ],
  "onlyNewItems": true,
  "stateStoreName": "ai-news-alert"
}
```

Only the last 2 days, without full content:

```json
{
  "feedUrls": [
    "https://simonwillison.net/"
  ],
  "maxAgeDays": 2,
  "includeContent": false
}
```

### Output example (real run)

```json
{
  "feed_url": "https://www.nasa.gov/feed/",
  "source_url": null,
  "feed_title": "NASA",
  "feed_link": "https://www.nasa.gov",
  "feed_format": "rss20",
  "title": "APOD: 2026 October 25 – Dark Matter in a Simulated Universe",
  "link": "https://science.nasa.gov/image-article/apod-2026-october-25-dark-matter-in-a-simulated-universe/",
  "published_at": "2026-10-25T08:19:48Z",
  "updated_at": "2026-10-25T08:19:48Z",
  "author": null,
  "summary": "APOD Science APOD APOD: 2026 October 25 – Dark… Today’s APOD Archive Submissions Index Search Calendar RSS Education About Discuss APOD Astronomy Picture of the Day Discover the cosmos! Each day a different image or phot…",
  "content_text": "APOD Science APOD APOD: 2026 October 25 – Dark… Today’s APOD Archive Submissions Index Search Calendar RSS Education About Discuss APOD Astronomy Picture of the Day Discover the cosmos! Each day a different image or phot…",
  "categories": [
    "APOD"
  ],
  "image_url": null,
  "enclosures": [],
  "comments_url": null,
  "guid": "https://science.nasa.gov/image-article/apod-2026-october-25-dark-matter-in-a-simulated-universe/",
  "item_key": "e8892bef5fd1218d",
  "language": "en-US",
  "scraped_at": "2026-10-25T19:25:42Z"
}
```

With **Include full content** on, items also have `content_html`. Use the **Feed items** or **Full content** views, or export to JSON, CSV, Excel or XML.

### Pricing

Pay per event, no subscription:

| Event | Price |
|---|---|
| Feed item | **$0.0003** ($0.30 per 1,000) |
| Actor start (per run) | $0.002 |

The default run (3 feeds, up to 60 items) costs about $0.02. Filtered and already-seen items are never charged.

### Use cases

- **News and brand monitoring**: keyword alerts from news sites, blogs and Google Alerts RSS.
- **Content aggregation**: feed a website, newsletter or app with fresh articles from many sources.
- **AI and RAG pipelines**: clean, deduplicated article text with links and dates.
- **Automation**: connect to Make, Zapier, n8n, Slack or Google Sheets through Apify integrations and webhooks.
- **Podcast and video feeds**: enclosures with media URLs, types and sizes.

### FAQ

**Do I need the exact feed URL?** No. Paste a homepage or article URL and the Actor finds the feed through `<link rel="alternate">` tags and common paths like `/feed`, `/rss.xml` and `/atom.xml`. The feed that was used is in `feed_url`, and the URL you entered is in `source_url`.

**How does Only new items work?** Each item gets a stable `item_key` (from its GUID or link). Keys already delivered are stored per feed in a named key-value store (`stateStoreName`), so scheduled runs return only items published since the last run. The first run returns current items, and every entry in the feed is marked as seen.

**Does it scrape full articles?** It returns what the feed contains. Many feeds include full content, others only a summary. To fetch full pages, chain it with a web scraper using the `link` field.

**Which dates are used?** `published_at` comes from the item's published date, or its updated date when that's missing. All dates are normalized to UTC.

### Related actors

More Actors by the same author:

- [Substack Scraper (sysco32/substack-newsletter-scraper)](https://apify.com/sysco32/substack-newsletter-scraper): posts, likes, comments and full text of free posts from any public Substack newsletter.
- [Hacker News Scraper & Who Is Hiring Jobs Parser (sysco32/hacker-news-scraper)](https://apify.com/sysco32/hacker-news-scraper): HN stories, search and comments, plus the monthly "Who is hiring?" thread parsed into structured jobs.
- [Sitemap URL Extractor (sysco32/sitemap-url-extractor)](https://apify.com/sysco32/sitemap-url-extractor): every URL from a website's XML sitemaps, with a new-page monitor.
- [Apple Podcasts Scraper (sysco32/apple-podcasts-scraper)](https://apify.com/sysco32/apple-podcasts-scraper): podcasts by keyword or top chart, enriched from RSS with owner email and activity stats.

### Need a custom scraper or data pipeline?

If you need data from sites without a feed, extra fields, or the results delivered to Google Sheets, a database or an n8n workflow on a schedule, I take custom projects on Fiverr: [Python scraping scripts and n8n automation workflows](https://www.fiverr.com/sysco32/build-python-scraping-scripts-and-n8n-automation-workflows). Public data only; message me with the details first and I'll confirm whether it's doable.

# Actor input Schema

## `feedUrls` (type: `array`):

RSS 2.0, Atom, RDF or JSON Feed URLs. You can also paste a normal website or blog URL: its feed is discovered automatically (from \<link rel="alternate"> tags or common paths like <code>/feed</code> and <code>/rss.xml</code>).

## `maxItemsPerFeed` (type: `integer`):

Newest items first, in feed order.

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

Upper limit for the whole run. 0 = no limit.

## `includeContent` (type: `boolean`):

Add the full article body (<code>content_html</code> and plain <code>content_text</code>) when the feed provides it. Turn off for a compact dataset.

## `discoverFeeds` (type: `boolean`):

When a URL is a web page, find its RSS/Atom feed automatically.

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

Keep only items whose title, summary, content or categories contain at least one of these words, e.g. <code>AI</code>, <code>acquisition</code>, your brand name.

## `excludeKeywords` (type: `array`):

Drop items containing any of these words.

## `maxAgeDays` (type: `integer`):

Keep only items published in the last N days. 0 = no limit.

## `publishedAfter` (type: `string`):

ISO date or date-time, e.g. <code>2026-10-01</code>.

## `onlyNewItems` (type: `boolean`):

Remember the items already delivered for each feed and skip them in later runs. Schedule the Actor (e.g. every hour) and get, and pay for, only new posts. Combine with webhooks, Slack, email or Zapier integrations for alerts.

## `stateStoreName` (type: `string`):

Named key-value store for seen items. Use a different name for each independent monitor.

## Actor input object example

```json
{
  "feedUrls": [
    "https://feeds.bbci.co.uk/news/world/rss.xml",
    "https://github.blog/feed/",
    "https://www.nasa.gov/feed/"
  ],
  "maxItemsPerFeed": 20,
  "maxItems": 0,
  "includeContent": true,
  "discoverFeeds": true,
  "maxAgeDays": 0,
  "onlyNewItems": false,
  "stateStoreName": "rss-feed-reader-seen"
}
```

# Actor output Schema

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

Feed items

## `full` (type: `string`):

Feed items with full content

## `summary` (type: `string`):

Records per task, failed inputs with error messages.

# 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 = {
    "feedUrls": [
        "https://feeds.bbci.co.uk/news/world/rss.xml",
        "https://github.blog/feed/",
        "https://www.nasa.gov/feed/"
    ],
    "maxItemsPerFeed": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("sysco32/rss-feed-reader").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 = {
    "feedUrls": [
        "https://feeds.bbci.co.uk/news/world/rss.xml",
        "https://github.blog/feed/",
        "https://www.nasa.gov/feed/",
    ],
    "maxItemsPerFeed": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("sysco32/rss-feed-reader").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 '{
  "feedUrls": [
    "https://feeds.bbci.co.uk/news/world/rss.xml",
    "https://github.blog/feed/",
    "https://www.nasa.gov/feed/"
  ],
  "maxItemsPerFeed": 20
}' |
apify call sysco32/rss-feed-reader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sysco32/rss-feed-reader"
        }
    }
}
```

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/pvgAkYchJhawBkO7w/builds/xpnZDarbR9V8oRSCS/openapi.json
