# RSS Feed Reader (`maximedupre/rss-feed-reader`) Actor

Read public RSS, Atom, RDF, and JSON Feed URLs. Export feed item titles, links, dates, authors, categories, content, images, enclosures, and source metadata for API workflows, schedules, and dataset exports.

- **URL**: https://apify.com/maximedupre/rss-feed-reader.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 parsed 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.
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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

### 📡 RSS feed reader for clean feed data

RSS Feed Reader reads public RSS, Atom, RDF, and JSON Feed URLs and saves each feed item as a clean Apify dataset row. Add one feed URL or a whole list of feeds, then export titles, links, dates, authors, categories, summaries, content, images, enclosures, feed metadata, and scrape timestamps.

Use it when you already know the feed URLs you want to follow, such as a news RSS feed, a blog Atom feed, a Hacker News feed, or a JSON Feed endpoint like [jsonfeed.org](https://www.jsonfeed.org/). Start with the prefilled feeds and a small total limit, check the rows, then raise the limits or schedule repeat runs for monitoring.

The Actor is built for feed parsing, feed monitoring, content aggregation, and downstream API workflows. It does not crawl article pages or discover feeds from websites; it reads the feed content that each public feed exposes.

### ✅ What this RSS feed reader does

- Reads one or many public feed URLs in one run.
- Supports RSS 2.0, Atom, RSS 1.0/RDF, and JSON Feed.
- Saves one dataset item per accepted feed item.
- Extracts item title, URL, GUID, publication date, update date, author, categories, summary, content, image URL, and enclosures when the feed provides them.
- Keeps feed-level context such as feed URL, feed title, feed description, feed home URL, feed type, and source order.
- Adds a stable `itemKey` for downstream dedupe in scheduled runs.
- Lets you cap items per feed and total items across the run.
- Lets you keep only items published on or after a date when the feed includes dates.
- Continues through the rest of your list when one feed is unavailable, malformed, empty, or blocked.
- Works with Apify dataset exports, API access, schedules, webhooks, and integrations.

### 📦 Feed data you can extract

Each output row represents one parsed feed item.

| Data group | Example fields |
| --- | --- |
| Feed context | `feedUrl`, `feedIndex`, `feedTitle`, `feedDescription`, `feedHomeUrl`, `feedType` |
| Item identity | `title`, `url`, `guid`, `rawId`, `itemKey`, `itemIndexInFeed` |
| Dates and authors | `publishedAt`, `updatedAt`, `rawDateText`, `author`, `authors` |
| Content | `summaryText`, `summaryHtml`, `contentText`, `contentHtml`, `categories` |
| Media | `imageUrl`, `enclosures` |
| Run metadata | `status`, `scrapedAt` |

Feed formats vary. Some feeds include full HTML content, some include only summaries, and some omit authors, dates, images, or enclosures. Missing optional values are returned as `null` or an empty array instead of guessed data.

### 🎯 Common use cases

- Monitor news, blogs, changelogs, newsletters, podcasts, or community feeds.
- Build a feed aggregation dataset from many RSS or Atom URLs.
- Export new feed items for spreadsheets, BI tools, alerts, LLM workflows, or databases.
- Schedule repeat runs and dedupe by `itemKey`, `guid`, `url`, or publication date.
- Convert RSS, Atom, RDF, or JSON Feed content into JSON, CSV, Excel, XML, or HTML exports.
- Keep source feed metadata attached to each item for traceability.

### 🚀 How to run it

1. Open the Input tab.
2. Add one feed URL per line in `Feed URLs`.
3. Optional: set `Published after` to keep newer items only when feed dates are available.
4. Set `Maximum items per feed` and `Maximum items total` to control run size and cost.
5. Start the Actor and open the dataset, or fetch the same rows through the Apify API.

For a small first run, keep the prefilled feed URLs and leave `Maximum items total` at `25`.

### ✍️ Input example

```json
{
	"feedUrls": [
		"https://hnrss.org/frontpage",
		"https://feeds.bbci.co.uk/news/rss.xml",
		"https://www.jsonfeed.org/feed.json"
	],
	"publishedAfter": "2026-06-01",
	"maxItemsPerFeed": 15,
	"maxTotalItems": 25
}
````

### 🧾 Output example

```json
{
	"type": "feed_item",
	"status": "ok",
	"feedUrl": "https://hnrss.org/frontpage",
	"feedIndex": 1,
	"feedTitle": "Hacker News: Front Page",
	"feedDescription": "Links for the intellectually curious, ranked by readers.",
	"feedHomeUrl": "https://news.ycombinator.com/",
	"feedType": "rss",
	"itemIndexInFeed": 1,
	"title": "Example feed item",
	"url": "https://example.com/article",
	"guid": "https://news.ycombinator.com/item?id=123456",
	"itemKey": "https://hnrss.org/frontpage|https://news.ycombinator.com/item?id=123456|https://example.com/article|Example feed item|2026-06-13T12:00:00.000Z",
	"publishedAt": "2026-06-13T12:00:00.000Z",
	"updatedAt": null,
	"author": "Example author",
	"authors": ["Example author"],
	"categories": ["Technology"],
	"summaryText": "Short item summary.",
	"summaryHtml": "<p>Short item summary.</p>",
	"contentText": "Full feed-provided content.",
	"contentHtml": "<p>Full feed-provided content.</p>",
	"imageUrl": "https://example.com/image.jpg",
	"enclosures": [
		{
			"url": "https://example.com/audio.mp3",
			"type": "audio/mpeg",
			"length": "123",
			"title": null
		}
	],
	"rawDateText": "Sat, 13 Jun 2026 12:00:00 GMT",
	"rawId": "https://news.ycombinator.com/item?id=123456",
	"scrapedAt": "2026-06-13T12:30:00.000Z"
}
```

### 💸 Pricing

This Actor uses pay-per-event pricing. You are charged for each feed item saved. Runs that skip an unavailable or empty feed do not save a placeholder row for that feed.

Use `Maximum items per feed` and `Maximum items total` to control cost before running larger feed lists.

### ⚠️ Limits and caveats

- Only public HTTP and HTTPS feed URLs are supported.
- Private, authenticated, paywalled, or cookie-protected feeds are not supported.
- The Actor reads feed-provided content only. It does not open each article URL to extract full webpage text.
- The `Published after` filter depends on dates exposed by the feed. Undated items are kept by default so sparse feeds can still return useful rows.
- Some feeds block automated access or return malformed XML/JSON. The Actor skips those feeds and continues with the rest of the run.
- Feed order and item order are preserved in `feedIndex` and `itemIndexInFeed`. Parallel fetching can make dataset save order differ from input order.

### ❓ FAQ

#### 🔌 Can I use this as an RSS feed parser API?

Yes. Run the Actor through the Apify API with your feed URLs, then read the default dataset items as JSON or export them in another supported dataset format.

#### 🧩 Does it support Atom and JSON Feed?

Yes. The Actor supports RSS 2.0, Atom, RSS 1.0/RDF, and JSON Feed. The detected format is returned in `feedType`.

#### 📰 Can it scrape the full article behind each feed item URL?

No. This Actor parses feed payloads. It returns full content only when the feed itself includes full content. Crawling article pages is a separate scraping job.

#### ⚠️ What happens when one feed fails?

The run keeps going. Failed, empty, blocked, or malformed feeds are reported in logs, while successful feed items from other feeds are still saved.

### 📝 Changelog

- 0.1: Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~rss-feed-reader/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Other actors

- [Reddit Scraper ↗](https://apify.com/maximedupre/reddit-scraper) - Search Reddit posts and comments for topic monitoring.
- [Reddit Comments Search Scraper ↗](https://apify.com/maximedupre/reddit-comments-search-scraper) - Export public Reddit comments by keyword or subreddit.
- [Telegram Channel Messages Scraper ↗](https://apify.com/maximedupre/telegram-channel-messages-scraper) - Collect public Telegram channel posts for monitoring and research.
- [Quora Search Scraper ↗](https://apify.com/maximedupre/quora-search-scraper) - Find public Quora questions, answers, profiles, topics, spaces, and posts.
- [Stocktwits Scraper ↗](https://apify.com/maximedupre/stocktwits-scraper) - Track public Stocktwits messages, sentiment, cashtags, and trending symbols.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Enter one feed URL per line. RSS, Atom, RDF, and JSON Feed URLs are accepted.

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

Optional. Keep feed items published on or after this date.

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

Maximum feed items to save from each submitted feed.

## `maxTotalItems` (type: `integer`):

Maximum feed items to save across the whole run.

## Actor input object example

```json
{
  "feedUrls": [
    "https://hnrss.org/frontpage",
    "https://feeds.bbci.co.uk/news/rss.xml",
    "https://www.jsonfeed.org/feed.json"
  ],
  "maxItemsPerFeed": 15,
  "maxTotalItems": 25
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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://hnrss.org/frontpage",
        "https://feeds.bbci.co.uk/news/rss.xml",
        "https://www.jsonfeed.org/feed.json"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/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://hnrss.org/frontpage",
        "https://feeds.bbci.co.uk/news/rss.xml",
        "https://www.jsonfeed.org/feed.json",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/rss-feed-reader").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 '{
  "feedUrls": [
    "https://hnrss.org/frontpage",
    "https://feeds.bbci.co.uk/news/rss.xml",
    "https://www.jsonfeed.org/feed.json"
  ]
}' |
apify call maximedupre/rss-feed-reader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=maximedupre/rss-feed-reader",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "RSS Feed Reader",
        "description": "Read public RSS, Atom, RDF, and JSON Feed URLs. Export feed item titles, links, dates, authors, categories, content, images, enclosures, and source metadata for API workflows, schedules, and dataset exports.",
        "version": "0.1",
        "x-build-id": "HCenT75jgtN8LwY4h"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~rss-feed-reader/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-rss-feed-reader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/maximedupre~rss-feed-reader/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-rss-feed-reader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/maximedupre~rss-feed-reader/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-rss-feed-reader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "feedUrls"
                ],
                "properties": {
                    "feedUrls": {
                        "title": "Feed URLs",
                        "type": "array",
                        "description": "Enter one feed URL per line. RSS, Atom, RDF, and JSON Feed URLs are accepted.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "publishedAfter": {
                        "title": "Published after",
                        "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                        "type": "string",
                        "description": "Optional. Keep feed items published on or after this date."
                    },
                    "maxItemsPerFeed": {
                        "title": "Maximum items per feed",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum feed items to save from each submitted feed.",
                        "default": 15
                    },
                    "maxTotalItems": {
                        "title": "Maximum items total",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum feed items to save across the whole run.",
                        "default": 25
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
