RSS Feed Reader & Monitor (RSS, Atom, JSON Feed) avatar

RSS Feed Reader & Monitor (RSS, Atom, JSON Feed)

Pricing

Pay per usage

Go to Apify Store
RSS Feed Reader & Monitor (RSS, Atom, JSON Feed)

RSS Feed Reader & Monitor (RSS, Atom, JSON Feed)

Read many RSS, Atom and JSON feeds in one run, or paste website URLs and the feed is found for you. Clean items with title, link, date, summary, author, image and podcast audio. Only-new mode with conditional requests for cheap hourly feed alerts. Keyword and date filters.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Adam Hale

Adam Hale

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 hours ago

Last modified

Share

RSS Feed Reader & Monitor: read RSS, Atom and JSON feeds in bulk, get only the new items

Paste feed URLs or plain website URLs and get one clean row per item: title, link, publish date, plain-text summary, author, categories, image and podcast audio. It reads RSS 2.0, RSS 1.0 (RDF), Atom and JSON Feed, so blogs, news sites, YouTube channels, GitHub releases, podcasts and government notices all come out in the same format.

Turn on Only new items and schedule it, and each run returns just the items published since the last run. You don't have to deduplicate by guid yourself. Feeds that haven't changed are checked with a conditional request.

  • Finds the feed for you. Give it blog.cloudflare.com or stripe.com/blog and it finds /rss/ or /blog/feed.rss by itself.
  • Keyword and date filters: whole-word keywords with launch* wildcards, exclude words, "published in the last 24 hours".
  • Free while in launch; planned pay-per-event price: $0.0005 per feed checked + $0.20 per 1,000 items, no start fee. Feeds that fail won't be charged.
  • Fast: no browser and no proxy. 14 inputs (RSS 2.0, RSS 1.0, Atom, JSON Feed, three websites and three broken URLs) took 5 seconds in our test.

What can I use it for?

  • News and blog alerts. Watch competitors, vendors, regulators or industry blogs and get only the new posts by Slack, email, webhook or Zapier.
  • Release and changelog tracking. GitHub release feeds (/releases.atom), product changelogs and status pages.
  • Content pipelines and AI. Feed new articles into a summariser, RAG index, translation workflow or newsletter builder, with full content when the feed carries it.
  • Podcast catalogs. Episode titles, audio URLs, MIME types, file sizes and durations for whole back catalogs (the Changelog feed has 1,014 episodes).
  • Media monitoring. Combine many publisher feeds with keyword filters such as "data breach" or "acquisition" and get one dataset.
  • YouTube channel uploads through the public channel feed (youtube.com/feeds/videos.xml?channel_id=…), including thumbnails.

What data does it return?

One row per feed item:

FieldDescription
title, urlItem title (HTML removed) and link
publishedAt, updatedAtISO 8601 UTC. updatedAt is only set when the feed gives a different update time
author, authorsAuthor name with email addresses removed; authors when there are several
summaryPlain-text summary or description, cut at a word boundary (default 1,000 characters)
categoriesTags and categories from the feed
imageUrlThumbnail from media:thumbnail, media:content, an image enclosure or the first image in the item
enclosureUrl, enclosureType, enclosureLength, durationSecs, enclosuresPodcast and media files (audio/video URL, MIME type, bytes, duration)
commentsUrlComments page, when given
itemIdThe feed's guid/id (or link) used for deduplication
positionInFeedPosition of the item in the feed as published
matchedKeywordsWhich of your keywords matched
feedTitle, feedUrl, feedSiteUrl, feedType, feedLanguageThe feed the item came from. feedType is, for example, RSS 2.0, Atom 1.0, RSS 1.0 (RDF) or JSON Feed 1.1
inputUrl, discoveredViaWhat you entered and, for website URLs, how the feed was found (link-alternate, page-link, guessed)
contentHtml, contentTextFull content, only with Include full content on
fetchedAtTime of the run

