# RSS Feed Reader and News Monitor with Full Article Text (`vindr/rss-feed-reader`) Actor

Read any RSS, Atom or JSON feed, or give a website and its feed is found for you. Filter by keywords and date, get only items that are new since the last run, and add the full article text as Markdown. Podcast feeds work too. $1 per 1,000 items.

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

## Pricing

from $1.00 / 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 does RSS Feed Reader and News Monitor do?

It reads RSS, Atom and JSON feeds and gives you every item as clean data: title, link, date, author, categories, summary, content, image and, for podcasts, the audio file and duration. You don't need to know the feed address: give it a website and it finds the feed for you.

On top of that, it can:

- **Give you only what's new.** Turn on **Only new items** and schedule it: every run returns just the items that appeared since the last one.
- **Filter by keywords and date.** Follow a topic, a company or a competitor across many news sites and blogs.
- **Add the full article text** as Markdown and plain text, when the feed only has a short summary. It uses the same engine as Firefox's Reader View, so menus, ads and footers are left out.

### Which feeds does it read?

- **RSS 2.0, RSS 1.0 (RDF), Atom and JSON Feed.**
- **Podcast feeds**, with the audio file, its size, the episode length, episode and season numbers.
- **Any website that has a feed.** For a website address, it uses the feed the site announces in its HTML (almost every news site, blog, WordPress, Ghost, Substack and Medium site does), or tries the usual places like `/feed`, `/rss` and `/atom.xml`.
- Feeds of any size, with Norwegian, Swedish and other special characters handled correctly.

### What data do you get?

| Field | Example |
|---|---|
| Feed | feed URL, title, website and description |
| Item | title, link, id, published and updated date |
| Author and categories | "Andrew J. Hawkins", \["Electric Cars", "Tesla"] |
| Text | summary and the feed's content as plain text (HTML optional) |
| Image | the item's image, from the feed or the article |
| Podcasts | audio file URL, type and size, duration in seconds, episode and season |
| Full article (optional) | the article as Markdown and plain text, word count, byline and publish time |

Email addresses are removed from author fields.

### How to use it

1. Click **Try for free** at the top of this page.
2. Add feeds or website addresses under **Feeds or websites**, one per line.
3. Optional: filter by keywords or age, or limit the number of items per feed.
4. Optional: turn on **Add the full article text**.
5. Click **Start**, then download the results as JSON, CSV or Excel, or use the API.

To monitor feeds, turn on **Only items that are new since the last run** and create a schedule (for example every hour) from the **Schedule** button after the run. Connect it to Slack, email, Make, n8n or Zapier to get the new items where you want them.

#### Input examples

The newest 10 items from a few news sites:

```json
{
    "feeds": ["https://www.nrk.no", "https://www.theverge.com", "https://blog.cloudflare.com"],
    "maxItemsPerFeed": 10
}
```

Monitor mentions of a company across news sites, with the full article text, only new items:

```json
{
    "feeds": ["https://www.nrk.no", "https://www.e24.no", "https://www.vg.no", "https://www.tu.no"],
    "keywords": ["equinor*"],
    "onlyNew": true,
    "memoryName": "equinor-news",
    "fetchFullText": true
}
```

The last 30 days of a podcast:

```json
{
    "feeds": ["https://feeds.simplecast.com/54nAGcIl"],
    "maxAgeDays": 30
}
```

### Output example

A news item with the full article text, shortened:

