RSS and Atom Feed Reader (bulk, with feed discovery) avatar

RSS and Atom Feed Reader (bulk, with feed discovery)

Pricing

from $0.26 / 1,000 item listeds

Go to Apify Store
RSS and Atom Feed Reader (bulk, with feed discovery)

RSS and Atom Feed Reader (bulk, with feed discovery)

Read up to 200 RSS or Atom feeds per run and get their items as clean rows: title, link, publication date in UTC, summary, categories and image. Give it a plain website instead of a feed URL and it finds the feed itself. Pay only for delivered items.

Pricing

from $0.26 / 1,000 item listeds

Rating

0.0

(0)

Developer

Steadydata Team

Steadydata Team

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Read up to 200 feeds per run and get their items as clean rows: title, link, publication date in UTC, summary, categories and image. RSS and Atom come out in the same shape. Give it a plain website instead of a feed URL and it finds the feed itself. You pay per delivered item and nothing else.

Why this scraper

  • A website is enough. github.blog works exactly like a feed URL: the page is read, its <link rel="alternate"> is followed, and if the site declares nothing the usual paths (/feed, /rss, /rss.xml, /feed.xml, /atom.xml, /index.xml) are tried. Measured on 14-09-2026: it resolved to https://github.blog/feed/ on the first attempt and delivered. Nobody in your team has to go hunting for feed URLs first.
  • RSS and Atom in one row shape. RSS keeps items in <item> with <pubDate>, Atom in <entry> with <published> and <link href>. A buyer with 200 sources should not have to care, so both become the same 15 columns, and feedType says which it was.
  • Dates you can sort on. Every date is normalised to UTC in publishedAt (2026-09-13T19:41:48Z), whatever the feed wrote. In a 290-item test across eleven publishers, publishedAt was filled on 100% of the rows. publishedText keeps the original string.
  • One slow publisher does not spoil the run. A source that does not answer is retried from another proxy exit and, if it still refuses, comes back as one error record while the other feeds deliver normally. Measured: 290 items from eleven feeds in 81 seconds, one error record, nothing lost.
  • Only delivered items are charged. An unreachable site, a site with no feed, a typo in the list: all free.

Who this is for

Newsroom and PR monitoring across a list of publishers. Competitor and category watching from company blogs. Filling a newsletter or a dashboard from dozens of sources on a schedule. Research collections that need a dated, deduplicable list of articles rather than a scrape.

Who this is not for

Read this before you buy.

  • It delivers what the feed contains, not the article. The full page is never fetched. content carries the full text only when the publisher puts it in the feed itself, which many do not; then you get the summary the feed offers. If you need the article body, this is the wrong tool.
  • A feed is a window, not an archive. Most feeds carry between 10 and 50 recent items. In the 14-09-2026 test, nine of eleven publishers returned fewer than the requested 50 because the feed simply holds fewer. There is no way to page back into history, from any tool, because the publisher does not serve it.
  • No author or byline. A byline is a person, and this actor ships no person data. The field is not collected and cannot be switched on.
  • A few publishers refuse datacenter traffic. nu.nl answers in under two seconds from an ordinary connection and times out from the platform, on every exit that was tried. Those sources come back as a free BLOCKED error record and this actor cannot read them. If your list is mostly publishers like that, test before you build on it: the free error record tells you within one run which of your sources are affected.
  • Discovery follows robots.txt. Reading a feed is never gated, because syndication exists to be read by machines. Inspecting a website page to find its feed is an ordinary page fetch, so that step obeys robots.txt and a site that forbids it is skipped for free with ROBOTS_DISALLOWED.

Input fields

FieldTypeRequired or defaultWhat it does
sourceslist of textrequiredFeed URLs or plain website addresses, one per row, up to 200. A website is inspected for the feed it declares, so nu.nl and https://nu.nl/rss both work.
maxItemsPerFeednumber50Cost ceiling per feed, newest first as the feed orders them. One delivered item is one charged event.
sinceDaysnumber00 keeps everything the feed contains. Items without a date are always kept.
includeContenttrue/falsefalseFeeds often carry the whole article next to the summary. On, that text is delivered as well; off keeps the dataset small.

Input example

{
"sources": [
"https://www.nasa.gov/news-release/feed/",
"https://www.theverge.com/rss/index.xml",
"github.blog",
"techcrunch.com"
],
"maxItemsPerFeed": 50,
"sinceDays": 7,
"includeContent": false
}

maxItemsPerFeed is your cost ceiling per source: one delivered item is one charged event. sinceDays drops everything older, and items without a date are always kept.

Output example

