RSS & Atom Feed Reader: Bulk, Only New Items, Auto-Discovery avatar

RSS & Atom Feed Reader: Bulk, Only New Items, Auto-Discovery

Pricing

from $0.60 / 1,000 feed items

Go to Apify Store
RSS & Atom Feed Reader: Bulk, Only New Items, Auto-Discovery

RSS & Atom Feed Reader: Bulk, Only New Items, Auto-Discovery

Read many RSS, Atom and JSON feeds into one clean dataset. Paste feed or website URLs (feeds are found automatically), get only items that are new since the last run, filter by date and keywords. Ideal for news, blog and podcast monitoring with alerts.

Pricing

from $0.60 / 1,000 feed items

Rating

0.0

(0)

Developer

Charles Markette

Charles Markette

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

RSS & Atom Feed Reader reads many RSS, Atom and JSON Feed URLs in one run and turns them into one clean dataset: one row per item, with the title, link, publish and update dates (ISO, UTC), author, plain-text summary, categories, enclosures (podcast audio, attachments), image and comments link. Paste a plain website URL and the feed is found for you. Turn on Only new items and each run returns just the items that appeared since the last run, which makes it the monitoring step in front of an email, Slack or Teams alert, or an export.

Why this Actor

  • Every common format. RSS 0.9x/1.0/2.0 and Atom are parsed with the widely used feedparser library; JSON Feed 1.0 and 1.1 are handled natively. The columns are the same whatever the format.
  • Auto-discovery. For a website URL, it reads the page's <link rel="alternate"> feed tags. If there are none, it tries /feed, /rss, /rss.xml, /atom.xml, /feed.xml and /index.xml and stops at the first one that is a real feed. The discoveredFrom column says which website a feed was found on.
  • Only new items, cheaply. It remembers the last 5,000 item IDs per feed. It also stores each feed's ETag / Last-Modified and sends them back, so a feed that hasn't changed answers "304 Not Modified": no download, no parsing, and no item charges.
  • Clean output. Summaries are plain text (HTML stripped, up to 2,000 characters). Optional full content HTML is sanitized (scripts and event handlers removed) with relative links made absolute.
  • One broken feed never stops the run. A feed that fails gets one free row with the reason in error ("HTTP 404", "Not a feed", "Timed out"…) and the run carries on.
  • Polite and safe. At most 2 requests at a time per website, retries with backoff on 429 and 5xx (honouring Retry-After), a 10 MB cap per feed and a 60-second limit per fetch. URLs that point at private, local or cloud-metadata addresses are refused. Every redirect is checked again, and the check is repeated on the address actually connected to, so a host whose DNS answer changes between the check and the connection is refused too.

Use cases

  • News and competitor monitoring: schedule it hourly on competitors' blogs, changelogs and press pages with Only new items, and send each new post to Slack or email.
  • Keyword alerts: watch 50 industry feeds for your brand or product names with Keywords.
  • Podcast and video tracking: episode audio URLs, types and sizes in enclosures.
  • Content aggregation: merge many feeds into one dataset, newest first per feed, for a newsletter, a dashboard or a Google Sheet.
  • Research archives: run daily and keep everything with dates, authors and categories in one place.

