# RSS Feed Reader: RSS, Atom and Podcast Feeds to JSON (`keelandcharter/rss-feed-reader`) Actor

Turn any RSS, Atom or podcast feed into clean JSON rows: title, link, published date, summary, categories, image and audio enclosure. Give a feed URL or just a website and the feed is found for you. Filter by keyword and date. $0.50 per 1,000 items.

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

## Pricing

from $0.50 / 1,000 feed item returneds

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 and Podcast Feeds to JSON

Read any RSS, Atom or RDF feed and get one clean row per item: title, link, published date, summary, categories, image and the audio or video enclosure of podcast episodes. Paste a feed URL or just a website address. If you give a website, the Actor finds its feed for you.

Built for scheduled monitors: turn on **Only new items** and each run returns, and charges for, only items you have not received before. Built by Keel & Charter. $0.50 per 1,000 items.

### What you get

| Field | Example |
|---|---|
| feed_title, feed_url, site_url | Planet Money, https://feeds.npr.org/510289/podcast.xml |
| title, link, guid | Episode or article title, its URL and feed ID |
| published_at, updated_at | ISO 8601 in UTC, for example 2026-10-14T21:30:18+00:00 |
| summary | Plain text summary with HTML removed |
| content_text | Full item text when the feed includes it and includeContent is on |
| categories | Tags or categories from the feed |
| image_url | Item image or thumbnail when the feed gives one |
| enclosure_url, enclosure_type, enclosure_length, duration | Podcast audio file, MIME type, size in bytes, duration as given by the feed |
| comments_url | Comments link when the feed gives one |

Author names are never returned.

### How to use it

1. Add feed URLs or website addresses to **Feeds**. For a site such as theverge.com the Actor reads the feed links the page declares, then tries common paths such as /feed and /rss.xml.
2. Optional: add **Keywords** (whole word match on title, summary and content, any keyword matches), **Published within days**, and **Max items per feed**.
3. Run it and export the dataset as JSON, CSV or Excel, or schedule it and read new items through the API.
4. For a schedule, turn on **Only new items**. The Actor remembers what earlier runs returned and skips it, so an hourly check of a quiet feed costs only the $0.00005 start. Give each schedule its own **Monitor name** so their memories stay separate.

### Example input

```json
{
  "feeds": [
    "https://feeds.npr.org/510289/podcast.xml",
    "https://www.theverge.com",
    "https://blog.python.org"
  ],
  "keywords": [
    "python",
    "tariff",
    "ai"
  ],
  "publishedWithinDays": 60,
  "maxItemsPerFeed": 5
}
```

On Oct 26, 2026 this returned 10 items: 3 Planet Money episodes, 2 Verge stories and 5 Python Insider posts. The two websites were resolved to https://www.theverge.com/rss/index.xml and https://blog.python.org/rss.xml.

### Example output

A row from that run:

```json
{
  "feed_url": "https://feeds.npr.org/510289/podcast.xml",
  "feed_title": "Planet Money",
  "site_url": "https://www.npr.org/podcasts/510289/planet-money",
  "title": "Wanna slow down AI? These biologists can help.",
  "link": "https://www.npr.org/2026/10/14/nx-s1-6002910/ai-scientific-regulation-conference-asilomar",
  "guid": "b297c28a-87e4-4b96-92e0-e64b7b581948",
  "published_at": "2026-10-14T21:30:18+00:00",
  "updated_at": "2026-10-14T21:30:18+00:00",
  "summary": "Fifty years ago, scientists pioneering a terrifying gene-splicing technology figured out a way to collectively hit pause. Can we do it again with AI? ...",
  "content_text": null,
  "categories": [],
  "image_url": "https://npr.brightspotcdn.com/dims3/default/strip/false/crop...",
  "enclosure_url": "https://tracking.swap.fm/track/XvDEoI11TR00olTUO8US/prfx.bys...",
  "enclosure_type": "audio/mpeg",
  "enclosure_length": 28012130,
  "duration": "1750",
  "comments_url": null,
  "scraped_at": "2026-10-26T20:41:53.703137+00:00"
}
```