FieldTypeWhat it holdsExample
sourcetextThe input this row was found with: the feed you gave, or the site the feed was discovered on.https://blog.apify.com
feedUrltextThe feed the item came out of.https://blog.apify.com/rss/
feedTitletextThe title of that feed.Apify Blog
feedTypetextThe feed format: RSS, Atom or JSON Feed.rss
positionnumberThe place in the source's own order, counting from 1.1
titletextThe title of the item.I gave my Reddit Actor to an AI agent, and it made all th...
linktextThe article the item points to.https://blog.apify.com/reddit-actor-ai-agent-input-schema/
publishedAttextThe publication moment as a date, so you can sort on it.2026-09-30T09:03:52Z
publishedTexttextThat same moment exactly as the feed writes it.Wed, 30 Sep 2026 09:03:52 GMT
summarytextThe short summary from the feed.I connected my Apify Actor to an AI agent over the Apify...
contenttextThe full text the feed carries, when it carries one; many feeds give only the summary.
categorieslistThe categories the feed puts on the item.["AI agents", "Developer community"]
imageUrltextThe image belonging to the item, when the feed names one.https://storage.ghost.io/c/f2/6e/f26ec999-9a90-4aee-a0d4-...
guidtextThe item's own id in the feed, the way to tell new items from ones you already have.6abba5c9efb3b50001d93c9e
discoveredtrue/falseTrue when the feed was not given but found on the site itself.True
{
"source": "https://www.theverge.com/rss/index.xml",
"feedUrl": "https://www.theverge.com/rss/index.xml",
"feedTitle": "The Verge",
"feedType": "atom",
"position": 1,
"title": "Trump and Mike Johnson think the AI industry is overreacting",
"link": "https://www.theverge.com/ai-artificial-intelligence/994441/trump-mike-johnson-ai",
"publishedAt": "2026-09-13T19:41:48Z",
"publishedText": "2026-09-13T15:41:48-04:00",
"summary": "Yesterday, Anthropic CEO Dario Amodei published a lengthy open letter...",
"content": null,
"categories": ["AI", "Anthropic", "News"],
"imageUrl": "https://platform.theverge.com/wp-content/uploads/sites/2/2026/09/example.jpg",
"guid": "https://www.theverge.com/ai-artificial-intelligence/994441",
"discovered": false,
"status": "ok"
}

discovered is true when you passed a website and the feed was found for you.

How often the optional fields are actually filled, measured over 290 items from eleven publishers on 14-09-2026: title, link, publishedAt, feedTitle and feedType 100%, summary 99%, guid 89%, categories 74%. The gaps are the publishers' own: a feed that carries no categories cannot report any.

Error codes: INVALID_URL, NO_FEED_FOUND, EMPTY_FEED, ROBOTS_DISALLOWED, FETCH_FAILED, BLOCKED. None of them are charged. INPUT_TRUNCATED appears once when your input is longer than this actor accepts.

Pricing

Pay per event: one item-listed event per delivered item. No start fee, no separate platform-usage surcharge, and no charge for an input that fails.

Free Apify plan: this actor delivers up to 25 rows per run for accounts on the Apify free plan, and then stops with a message. That limit is set by us, not by Apify. It exists so the actor keeps paying for itself for the people who do pay. Any paid Apify plan runs it at full size, billed per delivered row, with failed rows never charged.

Reviews: if this actor saves you time, a short review on this page is the one thing that helps most. Ratings are what other buyers look at first, and we have no other way to ask.

FAQ

Does it work on a site without a feed? No, and it says so for free: NO_FEED_FOUND after the declared link and six usual paths have been tried. Feeds are read, pages are not scraped.

How do I keep a run cheap? maxItemsPerFeed is a hard ceiling per source, so 200 feeds at 10 items can never cost more than 2,000 events. sinceDays cuts it further if you poll often and only want what is new.

Can I poll every hour without paying for the same items twice? Every item carries guid and link, so deduplicating on your side is one key lookup. sinceDays: 1 combined with a small maxItemsPerFeed keeps a frequent poll small, but items you already have are delivered again and are charged again.

Why is content empty? Because the publisher does not put the article text in the feed. Switch includeContent on to receive it wherever it is present; it is off by default because it multiplies dataset size for feeds that carry the whole article.

Is personal data collected? No. The author and creator fields that feeds often carry are deliberately not read, and nothing else in a feed item identifies a person.

What happens when a source changes? Feeds change from time to time; that is the nature of this work. The actor is run against real feeds daily and fixed fast, and while it is broken you are not charged, because only delivered results cost anything.

Can I call it from my own code, like an API? Yes. Every run is available through the Apify API: start it with one HTTP request, then read the results as JSON, CSV or Excel from the dataset endpoint, or use the official Python and JavaScript clients. The input is the same JSON as in the input example above, so a scheduled script, a Make or Zapier step or an AI agent can call it without any changes.