How to use it

  1. Add Feed or website URLs, one per line (https://example.com/feed.xml, or just example.com).
  2. Optional: turn on Only new items for monitoring, and set Published after, Keywords or Exclude keywords.
  3. Run it, or schedule it. Export as CSV, Excel or JSON, or chain it with an integration (see Related Actors).

Input example

{
"feeds": ["https://github.blog/", "https://feeds.bbci.co.uk/news/technology/rss.xml", "https://example.com/feed.json"],
"onlyNew": true,
"keywords": ["web scraping", "automation"],
"since": "7 days",
"maxItemsPerFeed": 50
}

Output example

{
"feedUrl": "https://news.example.com/blog/feed.xml",
"feedTitle": "Example News",
"feedLink": "https://news.example.com/",
"itemId": "post-2",
"title": "Second post about Python",
"link": "https://news.example.com/posts/2",
"publishedAt": "2026-10-13T07:30:00Z",
"updatedAt": null,
"author": "Ada Lovelace",
"summary": "Hello world & friends.",
"categories": ["Programming", "Python"],
"enclosures": [{"url": "https://cdn.example.com/ep2.mp3", "type": "audio/mpeg", "length": 12345}],
"imageUrl": "https://news.example.com/img/2.png",
"commentsUrl": "https://news.example.com/posts/2#comments",
"discoveredFrom": "https://news.example.com/",
"error": null
}

With Include full content HTML, rows also get contentHtml. A feed that couldn't be read gives one row with feedUrl and error set and the other columns empty. itemId is the item's GUID / ID, or its link, or (if it has neither) a hash of its title and date. A run summary, with a line per feed, is saved as OUTPUT in the key-value store.

How "Only new items" works

  • The first run with Only new items outputs the feed's current items (up to Max items per feed) and remembers them. Turn on Skip existing items on the first run to only remember them, so that you get alerts only for items published after you start monitoring.
  • Later runs output only items whose ID wasn't seen before. Items are remembered once they are output or deliberately left out by your filters or the per-feed limit, so they won't come back later. Items not output because the run hit Max output rows or your cost limit are not remembered, and come in the next run.
  • The memory lives in the key-value store rss-feed-reader-state in your account: the last 5,000 item IDs per feed, plus the feed's ETag / Last-Modified and, for website URLs, the discovered feed URL (so later runs go straight to the feed).
  • Each saved task has its own memory, and changing Keywords or Exclude keywords starts a fresh one. Set Memory name to choose it yourself: runs with the same memory name share it.

How much does it cost?

Pay per event: $0.00115 per output item (one item row), plus $0.005 per run start. Apify platform usage is included. These are free: feed error rows, items you've already seen (Only new items), items left out by your filters, and feeds that answer "not modified".

Apify Store discounts: the price above is for Apify's Free plan. Paid plans pay less per 1,000 feed items: $1.00 on Starter, $0.78 on Scale, $0.60 on Business. The "from" price at the top of the Store page is the Business price.

Worked examples:

Examples use the Free-plan rate. Where an example doesn't add it, each run also has its run-start charge, counted per GB of Actor memory (minimum one; one at the default memory); Apify Proxy (where used) is billed separately.

  • 20 feeds, 50 items each: 1,000 × $0.00115 + $0.005 = $1.155.
  • A daily monitor of 30 feeds with Only new items that finds about 40 new items a day: $0.051 per day, about $1.53 per month.
  • The same monitor run hourly: 24 run starts ($0.12) + 40 items ($0.046) a day, about $4.98 per month.

If you set a maximum cost per run, the Actor stops cleanly at that limit, and the items it didn't output come in the next run.

FAQ and limits

Can it get the full article text?

It returns what the feed publishes: often a summary, sometimes the full content (contentHtml). It does not open the article pages.

Can I get older items than the feed shows?

No. A feed only lists the publisher's latest items (often 10 to 50). Schedule the Actor with Only new items to build up a history.

A feed gives "HTTP 403" or "HTTP 429" but works in my browser.

Some sites block automated or datacenter traffic. This Actor doesn't use proxies, log in, or send cookies, so feeds behind a login, a paywall or bot protection may not be readable.

Why did an old item show up as new?

The publisher changed the item's GUID or link, or the feed lists more than 5,000 items. Item IDs are taken as published.

What does "Published after" do with items that have no date?

They are left out when it's set, because they can't be checked. Atom entries with only an updated date are checked against that date.

Why is a URL "Blocked"?

URLs that resolve to private, local, link-local or cloud-metadata addresses (for example 127.0.0.1, 10.x.x.x or 169.254.169.254) are refused for safety, including when a redirect leads there or when the host's DNS answer changes to such an address at connection time.

Other limits

Feeds over 10 MB (after decompression) are skipped with an error. contentHtml is cut at 1,000,000 characters (the cut can fall inside a tag). Pages that build their feed links with JavaScript aren't rendered, so use the feed URL directly. Up to 3 feed links per page are tried, in page order (the first is usually the main feed).

ActorUse it to
Send Email Report & Slack, Discord, Teams, Telegram AlertsGet the new items as an email or chat message after each run.
Dataset Delivery: Export to SFTP, FTP, Dropbox & Google DriveDeliver the items as CSV, Excel or JSON files.
Google Sheets SyncAppend the items to a Google Sheet.
Merge & Deduplicate DatasetsMerge the output with other sources and remove duplicates.
Dataset Filter & TransformFilter items by any field, or rename and drop columns before export.
Bulk URL Status CheckerCheck that the links in new feed items work.

Feed parsing: feedparser. JSON Feed: jsonfeed.org.