# RSS Feed Reader — RSS, Atom & JSON Feed to JSON (`actor-forge/rss-feed-reader`) Actor

Read RSS 2.0, RSS 1.0/RDF, Atom and JSON Feed into clean JSON rows: title, link, author, dates, categories, summary, image, podcast enclosure and duration. Paste a website and its feed is found automatically. Filter by date and keywords, dedupe across feeds. $0.40 per 1,000 items.

- **URL**: https://apify.com/actor-forge/rss-feed-reader.md
- **Developed by:** [ActorForge](https://apify.com/actor-forge) (community)
- **Categories:** News, Developer tools, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 item 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?

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 — RSS, Atom & JSON Feed to JSON

Read RSS 2.0, RSS 1.0/RDF, Atom and JSON Feed into clean JSON rows: title, link, author, dates, categories, summary, image, podcast enclosure and duration. Paste a website and its feed is found automatically. Filter by date and keywords, dedupe across feeds. $0.40 per 1,000 items.

**Turn any RSS, Atom or JSON feed into clean JSON rows.** Paste feed URLs, or just a website or blog address: the feed is **found automatically** from the page's feed link tags, or at the usual paths like /feed and /rss.xml. Every item comes back in one consistent shape, whatever the format (**RSS 2.0, RSS 1.0/RDF, Atom 1.0, JSON Feed 1.1**): title, link, guid, author byline, **published and updated dates normalised to ISO 8601**, categories, a plain-text summary, the item image (media:thumbnail, media:content, itunes:image), plus feed title, link and language. **Podcast feeds** also give you the audio enclosure (URL, type, size), duration in seconds, and episode and season numbers. Optionally add the **full article content** as plain text and HTML. Filter by **publish date** ("7 days", "24 hours" or a date) and **keywords**, take the newest N items per feed, and **remove duplicates across feeds**. Broken markup, CDATA, HTML entities, odd date formats, relative links and non-UTF-8 encodings like windows-1252 are handled for you. Use it for news monitoring, content aggregation, alerting, podcast catalogues, AI agents and RAG pipelines. **$0.40 per 1,000 items**, with only the negligible platform start fee and no compute bill on top. Feeds that fail and duplicates you filter out are never charged.

### What data does it return?

Every run outputs clean, schema-validated rows like these:

| feedTitle | title | link | publishedAt | author | durationSeconds |
| --- | --- | --- | --- | --- | --- |
| BBC News | What we know so far about deadly fire at Canadian military base | https://www.bbc.co.uk/news/articles/cmgelrq8x92do | 2026-10-18T21:23:01.000Z |  |  |
| Hacker News: Front Page | Free Pascal compiler now supports dynamic packages | https://www.getlazarus.org/dynamic/ | 2026-10-18T18:48:04.000Z | sysrpl |  |
| The Daily | Elizabeth Holmes and Nathan Fielder Keep Us Guessing | https://www.nytimes.com/the-daily | 2026-10-18T10:00:00.000Z | The New York Times | 2619 |

### How much does it cost?

Transparent pay-per-event pricing — you only pay for what you get, and the
actor **always respects your run budget**: set a maximum total charge and it
stops cleanly at the cap instead of overrunning.

| Event | Price | Charged | Worked example |
| --- | --- | --- | --- |
| `item-result` | $0.0004 | per feed item delivered (full content, podcast fields and auto-discovery included) | 1,000 items = $0.40; 20 feeds × 50 items = $0.40 |
| `apify-actor-start` | $0.00005 | per run per GB of memory (platform start fee) | One run at up to 1 GB = $0.00005 (charged as one event) |

### Input options

| Field | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `feeds` | array | yes | — | RSS, Atom or JSON Feed URLs. You can also paste a website or blog address: its feed is found automatically from the page's feed link tags, or at the usual paths like /feed and /rss.xml. |
| `maxItemsPerFeed` | integer | no | `100` | Take at most this many items from each feed, newest first. |
| `maxItems` | integer | no | `10000` | Stop after delivering this many items across all feeds. |
| `publishedAfter` | string | no | — | Only items published after this point. Use a date like 2026-10-01, or a relative window like "24 hours", "7 days", "2 weeks" or "1 month". Items with no date are left out when this is set. |
| `keywords` | array | no | `[]` | Only items whose title, summary or categories contain at least one of these words or phrases (not case-sensitive). Leave empty for all items. |
| `includeContent` | boolean | no | `false` | Also return each item's full content (content:encoded, Atom content or JSON Feed content_html) as plain text and as the original HTML. Same price either way. |
| `dedupe` | boolean | no | `true` | Deliver each item once, even if it appears in several feeds (matched by guid or link). You aren't charged for removed duplicates. |
| `discoverAllFeeds` | boolean | no | `false` | For website URLs: read all the feeds the page links to (e.g. one per section), not just the main one. Comment feeds are skipped. |

### Limits & honest notes

- Reads public feeds only. Feeds behind a login, paywall token or bot check are reported as an error row (free).
- Returns what the feed currently contains, usually the latest 10 to 100 items. Older items that have dropped out of the feed can't be recovered.
- Website URLs are checked one level deep: the feed links on that page, then /feed, /rss, /rss.xml, /atom.xml, /feed.xml and /index.xml at the site root. robots.txt is respected for discovered feeds. If a site's robots.txt can't be fetched (HTTP 5xx or a network error, after one retry), no feeds are discovered on that site (RFC 9309) and the URL gets a free error row saying why.
- Feeds up to 40 MB. Feeds over 6 MB (large podcast archives) are read from their first 500 items, or twice your per-feed maximum if that's higher. Items are taken newest first.
- The summary is plain text up to 1,000 characters. Full content (when enabled) is capped at 200,000 characters per item.
- Author fields are bylines only: email addresses in feed author fields are removed.
- With a publish-date filter, items without any date are left out.
- Respects your run budget: set a maximum total charge and the run stops cleanly at the cap, with no item charged twice.

### Related ActorForge actors

- [Website Change Monitor](https://apify.com/actor-forge/website-change-monitor) — alerts for pages without a feed
- [Website to Markdown](https://apify.com/actor-forge/website-to-markdown)
- [China Trending Topics](https://apify.com/actor-forge/china-trending-topics)

### Changelog

- **2026-10-18** — Initial release: RSS 2.0, RSS 1.0/RDF, Atom and JSON Feed parsing, feed auto-discovery from websites, podcast fields, date and keyword filters, cross-feed dedupe, optional full content.

***

*Built and maintained by **ActorForge**. Reliability first: every actor in the
portfolio is monitored by an automated nightly self-test, and breakages are
typically fixed the same day.*

# Actor input Schema

## `feeds` (type: `array`):

RSS, Atom or JSON Feed URLs. You can also paste a website or blog address: its feed is found automatically from the page's feed link tags, or at the usual paths like /feed and /rss.xml.

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

Take at most this many items from each feed, newest first.

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

Stop after delivering this many items across all feeds.

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

Only items published after this point. Use a date like 2026-10-01, or a relative window like "24 hours", "7 days", "2 weeks" or "1 month". Items with no date are left out when this is set.

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

Only items whose title, summary or categories contain at least one of these words or phrases (not case-sensitive). Leave empty for all items.

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

Also return each item's full content (content:encoded, Atom content or JSON Feed content_html) as plain text and as the original HTML. Same price either way.

## `dedupe` (type: `boolean`):

Deliver each item once, even if it appears in several feeds (matched by guid or link). You aren't charged for removed duplicates.

## `discoverAllFeeds` (type: `boolean`):

For website URLs: read all the feeds the page links to (e.g. one per section), not just the main one. Comment feeds are skipped.

## Actor input object example

```json
{
  "feeds": [
    "https://hnrss.org/frontpage",
    "https://feeds.bbci.co.uk/news/rss.xml"
  ],
  "maxItemsPerFeed": 100,
  "maxItems": 10000,
  "keywords": [],
  "includeContent": false,
  "dedupe": true,
  "discoverAllFeeds": false
}
```

# Actor output Schema

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

One row per feed item with title, link, author, dates, categories, summary, image and podcast fields, plus one error row per feed that failed.

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

Per-feed results: format, items in the feed, items delivered, filtered out and duplicates, and errors (never charged).

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

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

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

```

## MCP server setup

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