Read RSS and Atom feeds on Apify and export clean, normalized dataset rows for monitoring, alerts, AI/RAG pipelines, MCP connectors, newsletters, dashboards, and no-code automations.
At a glance
- Reads: public RSS, Atom, and RDF feed URLs.
- Returns: normalized feed item rows with titles, links, dates, summaries, content fields, media URLs, categories, dedupe keys, and optional error rows.
- Best for: feed monitoring, article alerts, newsletter research, AI/RAG ingestion, dashboards, and connector delivery.
- Exports: Apify datasets as CSV, JSON, Excel, RSS, API, webhooks, or MCP connector workflows.
- Login: no website account or feed API key is required for public feeds.
What can it do?
RSS Feed Reader fetches public RSS, Atom, and RDF feed URLs and converts feed entries into a structured Apify dataset.
It is designed for recurring jobs where you need reliable feed imports without maintaining your own parser, scheduler, exports, or integrations.
Who is it for?
- News monitoring teams: track publishers, blogs, company changelogs, or government feeds.
- SEO and content marketers: watch competitor content and topic updates.
- AI workflow builders: feed fresh articles into RAG, summarization, or alerting flows.
- Automation builders: connect RSS feeds to Make, Zapier, Slack, Airtable, databases, or MCP connectors.
- Agencies and analysts: collect repeatable content snapshots for clients.
Why use this actor?
- Fetch many feeds in one run.
- Normalize RSS and Atom entries into one dataset shape.
- Keep going when one feed fails.
- Add stable dedupe keys for scheduled monitoring.
- Export results through Apify datasets, API, webhooks, MCP connectors, and integrations.
Quick start
- Open the actor on Apify.
- Add one or more RSS or Atom feed URLs.
- Choose the maximum number of items per feed.
- Run the actor.
- Export the dataset as JSON, CSV, Excel, RSS, or through the Apify API.
Example input
{
"feedUrls": [
{ "url": "https://feeds.bbci.co.uk/news/rss.xml" },
{ "url": "https://www.nasa.gov/news-release/feed/" }
],
"maxItemsPerFeed": 20,
"includeContent": true,
"includeFeedMetadata": true,
"dedupeBy": "guid",
"requestTimeoutSecs": 20,
"emitErrorItems": true,
"mcpMode": "off",
"maxMcpRecords": 20
}
Example output
{
"feedUrl": "https://feeds.bbci.co.uk/news/rss.xml",
"feedType": "rss",
"feedTitle": "BBC News",
"title": "Example headline",
"description": "Short item summary",
"content": "Longer content when provided by the feed",
"link": "https://www.bbc.com/news/example",
"guid": "https://www.bbc.com/news/example",
"pubDate": "Fri, 26 Jun 2026 10:00:00 GMT",
"isoDate": "2026-06-26T10:00:00.000Z",
"author": null,
"categories": ["World"],
"imageUrl": "https://example.com/image.jpg",
"mediaUrls": ["https://example.com/image.jpg"],
"fetchedAt": "2026-06-26T13:00:00.000Z",
"dedupeKey": "guid:https://www.bbc.com/news/example"
}
Tips for best results
- Use direct feed URLs: regular website homepages are not always valid feeds.
- Start small: use 10-20 items per feed for testing.
- Schedule monitoring: run on a schedule for alerts, newsletters, or dashboards.
- Keep error rows enabled: downstream automations can alert when a feed fails.
- Use
dedupeKey: store it in your database or automation tool to avoid duplicate alerts.
Scheduling and monitoring
RSS Feed Reader works well with Apify schedules.
For example:
- Run every 15 minutes for breaking news feeds.
- Run hourly for blogs and product changelogs.
- Run daily for research feeds and newsletters.
Use the dataset, webhook, or API output to trigger downstream actions.
Integrations
You can connect results to:
- Slack alerts for new headlines.
- MCP connectors for Slack, Notion, Supabase, or custom tools.
- Airtable or Google Sheets content trackers.
- Make or Zapier workflows.
- Vector database ingestion jobs.
- Newsletter drafting pipelines.
- Internal monitoring dashboards.
API usage with Node.js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/rss-feed-reader').call({
feedUrls: [{ url: 'https://feeds.bbci.co.uk/news/rss.xml' }],
maxItemsPerFeed: 10
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
API usage with Python
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/rss-feed-reader').call(run_input={
'feedUrls': [{'url': 'https://feeds.bbci.co.uk/news/rss.xml'}],
'maxItemsPerFeed': 10,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
API usage with cURL
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~rss-feed-reader/runs?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"feedUrls":[{"url":"https://feeds.bbci.co.uk/news/rss.xml"}],"maxItemsPerFeed":10}'
MCP and AI agents
RSS Feed Reader (with MCP) supports two MCP workflows:
- Run the actor from an MCP client such as Claude Desktop or Claude Code through Apify MCP.
- Deliver results to MCP connectors after the feed dataset is saved by setting
mcpConnectors,mcpMode,mcpInstruction, andmaxMcpRecordsin the actor input.
MCP delivery is safe-by-default: it is off unless you select connectors, it never asks for third-party credentials in the input, and it only calls send/post/write/create/insert/append/log-style tools discovered on the connector. Delivery status is stored in the MCP_DELIVERY_STATUS key-value store record.
MCP server URL:
https://mcp.apify.com/?tools=fetch_cat/rss-feed-reader
Claude Code setup:
claude mcp add apify-rss-feed-reader https://mcp.apify.com/?tools=fetch_cat/rss-feed-reader
Claude Desktop JSON configuration:
{
"mcpServers": {
"apify-rss-feed-reader": {
"url": "https://mcp.apify.com/?tools=fetch_cat/rss-feed-reader"
}
}
}
Example prompts:
- "Read these RSS feeds and summarize the newest five posts."
- "Monitor this changelog feed and tell me what changed since yesterday."
- "Fetch these news feeds and prepare a table of titles, URLs, and publish dates."
Example MCP connector input:
{
"feedUrls": [{ "url": "https://feeds.bbci.co.uk/news/rss.xml" }],
"maxItemsPerFeed": 10,
"mcpConnectors": ["your-connector-resource-id"],
"mcpMode": "sendRecords",
"mcpInstruction": "Send a concise RSS digest to #news-monitoring.",
"maxMcpRecords": 10
}
Common workflows
- News alerting: run the actor on a schedule, filter rows by keyword, and send matches to Slack or email.
- AI/RAG ingestion: fetch feed entries, deduplicate by
dedupeKey, then send new links and content to your embedding pipeline. - Competitor content tracking: track competitor blog feeds and export the dataset to a spreadsheet or CRM.
- Newsletter research: collect article titles, summaries, links, and publication dates for editorial review.
Troubleshooting
Why did a feed return an error row?
The feed URL may be unreachable, blocked, malformed, or not a real RSS/Atom feed. Open the feed URL in a browser and check whether it returns XML.
Why are some fields empty?
RSS and Atom publishers choose which fields to include. Some feeds omit authors, categories, images, or full content.
Why do I see duplicates across scheduled runs?
Scheduled runs create new datasets. Store dedupeKey in your downstream system and skip rows you have already processed.
Legality and responsible use
This actor is intended for public RSS and Atom feed URLs. Make sure your use complies with each publisher's terms, copyright rules, and applicable laws. Do not use the actor to access private, paid, or unauthorized feeds.
Limits
- The actor only reads public feed URLs supplied in the input.
- It does not crawl full websites behind each item link.
- It does not bypass logins, paywalls, or private feeds.
- Very large feeds should be capped with
maxItemsPerFeed.