A per-feed report is saved as SUMMARY in the run's key-value store. It holds the status of each feed (ok, not_modified, no_feed_found, http_error, parse_error, timeout, error), the feed URL found, the item counts and a readable error message.

The Output tab exports CSV, Excel, JSON or XML. The dataset has two views: Items and Podcasts and media.

Example output

From a real run on 2026-10-04 with the website URL https://blog.cloudflare.com/ as input:

{
"itemId": "01M3XKBJCTDTMBBCNNHA141F04",
"title": "Streamline: custom video pipelines with Cloudflare Stream and Workers",
"url": "https://blog.cloudflare.com/streamline/",
"publishedAt": "2026-10-02T16:13:45Z",
"updatedAt": null,
"author": "Willi Geiger",
"authors": ["Willi Geiger", "Taylor Smith"],
"categories": ["Birthday Week", "Cloudflare Stream", "Containers", "Developer Platform", "Durable Objects", "Workers"],
"summary": "Streamline demonstrates how to build long-running, continuous video processing pipelines by pairing Cloudflare Workers and Durable Objects with a containerized media engine.",
"imageUrl": "https://blog.cloudflare.com/_emdash/api/media/file/01M3XKCAN8X5Q5KQ1Q5EW20NBG.01M3XKCB43AH4EZPQE0QQ7MNND.png",
"enclosureUrl": null,
"durationSecs": null,
"positionInFeed": 1,
"matchedKeywords": null,
"feedTitle": "Cloudflare Blog",
"feedUrl": "https://blog.cloudflare.com/rss/",
"feedSiteUrl": "https://blog.cloudflare.com/",
"feedType": "RSS 2.0",
"feedLanguage": "en-us",
"inputUrl": "https://blog.cloudflare.com/",
"discoveredVia": "link-alternate",
"fetchedAt": "2026-10-03T23:20:29Z"
}

A podcast episode (shortened):

{
"title": "Can we make Social Security better for blue-collar workers?",
"publishedAt": "2026-10-02T14:13:30Z",
"enclosureUrl": "https://prfx.byspotify.com/e/play.podtrac.com/npr-510325/npr.simplecastaudio.com/…/default.mp3?…",
"enclosureType": "audio/mpeg",
"enclosureLength": 8790605,
"durationSecs": 549,
"feedTitle": "The Indicator from Planet Money"
}

A feed that could not be read appears only in SUMMARY, not in the dataset, and is not charged:

{"inputUrl": "https://this-domain-does-not-exist-rss-test.com/", "status": "error", "error": "DNS_ERROR: the domain name does not resolve"}

How much does it cost?

Free while in launch. The actor charges no fee of its own right now; you pay only the Apify platform usage of your runs (the free Apify plan includes $5 of usage a month). The pay-per-event prices below are planned and apply only once they are switched on; Apify notifies existing users before a price change takes effect.

Planned pricing, pay per event:

EventPlanned price
Feed checked (downloaded and read, or confirmed unchanged)$0.0005
Item in the output$0.0002 (= $0.20 per 1,000 items)

Real runs from 2026-10-04, at the planned prices:

  • The default input (3 feeds, 40 items) would cost $0.0095.
  • First monitoring run on 6 feeds: 95 items, $0.022. Running it again right away: all 6 feeds unchanged, 0 items, $0.003.
  • Example monthly bill: 10 feeds checked every hour (7,200 checks) with about 300 new items in the month would cost $3.66.

Not charged: feeds that can't be found, fail to download or can't be parsed, items removed by your filters, and items already seen in monitoring mode. Cost cap: once pricing is on, set Maximum cost per run and the actor stops cleanly when it reaches it.

For comparison (Apify Store, checked 2026-10-03), the same hourly 10-feed schedule costs about $190.80 a month with the most-used RSS reader ($0.035 per run plus $1.15 per 1,000 items, every item every run). It costs $15.12 with the second ($0.001 per run plus $0.002 per feed).