### Pricing

Pay per event, no subscription and no separate compute charge:

| Event | Price |
|---|---|
| Feed item returned | $0.0005 per item ($0.50 per 1,000) |
| Actor start | $0.00005 per run |

Example: checking 50 news feeds daily with 20 items each is 1,000 items, about $0.50 per day. Items removed by your keyword or date filters, or skipped by Only new items, are never charged. An hourly monitor of 10 feeds that each post 5 new items a day costs about $0.79 per month (720 starts plus 1,500 items). Set a maximum cost per run in the run options and the Actor stops cleanly when it is reached.

Pricing may change; any change follows Apify's notice rules.

### Good to know

- Every request is checked against the site's robots.txt first. Feeds that robots.txt disallows are skipped and logged.
- If a site declares several feeds, only the first is read. Turn on readAllDiscoveredFeeds to read them all.
- Dates are converted to UTC. Items with no date in the feed have published_at empty and are kept unless you set Published within days.
- Only data the feed publishes is returned. The Actor does not open the linked articles.

### FAQ

**Can it read podcast feeds?** Yes. Each episode row includes the audio file URL, MIME type, size and duration.

**Does it work with Atom?** Yes. RSS 0.9x to 2.0, RSS 1.0 (RDF) and Atom are supported. JSON Feed is not; if a site also offers an XML feed, give the site address and that feed is found.

**How do I get only new items?** Schedule the Actor and set Published within days to 1, or keep the last guid you saw and compare.

### More from Keel & Charter

- [Wayback Machine Domain History](https://apify.com/keelandcharter/wayback-domain-history)
- [Bulk WHOIS and Domain Lookup (RDAP, DNS, SPF, DMARC)](https://apify.com/keelandcharter/domain-rdap-dns-lookup)

# Actor input Schema

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

One per line. A feed link such as https://hnrss.org/frontpage, or a website such as https://www.theverge.com, in which case the feed is found from the page's feed links or common paths like /feed and /rss.xml.

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

Keep only items whose title, summary or content contains one of these words (case insensitive).

## `publishedWithinDays` (type: `integer`):

Keep only items published in the last N days. 0 keeps everything. Items without a date are dropped when this is set.

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

Add content_text with the full item text when the feed carries it.

## `readAllDiscoveredFeeds` (type: `boolean`):

When a website lists several feeds (posts, comments, categories), read all of them instead of only the first.

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

0 means no limit.

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

Overall cap. 0 means no limit.

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

Remember the items returned by earlier runs and return (and charge) only items not seen before. Use this for scheduled monitors.

## `stateKey` (type: `string`):

Separate memory for each monitor when Only new items is on. Use a different name for each schedule.

## Actor input object example

```json
{
  "feeds": [
    "https://hnrss.org/frontpage",
    "https://www.nasa.gov/news-release/feed/",
    "https://blog.python.org"
  ],
  "publishedWithinDays": 0,
  "includeContent": false,
  "readAllDiscoveredFeeds": false,
  "maxItemsPerFeed": 20,
  "maxItems": 0,
  "onlyNewItems": false,
  "stateKey": "default"
}
```

# Actor output Schema

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

All rows returned by the run, in the default dataset.

# 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://www.nasa.gov/news-release/feed/",
        "https://blog.python.org"
    ],
    "maxItemsPerFeed": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("keelandcharter/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://www.nasa.gov/news-release/feed/",
        "https://blog.python.org",
    ],
    "maxItemsPerFeed": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("keelandcharter/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://www.nasa.gov/news-release/feed/",
    "https://blog.python.org"
  ],
  "maxItemsPerFeed": 20
}' |
apify call keelandcharter/rss-feed-reader --silent --output-dataset

```

## MCP server setup

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