# RSS & Atom Feed Extractor (`taroyamada/rss-feed-aggregator`) Actor

Extract article URLs from RSS/Atom feeds. Paste 1 feed URL and Start. JSON for downstream Article Extractor.

- **URL**: https://apify.com/taroyamada/rss-feed-aggregator.md
- **Developed by:** [naoki anzai](https://apify.com/taroyamada) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 13 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 rss or atom 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?

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 Feed Aggregator

Parse, filter, and extract data from any public RSS or Atom XML feed to automate your web scraping pipelines. This RSS and Atom Feed Extractor acts as a highly efficient discovery surface, designed specifically to aggregate new URLs from known publisher blogs, company update logs, and tech newsrooms before passing them to specialized downstream scrapers. Developers and data engineers rely on this tool to build reliable content intelligence workflows without relying on complex browser automation. Instead of crawling entire website structures to find new pages, you simply provide a list of trusted feed URLs. The scraper parses the XML, applies your custom keyword filters, and returns only the web pages that match your themes. It is the perfect lightweight feeder mechanism for daily or weekly monitoring of targeted web sources. The resulting dataset includes the discovered URLs, the original feed source, publication dates, and the specific keyword matches that triggered the rule. Because the output is pre-formatted and filtered, you can seamlessly integrate the results into an article content extractor or generic web scraper to fetch the full DOM, text content, and metadata. By isolating the URL discovery phase into this dedicated feed aggregator, you optimize your scraping costs, reduce blocked requests, and ensure your data pipelines only run on relevant, fresh content.

### Store Quickstart

- Start with **Quickstart (2 publisher feeds)** for a reliable first run.
- Use **Multi-Source Monitoring** to watch several feeds with keyword filters.
- Use **RSS → Article Cleanup** when the next step is article extraction.

### Where this actor fits

| Surface | Best for |
|---|---|
| **RSS Feed Aggregator** | Discover fresh URLs from known publishers and blogs |
| **Google News Scraper** | Discover fresh URLs from query-based Google News searches |
| **Article Content Extractor** | Clean discovered article/news/blog pages |
| **Website Content Extractor** | Clean discovered docs, pricing, policy, or product pages |

### Key Features

- 📡 **Feed discovery** — Aggregate multiple public RSS/Atom feeds in one run
- 🔍 **Keyword filtering** — Keep only the rows that match the themes you care about
- 🏷️ **Match visibility** — Returns `matchedKeywords` for filtered rows
- 🔄 **Deduplication** — Remove duplicate links across feeds
- ⚡ **Low-friction first run** — Great for recurring monitoring of known sources

### Use Cases

| Who | Why |
|---|---|
| PR / comms teams | Track publisher and company newsroom feeds |
| Competitive intelligence | Watch competitor blogs and product update feeds |
| Content ops | Build filtered story queues from trusted sources |
| AI / RAG teams | Maintain a fresh URL stream before deeper extraction |

### Input

| Field | Type | Default | Description |
|---|---|---:|---|
| `feedUrls` | `string[]` | required | Public RSS/Atom URLs (max 50) |
| `keywords` | `string[]` | `[]` | Optional include-list filter |
| `maxItemsPerFeed` | `integer` | `25` | Max items to keep from each feed |
| `deduplicate` | `boolean` | `true` | Remove duplicate links across feeds |
| `timeoutMs` | `integer` | `15000` | Request timeout |
| `delivery` | `string` | `dataset` | `dataset` or `webhook` |
| `webhookUrl` | `string` | — | Webhook target when `delivery=webhook` |
| `dryRun` | `boolean` | `false` | Run without saving |

#### Input Example

```json
{
  "feedUrls": [
    "https://blog.google/rss/",
    "https://openai.com/news/rss.xml"
  ],
  "keywords": ["AI", "agents"],
  "maxItemsPerFeed": 10,
  "deduplicate": true
}
```

### Input Examples

#### Example: Single feed

```json
{
  "feeds": [
    "https://example.com/feed.xml"
  ]
}
```

#### Example: Multi-feed daily digest

```json
{
  "feeds": [
    "https://hnrss.org/frontpage",
    "https://www.theverge.com/rss/index.xml"
  ],
  "maxItemsPerFeed": 50
}
```

#### Example: Delta-only run

```json
{
  "feeds": [
    "https://example.com/feed.xml"
  ],
  "onlyNewSinceLastRun": true,
  "snapshotKey": "example-feed-state"
}
```

### Output

| Field | Type | Description |
|---|---|---|
| `source` | string | Feed URL that produced the row |
| `title` | string | Feed item title |
| `link` | string | Item URL for downstream extraction |
| `pubDate` | string | Original feed date |
| `pubDateISO` | string | ISO timestamp version of `pubDate` |
| `description` | string | Summary text from the feed |
| `content` | string | Encoded content when available |
| `categories` | array | Categories / tags from the feed |
| `matchedKeywords` | array | Keywords that matched the row |

#### Output Example

```json
{
  "source": "https://openai.com/news/rss.xml",
  "title": "The next evolution of the Agents SDK",
  "link": "https://openai.com/index/the-next-evolution-of-the-agents-sdk",
  "pubDate": "Wed, 15 Apr 2026 10:00:00 GMT",
  "pubDateISO": "2026-04-15T10:00:00.000Z",
  "description": "OpenAI updates the Agents SDK with native sandbox execution...",
  "matchedKeywords": ["ai", "agents"]
}
```

### First-run buyer experience

1. Run **Quickstart (2 publisher feeds)**.
2. Confirm the actor returns recent item URLs plus `matchedKeywords`.
3. Send article/news/blog links to **Article Content Extractor**.
4. Send docs/product/policy links to **Website Content Extractor**.

### Tips & Limitations

- Start with a small set of high-trust feeds.
- Keyword filtering is OR-based; any matched keyword keeps the item.
- This actor is a feed discovery layer, not a full-content extractor.

### FAQ

**How is this different from Google News Scraper?**

Use RSS Feed Aggregator when you already know the publishers you trust. Use Google News Scraper when you want broader query-based discovery.

**Can I see why an item matched?**

Yes — filtered rows include a `matchedKeywords` array.

**Can I get full article text here?**

No. Use Article Content Extractor or Website Content Extractor on the returned links.

### Related Actors

Content Intelligence Pack handoffs:

- [📰 Article Content Extractor](https://apify.com/taroyamada/article-content-extractor) — clean discovered article/news/blog pages
- [📄 Website Content Extractor](https://apify.com/taroyamada/website-content-extractor) — clean discovered non-article pages
- [📰 Google News Scraper](https://apify.com/taroyamada/google-news-scraper) — query-based discovery when you do not have feed URLs yet

### Cost

**Pay Per Event**:

- `actor-start`: $0.01
- `dataset-item`: $0.002 per output item

### ⭐ Was this helpful?

If this actor saved you time, please [leave a ★ rating](https://apify.com/taroyamada/rss-feed-aggregator/reviews) on Apify Store.

# Actor input Schema

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

Public RSS/Atom URLs to monitor (max 50).

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

Optional include-list keywords. Matching rows return a `matchedKeywords` field.

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

Maximum items to keep from each feed.

## `deduplicate` (type: `boolean`):

Remove duplicate links across feeds.

## `timeoutMs` (type: `integer`):

Request timeout in milliseconds.

## `delivery` (type: `string`):

Where to send results: dataset or webhook.

## `webhookUrl` (type: `string`):

Webhook target used when delivery=webhook.

## `dryRun` (type: `boolean`):

Run without saving results.

## Actor input object example

```json
{
  "feedUrls": [
    "https://blog.google/rss/",
    "https://openai.com/news/rss.xml"
  ],
  "maxItemsPerFeed": 25,
  "deduplicate": true,
  "timeoutMs": 15000,
  "delivery": "dataset",
  "dryRun": false
}
```

# 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://blog.google/rss/",
        "https://openai.com/news/rss.xml"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("taroyamada/rss-feed-aggregator").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://blog.google/rss/",
        "https://openai.com/news/rss.xml",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("taroyamada/rss-feed-aggregator").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 '{
  "feedUrls": [
    "https://blog.google/rss/",
    "https://openai.com/news/rss.xml"
  ]
}' |
apify call taroyamada/rss-feed-aggregator --silent --output-dataset

```

## MCP server setup

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

```

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/M2DYIgqFlcu0zNfha/builds/9PrVdgvS1pvjn9IZV/openapi.json