How to use it

  1. Paste feed URLs or website URLs into Feed or website URLs, one per line (up to 5,000).
  2. For a one-off export, press Start. To monitor, turn on Only new items. To skip the backlog, also turn off Output current items on the first run: the first run then only remembers what is already there.
  3. Optionally add Keywords, Exclude keywords, Published after (24 hours, 7 days, 2026-10-01) or Max items per feed.
  4. Schedule the actor (for example every hour) and add an integration: Slack, email, Google Sheets, Zapier, Make or a webhook. Use a different Memory name for each independent monitor.

Input example

{
"feeds": [
"https://blog.cloudflare.com/",
"https://github.com/apify/apify-sdk-python/releases.atom",
"https://www.gov.uk/search/news-and-communications.atom",
"https://feeds.npr.org/510289/podcast.xml"
],
"onlyNew": true,
"outputOnFirstRun": false,
"keywords": ["security", "outage", "launch*"],
"stateStoreName": "my-feed-alerts"
}

API example

curl -X POST "https://api.apify.com/v2/acts/adamhaleworks~rss-feed-reader-monitor/run-sync-get-dataset-items?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"feeds": ["https://github.blog/feed/"], "maxItemsPerFeed": 10}'

How it works

  • Feed discovery. When a URL returns a web page, the actor reads the page's declared feed links (<link rel="alternate">). Main feeds come before comment feeds, and page API links are ignored. If there are none, it tries links on the page that look like RSS links. It then tries common feed paths under the page and the site root, such as /feed, /rss.xml, /atom.xml and /blog/feed.rss, skipping any that robots.txt disallows.
  • Parsing. RSS and Atom go through the widely used feedparser library. It recovers items from feeds that are not well-formed and reports a warning. JSON Feed 1.0/1.1 is parsed natively. HTML in titles and summaries is converted to plain text. Scripts and styles are dropped.
  • Monitoring memory. For each feed, the IDs of the items already seen are stored, together with the feed's ETag and Last-Modified headers, in a named key-value store in your account. The memory keeps items still in the feed plus 90 days of history (up to 5,000 per feed). Items cut by Max items in total or the cost cap are not marked as seen, so they come in the next run.
  • Polite fetching. It identifies itself as RSSFeedReaderMonitor/1.0 and sends at most 2 parallel requests per site. It retries timeouts, 429 and 5xx with backoff and honours Retry-After up to 30 seconds. It does not use proxies or try to get around bot protection: a site that blocks it is reported as http_error with the status code.

Limitations

  • Only what the feed contains. Many feeds carry the newest 10-50 items and only a summary. Older items and full article text are not fetched from the website.
  • Some sites put their feeds behind bot protection (for example Cloudflare challenges) and answer 403. Those feeds are reported, not bypassed.
  • Private and internal addresses (localhost, 10.0.0.0/8, 169.254.169.254, …) are refused. Responses larger than 15 MB are skipped.
  • Items without a date are dropped when Published after is set, and they are listed after dated items.

Feeds are published so that machines can read them. The actor reads only the feed, the page you gave it and robots.txt, and it checks guessed feed paths against robots.txt. Author email addresses are removed from the output. Feed content stays the publisher's copyright: you are responsible for how you reuse it (for example, linking back is usually fine; republishing full articles usually needs permission).

FAQ

How is "only new items" different from "Published after"? A date filter can miss items that arrive late with an older date, and it repeats items when runs overlap. The memory compares item IDs, so every item is returned exactly once, whatever the schedule.

Why did a feed return nothing? Open SUMMARY in the key-value store. not_modified means the feed is unchanged since the last run. no_feed_found means the page declares no feed and none of the common paths worked; try the feed URL directly. http_error with 403 means the site blocks automated readers.

Can I get full article text? Turn on Include full content. It returns whatever the feed carries (content:encoded or Atom content). Many WordPress and Substack feeds include the full post.

Can the same feed be in two monitors? Yes. Give each monitor its own Memory name; with the same name they share one memory per feed URL.

Something is wrong or missing? Open an issue on the actor's Issues tab and include the feed URL.


Author: Adam Hale