```json
{
    "feedUrl": "https://www.nrk.no/toppsaker.rss",
    "feedTitle": "NRK",
    "feedLink": "https://www.nrk.no/",
    "feedDescription": "Siste saker fra nrk.no",
    "title": "Over 400 hytteeiere vant i tingretten – kommunen anker dommen",
    "link": "https://www.nrk.no/innlandet/over-400-hytteeiere-vant-i-tingretten-_-kommunen-anker-dommen-1.18036706",
    "id": "1.18036706",
    "published": "2026-09-25T10:47:07.000Z",
    "updated": null,
    "author": "Henrik Einangshaug",
    "categories": [],
    "summary": "400 hytteeiere på Skei i Gausdal vant rettssaken mot kommunen. Nå anker kommunen saken til lagmannsretten.",
    "contentText": null,
    "image": "https://gfx.nrk.no/tm9Y0NKBbFfGaBif_FKtmQEwPD2JwL3onSnXPiZ1E8Cg.jpg",
    "enclosure": null,
    "podcast": null,
    "articleMarkdown": "[I en nylig dom slo Gudbrandsdal tingrett](https://www.nrk.no/innlandet/...) fast at Gausdal kommune brøt loven ...",
    "articleText": "I en nylig dom slo Gudbrandsdal tingrett fast at Gausdal kommune brøt loven ...",
    "articleWordCount": 347,
    "articleByline": "Henrik Einangshaug",
    "articlePublished": "2026-09-25T12:47:07+02:00",
    "articleError": null,
    "fetchedAt": "2026-09-25T11:29:49.414Z"
}
```

A podcast episode, shortened:

```json
{
    "feedTitle": "The Daily",
    "title": "The Life and, for Now, the Death of the Kennedy Center",
    "published": "2026-09-25T09:45:00.000Z",
    "enclosure": { "url": "https://dts.podtrac.com/redirect.mp3/...", "type": "audio/mpeg", "length": 29168282 },
    "podcast": { "durationSeconds": 1822, "episode": null, "season": null, "explicit": false }
}
```

The `RUN_SUMMARY` record in the key-value store shows how many feeds were read, how many items were in them, how many were filtered out, seen before and saved, and which feeds failed and why.

### How much does it cost?

- **$1 per 1,000 items** saved.
- **$2 per 1,000 full article texts**, only when you turn on **Add the full article text**, and only for articles of 100 words or more. Shorter texts (often just the visible intro of a paywalled article) are delivered for free, and pages that block automated visitors or have no readable article are not charged.

Examples:

- 20 news feeds, 20 items each, once a day: 400 items, $0.40 a day.
- The same with **Only new items** every hour: you pay only for new items, typically a few hundred a day.
- 1,000 items with full text: $1 + $2 = $3.

Items that are filtered out or were seen before are not charged. The $5 in free monthly credit on the Apify free plan covers about 5,000 items a month. Set **Max items per feed** or a maximum cost per run for a hard budget.

### FAQ

#### How do the keywords work?

They match whole words and phrases in the title, summary, content and categories, not case sensitive. `AI` finds "AI" and "AI-driven" but not "said". Add `*` at the end to match word beginnings: `equinor*` also finds "Equinors" and "Equinor-sjefen". Items that contain any of **Skip items containing any of** are left out.

#### How does "Only new items" work?

Each feed's item ids are remembered in a key-value store in your own Apify account, called `rss-feed-reader-default` (or with the **Memory name** you choose). The next run skips everything it has seen. Items that were filtered out or beyond **Max items per feed** count as seen too, so "new" really means "appeared since the last run". If a run stops at your maximum cost, the items it didn't get to stay new for the next run. To start over, use a new memory name or delete the key-value store.

#### Can I use the articles and feeds for anything I like?

That depends on the publisher. Feeds are meant for reading and following sites, but some publishers limit what you may do with their content, and a few say so in the feed description (included in every item as `feedDescription`). Check the terms of each site before you republish or resell its content. The Actor respects robots.txt, identifies itself honestly, doesn't log in and doesn't get around paywalls.

#### Why is the full article text missing for some items?

The `articleError` field says why: the site's robots.txt doesn't allow automated visitors (`blocked_by_robots_txt`), the site refused the request (`http_403`), the article is behind a login or paywall and the page has too little text (`no_article_found`), or the item links to a show page instead of an article, as podcast feeds often do (`no_article_link`). None of these are charged.

#### What about paywalled articles?

