# RSS and Atom Feed Monitor (`gubidonius/rss-monitor`) Actor

Watches any number of RSS, Atom or RDF feeds and returns their items, flagging the ones that were not there last run. Tells a feed that refused the request apart from a feed with nothing new, which is the difference between a monitor and a guess. No key and no login.

- **URL**: https://apify.com/gubidonius/rss-monitor.md
- **Developed by:** [Gregory Bolshakov](https://apify.com/gubidonius) (community)
- **Categories:** News, MCP servers, Agents
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 and Atom Feed Monitor

Reads any number of RSS, Atom or RDF feeds and returns their items, marking the ones that
were not there on the previous run.

### What it does differently

**A feed that refused the request is not a feed with nothing new.** That is the whole
point. Most feed readers hand back an empty list when a server answers 403 or times out,
and on a schedule that reads as "no news today". Here a failed feed keeps its previous
snapshot untouched and the run says which feed failed and why, so an outage never turns
into a false quiet spell or a flood of items reported as new the run after.

**It says how sure it is that an item is new.** Deciding whether an item is new means
having a stable identity for it, and feeds do not reliably give one. Some publish a proper
`guid`, some publish a URL that changes when the site does, and some publish nothing at all.
Every row carries `idSource` naming which was used, so a row identified by `guid` and a row
identified by its position in the document are not presented as equally trustworthy.

**A cap is never invisible.** Every row says how many items the feed actually held, so a
capped run cannot be mistaken for a quiet one.

### Input

Feed URLs, a per-feed cap, and a switch for returning only what is new. The first run on a
feed returns everything with `isNew` empty, because nothing has been seen to compare it
against.

### Output

One row per item, with the feed's own title and format alongside the item's title, link,
author, dates and text.

Dates are the other place feeds mislead. An item whose date cannot be believed, such as
1970 or a year in the future, is returned as null rather than as a date, because a wrong
date sorts to the top of your table and reads as real.

# Actor input Schema

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

The feeds to read. RSS 2.0, Atom and RDF are all handled and the format is reported on every row.

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

Caps how many items each feed contributes. Every row says how many the feed actually held, so a cap is never invisible.

## `onlyNewSinceLastRun` (type: `boolean`):

Returns only items that were not in the feed last time. The first run on a feed returns everything with isNew empty, because nothing has been seen to compare against. A feed that fails to load is left untouched rather than treated as emptied.

## `includeSummary` (type: `boolean`):

Adds the item's description or content as plain text. Turn it off for a smaller dataset.

## `concurrency` (type: `integer`):

How many feeds to read in parallel. Each feed is a different server, so there is no shared rate limit, but a lower number is kinder to a host publishing several of your feeds.

## Actor input object example

```json
{
  "feeds": [
    "https://feeds.bbci.co.uk/news/rss.xml",
    "https://hnrss.org/frontpage",
    "https://github.blog/feed/"
  ],
  "maxItemsPerFeed": 100,
  "onlyNewSinceLastRun": false,
  "includeSummary": true,
  "concurrency": 6
}
```

# Actor output Schema

## `results` (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 = {
    "feeds": [
        "https://feeds.bbci.co.uk/news/rss.xml",
        "https://hnrss.org/frontpage",
        "https://github.blog/feed/"
    ],
    "maxItemsPerFeed": 100,
    "concurrency": 6
};

// Run the Actor and wait for it to finish
const run = await client.actor("gubidonius/rss-monitor").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://feeds.bbci.co.uk/news/rss.xml",
        "https://hnrss.org/frontpage",
        "https://github.blog/feed/",
    ],
    "maxItemsPerFeed": 100,
    "concurrency": 6,
}

# Run the Actor and wait for it to finish
run = client.actor("gubidonius/rss-monitor").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://feeds.bbci.co.uk/news/rss.xml",
    "https://hnrss.org/frontpage",
    "https://github.blog/feed/"
  ],
  "maxItemsPerFeed": 100,
  "concurrency": 6
}' |
apify call gubidonius/rss-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gubidonius/rss-monitor"
        }
    }
}

```

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/ig2i88hVs2yINb3TL/builds/AsFKaGUxTbhS4uQx5/openapi.json
