# RSS Feed Reader: Atom Feed and JSON Feed in One List (`bepolabs/rss-reader`) Actor

Point it at a newsroom and get one row per entry: headline, link, publish date, author, summary and the body on request. Costs 0.92 USD per 1,000 items.

- **URL**: https://apify.com/bepolabs/rss-reader.md
- **Developed by:** [BEPO Labs](https://apify.com/bepolabs) (community)
- **Categories:** News, AI, Developer tools
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.92 / 1,000 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

### 📰 What is RSS Feed Reader?

Follow dozens of publishers in one run, with duplicates removed. A homepage address is enough, as the Actor looks up the RSS feed the page announces. RSS 2.0, RSS 1.0, Atom and JSON Feed share the same fields, so spreadsheets, newsletters and AI pipelines ignore the format. Switch on full text to add each article as Markdown for LLMs.

- **News and media monitoring**: follow hundreds of sources in one dataset and filter by keyword or date
- **Content for AI and RAG**: feed full article text as Markdown into ChatGPT, Claude, LangChain or a vector database
- **Newsletters and digests**: collect the week's posts from your favourite blogs in one run
- **Competitor and brand tracking**: watch competitors' blogs and press pages and get alerted on new posts
- **Research and archives**: build a dated archive of everything a source publishes

![RSS Feed Reader: Any RSS, Atom or JSON feed, or just a website URL, to one clean list of articles, with full text on request.](https://api.apify.com/v2/key-value-stores/wdeAWGooHdIhvFgSY/records/rss-reader-hero.png)

#### ✨ Why use this Actor?

- ✅ **Website URL is enough**: no need to hunt for the feed: the Actor reads the feed link the home page announces
- ✅ **One format for every feed**: RSS 2.0, RSS 1.0, Atom and JSON Feed mapped to the same fields
- ✅ **Body copy on request**: the main content of each post as Markdown with a word count
- ✅ **No duplicates**: items with the same URL count once, across all your sources
- ✅ **Polite crawling**: robots.txt respected for article pages, retries with backoff, one dead feed never stops the run
- ✅ **Cheap**: 0.92 USD per 1,000 items, nothing for failed sources

### 📦 What data can you get with RSS Feed Reader?

| | | |
|---|---|---|
| 📰 Title | 🔗 Article URL | 🆔 GUID |
| 📅 Published and updated date (ISO) | ✍️ Author | 🏷️ Categories and tags |
| 📝 Summary (plain text) | 🖼️ Image | 📄 Full article text (Markdown) |
| 🔢 Word count | 🌐 Language | 📡 Feed title, feed URL and site URL |

### 🚀 How to use RSS Feed Reader

RSS Feed Reader works in a few clicks, no coding needed:

1. [Create a free Apify account](https://console.apify.com/sign-up) (the free plan includes 5 USD of monthly credit).
2. Open [RSS Feed Reader](https://apify.com/bepolabs/rss-reader) and click **Try for free**.
3. Paste your feed or website URLs and set how many items per feed you want. Switch on full text if you need the body.
4. Click **Start** and wait for the run to finish (most runs take seconds).
5. Download your data as JSON, CSV, Excel, XML or HTML, or send it straight to Google Sheets, Make, Zapier or your AI agent.

![How RSS Feed Reader works](https://api.apify.com/v2/key-value-stores/wdeAWGooHdIhvFgSY/records/rss-reader-workflow.png)

### ⬇️ Input

Add feed addresses, websites or single article links, up to 500 per run. Everything else is optional.

##### Feed, website or article?

A **feed URL** is read directly. A **website** works too: the Actor follows the feed the page announces (`<link rel="alternate">`). An **article** without a feed becomes one item with its text.

##### Full text

Switch on `fullText` to fetch each article page and add `fullText` (Markdown) and `wordCount`. Pages whose robots.txt disallows it are marked and skipped.

##### Filters

Keep only recent items with `since`, only matching ones with `keyword` (all words must appear in title, summary or categories), and cap each feed with `maxItemsPerFeed`.

| Field | Type | What it does | Default |
|---|---|---|---|
| **URLs** (`urls`) | array | Feed URLs (RSS, Atom, JSON Feed), website URLs (the feed the page announces is used) or article URLs (one item each). | `["https://blog.cloudflare.com/rss/","htt` |
| **Full article text** (`fullText`) | boolean | Fetch each item's page and add its main text as clean Markdown (fullText, wordCount). | `false` |
| **Published since** (`since`) | string | Keep items published on or after this date, e.g. |  |
| **Keyword** (`keyword`) | string | Keep items whose title, summary or categories contain all these words. |  |
| **Maximum items per feed** (`maxItemsPerFeed`) | integer | Cap per feed after the filters. | `50` |
| **Maximum retries** (`maxRetries`) | integer | Retries per request with exponential backoff on network errors, 429 and 5xx. | `3` |

![RSS Feed Reader input form](https://api.apify.com/v2/key-value-stores/wdeAWGooHdIhvFgSY/records/rss-reader-input.png)

#### Input example

```json
{
    "urls": [
        "https://blog.cloudflare.com/rss/",
        "https://www.theverge.com/rss/index.xml",
        "https://daringfireball.net/feeds/json"
    ],
    "maxItemsPerFeed": 10
}
```

### ⬆️ Output

Every article becomes one row with the same fields, whatever the feed format. The run summary in the key-value store (`OUTPUT`) lists each source with the items found and kept, and the error if one failed.

![RSS Feed Reader output table](https://api.apify.com/v2/key-value-stores/wdeAWGooHdIhvFgSY/records/rss-reader-output.png)

#### Output example

One row of the dataset (Cloudflare Blog, long text shortened):

```json
{
    "title": "Inside Hyperdrive: How we solved a rare Hyperdrive MySQL caching bug",
    "url": "https://blog.cloudflare.com/hyperdrive-mysql/",
    "guid": "01M4VK1MXKAPMWG5QXYBFK222G",
    "publishedAt": "2026-10-14T13:00:00.000Z",
    "updatedAt": null,
    "author": "Pranoy Dutta",
    "categories": [
        "Hyperdrive",
        "MySQL",
        "Workers"
    ],
    "summary": "While adding MySQL support to Hyperdrive, we found a subtle protocol bug when caching query results. Here is how we tracked down a 0.001% rate error and made Hyperdrive MySQL generally available.",
    "image": "https://blog.cloudflare.com/_emdash/api/media/file/01M4VK1DV41VQ8EZCK68R7E0CS.png",
    "contentText": "Hyperdrive support for MySQL is now generally available (GA). Hyperdrive, Cloudflare’s database connection pooler for Workers, initially only supported Postgres. Since we announced the beta for MySQL...",
    "contentWordCount": 1884,
    "feedTitle": "Cloudflare Blog",
    "feedUrl": "https://blog.cloudflare.com/rss/",
    "siteUrl": "https://blog.cloudflare.com/",
    "source": "https://blog.cloudflare.com/rss/",
    "sourceKind": "feed"
}
```

View the results as a table or JSON in the Output tab and download them as JSON, CSV, Excel, XML, HTML or RSS, all fields or only those you pick.

#### ⚠️ Error items

An input that cannot be read does not stop the run and is never charged: it gets a row with an `error` field so you can see exactly what failed.

| Error | Meaning |
|---|---|
| `HTTP 404 / 410` | The feed or page no longer exists |
| `Not a feed` | The URL answered, but with no feed and no article text |
| `blocked by robots.txt` | Full text was requested, but the site does not allow it; the item is kept without full text |

### 💰 How much does RSS Feed Reader cost?

RSS Feed Reader is priced **per event**: **0.92 USD per 1,000 items** (0.00092 USD per item), with no monthly rental. Charged for each row saved to the dataset; feeds that fail cost nothing.

| You get | You pay |
|---|---|
| 100 items | 0.09 USD |
| 1,000 items | 0.92 USD |
| 10,000 items | 9.2 USD |
| 100,000 items | 92 USD |

💡 Apify's free plan gives you 5 USD of credit every month, enough for about **5,434 items** at no cost. Set a spending limit per run and the Actor stops there.

### ⚖️ RSS Feed Reader vs. the alternatives

| | RSS Feed Reader | Basic RSS scrapers | Feed reader apps |
|---|---|---|---|
| **RSS, Atom and JSON Feed** | ✅ all four | often RSS only | ✅ |
| **Website URL instead of feed URL** | ✅ finds the feed | ❌ | ✅ |
| **Full article text as Markdown** | ✅ | ❌ | paid plans |
| **Dedupe across sources** | ✅ | ❌ | ✅ |
| **API, schedules and MCP for AI agents** | ✅ | ✅ | ❌ |

### 🔌 Integrations, API and MCP

#### Connect RSS Feed Reader to your AI agent (MCP)

Give Claude, ChatGPT, Cursor or any MCP client direct access to RSS Feed Reader through the [Apify MCP server](https://mcp.apify.com). Add this URL to its settings:

```text
https://mcp.apify.com/?actors=bepolabs/rss-reader
```

For Claude Desktop, add it under `mcpServers` in `claude_desktop_config.json`:

```json
{
    "mcpServers": {
        "rss-reader": {
            "command": "npx",
            "args": [
                "-y",
                "@apify/actors-mcp-server",
                "--actors",
                "bepolabs/rss-reader"
            ],
            "env": {
                "APIFY_TOKEN": "<your Apify API token>"
            }
        }
    }
}
```

Then ask: *"Read the latest 20 posts from the Cloudflare and GitHub blogs and summarise what is new this week."*

#### Run it from your code

Python (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("bepolabs/rss-reader").call(run_input={"urls":["https://blog.cloudflare.com/rss/","https://www.theverge.com/rss/index.xml","https://daringfireball.net/feeds/json"],"maxItemsPerFeed":10})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

JavaScript (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('bepolabs/rss-reader').call({"urls":["https://blog.cloudflare.com/rss/","https://www.theverge.com/rss/index.xml","https://daringfireball.net/feeds/json"],"maxItemsPerFeed":10});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### No-code integrations

Send results to **Google Sheets, Slack, Airtable, HubSpot, Make, Zapier, n8n** and more from the Integrations tab, start runs on a **schedule**, or trigger your own endpoint with a **webhook** when a run finishes. The [Apify API](https://docs.apify.com/api/v2) gives you full control over runs and datasets.

### ❓ FAQ

##### Which feed formats are supported?

RSS 2.0, RSS 1.0 (RDF), Atom and JSON Feed. All of them come out with the same fields.

##### Do I need the exact feed URL?

No. A website URL is enough when its pages announce a feed, as almost every blog and news page does.

##### How do I get only new articles?

Use `since` with a date, or schedule the Actor daily and keep only items newer than your last run.

##### Can I get the full article text?

Yes, switch on `fullText`. The main text is extracted as clean Markdown with a word count, ready for LLMs and RAG.

##### How many feeds can I read in one run?

Up to 500 URLs per run, with up to `maxItemsPerFeed` items each (default 50).

##### Is it legal to use RSS Feed Reader?

RSS and Atom feeds are published so that readers and apps can follow them; reading them is their intended use. For full article text the Actor respects each site's robots.txt and skips pages that disallow it. Articles are copyrighted by their publishers: you are responsible for how you use and republish it.

##### What if something is missing or does not work?

Open an issue on the **Issues** tab; we read each one and reply. Feature requests are welcome too.

### 💬 Your feedback

Tell us what RSS Feed Reader should add on the **Issues** tab or leave a review; your notes decide what we work on next.

### 🔗 Related Actors

| Actor | What it does |
|---|---|
| 🦋 [Bluesky Posts](https://apify.com/bepolabs/bluesky-posts) | Bluesky posts for any search or handle with text, date, author, likes, reposts, replies, links and hashtags. No login. |
| 🟧 [Hacker News Search](https://apify.com/bepolabs/hacker-news) | Hacker News stories, comments, Ask HN, Show HN and jobs for any search, with points, comment count, date and text. |
| 🎙️ [Podcast Episodes](https://apify.com/bepolabs/podcast-episodes) | Search terms, Apple Podcasts ids or RSS feeds to every show and its episodes, with audio links, dates and durations. |
| 📈 [Google Trends Scraper](https://apify.com/bepolabs/google-trends) | Interest over time for up to five keywords on one 0 to 100 scale, any country or worldwide, plus top and rising related queries. |
| 🔤 [Image OCR](https://apify.com/bepolabs/image-ocr) | Extract text from images in 29 languages: plain text, clean Markdown and every word with its pixel box and confidence. |
| 🎙️ [Audio and Video Transcriber](https://apify.com/bepolabs/media-transcriber) | Whisper transcripts of audio and video files: full text, timed segments, SRT and WebVTT. No API key. |
| 📄 [PDF to Text and Markdown](https://apify.com/bepolabs/pdf-to-text) | PDFs to clean text and Markdown, per page, per document or as RAG chunks, with columns in reading order and headers and footers removed. |
| 🌍 [Remote Jobs](https://apify.com/bepolabs/remote-jobs) | Remote jobs from Remote OK, Himalayas, Jobicy and Arbeitnow in one deduped feed, with salary, posted date and apply link. |

# Changelog

This Actor's version history is a separate document: https://apify.com/bepolabs/rss-reader/changelog.md

# Actor input Schema

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

Feed URLs (RSS, Atom, JSON Feed), website URLs (the feed the page announces is used) or article URLs (one item each). Up to 500.

## `fullText` (type: `boolean`):

Fetch each item's page and add its main text as clean Markdown (fullText, wordCount). Pages robots.txt disallows are skipped and marked.

## `since` (type: `string`):

Keep items published on or after this date, e.g. 2026-10-01.

## `keyword` (type: `string`):

Keep items whose title, summary or categories contain all these words.

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

Cap per feed after the filters.

## `maxRetries` (type: `integer`):

Retries per request with exponential backoff on network errors, 429 and 5xx.

## Actor input object example

```json
{
  "urls": [
    "https://blog.cloudflare.com/rss/",
    "https://simonwillison.net/"
  ],
  "fullText": false,
  "maxItemsPerFeed": 50,
  "maxRetries": 3
}
```

# Actor output Schema

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

Dataset items, one row per result, in the overview table view.

# 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 = {
    "urls": [
        "https://blog.cloudflare.com/rss/",
        "https://simonwillison.net/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bepolabs/rss-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 = { "urls": [
        "https://blog.cloudflare.com/rss/",
        "https://simonwillison.net/",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("bepolabs/rss-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 '{
  "urls": [
    "https://blog.cloudflare.com/rss/",
    "https://simonwillison.net/"
  ]
}' |
apify call bepolabs/rss-reader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bepolabs/rss-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/6kF5ULbHWNV8Faaze/builds/ECvAn9bK2WeEdd8xP/openapi.json