Only the part anyone can read without logging in is extracted, which for paywalled articles is usually the intro. The `articleWordCount` field shows how much text you got. Texts under 100 words are not charged.

#### What if a website has no feed?

The log tells you, and the site is listed in the run summary. Most news sites, blogs and shops with a blog have one, but some don't.

#### Does it work with YouTube or Reddit?

No. They publish feeds, but their robots.txt asks automated tools to stay away, and the Actor respects that. The same goes for any other site that says no in its robots.txt: the log tells you when that happens.

#### Can I use it from my own code?

Yes. Every Apify Actor has an API. See the **API** tab for examples in Python, JavaScript and plain HTTP. It also works with Make, n8n, Zapier, Slack and Google Sheets.

#### Something missing or not working?

Open an issue on the **Issues** tab with the feed or website you tried.

### More tools from VindR

- [PDF Text Extractor](https://apify.com/vindr/pdf-text-extractor): PDFs, scans and images as Markdown.
- [Sitemap Extractor, URL Status and Broken Link Checker](https://apify.com/vindr/sitemap-url-checker): list and check every page of a website.

# Actor input Schema

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

Feed URLs (RSS, Atom or JSON Feed) or ordinary website addresses, one per line. For a website, the feed it announces is used, or the usual places like /feed and /rss are tried.

## `allFeedsOnPage` (type: `boolean`):

Some websites announce several feeds (for example news, sport and culture). Turn on to read all of them instead of only the first.

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

Keep only items whose title, summary, content or categories contain at least one of these words or phrases. Whole words, not case sensitive: <code>AI</code> doesn't match "said". Add <code>*</code> to match word beginnings: <code>equinor*</code> also finds "Equinors".

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

Leave out items that contain any of these words or phrases, for example <code>sponsored</code>. Same rules as above.

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

Keep only items published within this many days. Items without a date are kept. Use 0 for no limit.

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

Save at most this many items from each feed, newest first. Use 0 for all.

## `onlyNew` (type: `boolean`):

Remember which items were in each feed and, next time, save only the ones that have appeared since. With a schedule, every run gives you just the new items. The first run saves everything that matches.

## `memoryName` (type: `string`):

Only with <b>Only new items</b>: the name of the memory to use. Use a different name for each monitoring setup, so they don't share what they have seen. It is kept in a key-value store called <code>rss-feed-reader-\<name></code> in your account.

## `fetchFullText` (type: `boolean`):

Open each item's link and extract the article text as Markdown and plain text, with the same engine Firefox uses for Reader View. Useful when the feed only has a short summary. Charged per article that is found (see the README). The site's robots.txt is respected.

## `includeContentHtml` (type: `boolean`):

Also save the feed's own HTML content, next to the plain text version.

## `maxConcurrency` (type: `integer`):

How many feeds are read at the same time.

## Actor input object example

```json
{
  "feeds": [
    "https://www.nrk.no",
    "https://wordpress.org/news/"
  ],
  "allFeedsOnPage": false,
  "maxAgeDays": 0,
  "maxItemsPerFeed": 10,
  "onlyNew": false,
  "memoryName": "default",
  "fetchFullText": false,
  "includeContentHtml": false,
  "maxConcurrency": 5
}
```

# Actor output Schema

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

One item per feed entry: title, link, date, author, summary, content, image, podcast audio and, if you asked for it, the full article text.

## `runSummary` (type: `string`):

Feeds read and failed, items in the feeds, filtered out, seen before and saved, and full texts fetched.

# 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://www.nrk.no",
        "https://wordpress.org/news/"
    ],
    "maxItemsPerFeed": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("vindr/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://www.nrk.no",
        "https://wordpress.org/news/",
    ],
    "maxItemsPerFeed": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("vindr/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://www.nrk.no",
    "https://wordpress.org/news/"
  ],
  "maxItemsPerFeed": 10
}' |
apify call vindr/rss-feed-reader --silent --output-dataset

```

## MCP server setup

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