RSS Feed Article Monitor
Pricing
Pay per event
RSS Feed Article Monitor
Monitor public RSS and Atom feeds for normalized new, updated, and confirmed-removed article events with keyword filters and persistent per-feed state.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Turn public RSS and Atom feeds into stateful new, updated, and confirmed-removed article events. This RSS feed monitor normalizes feed entries, applies keyword rules, reuses ETag and Last-Modified validators, and remembers per-feed fingerprints across scheduled Apify Task runs.
Use it for news intelligence, editorial monitoring, research alerts, webhook workflows, or any automation that needs changes—not another full feed snapshot on every run.
What does RSS Feed Article Monitor do?
The Actor accepts up to 50 public RSS 2.0, RSS 1.0/RDF, and Atom URLs. For each successful changed response, it:
- Parses and normalizes each article.
- Creates a stable identity from the feed GUID, Atom ID, article URL, or a deterministic fallback.
- Compares the normalized fingerprint with persistent state.
- Emits
neworupdatedevents when appropriate. - Counts articles missing from consecutive successful changed feed responses.
- Emits
removedonly after the configured confirmation threshold. - Saves ETag and Last-Modified values for conditional requests on the next run.
An HTTP 304 response means the feed has not changed. It produces no article events and does not increase missing-item counters.
Who is it for?
- News and communications teams tracking source feeds for additions, corrections, and withdrawals.
- OSINT and research analysts building repeatable public-news intelligence pipelines.
- Editorial operations teams detecting changed headlines, summaries, dates, authors, or categories.
- Automation developers sending feed deltas to webhooks, queues, databases, Slack, or email.
- AI workflow builders supplying normalized changed articles instead of repeatedly ingesting a complete feed.
This Actor is for public feed URLs. It is not an authenticated feed reader, website-to-RSS converter, full-page scraper, or notification service by itself.
Why use stateful article events instead of a feed snapshot?
A generic feed reader returns the current entries every time. This Actor keeps state and returns transitions:
new: the article identity has not been seen in this state namespace, or it reappeared after confirmed removal;updated: the identity is known, but normalized article fields changed;removed: the article remained absent for the configured number of successful changed-feed observations.
This event model reduces downstream deduplication work and makes scheduled runs useful for automations. Bounded removal confirmation avoids treating a temporary truncated feed or one unusual response as immediate removal.
Getting started
- Open the Actor input.
- Add one or more public RSS or Atom URLs under Public RSS or Atom feed URLs.
- Optionally add include or exclude keywords.
- Choose how many changed-feed runs must confirm a removal.
- Keep
stateKeystable for the same monitoring campaign. - Run once to establish the baseline. Existing entries are emitted as
new. - Create an Apify Task and schedule recurring runs so its default key-value store is reused.
- Connect the default dataset to a webhook or integration.
For a one-time analysis, run the Actor once and export the baseline new records as JSON, CSV, Excel, or XML.
Input parameters
| Field | Type | Default | Purpose |
|---|---|---|---|
feedUrls | array | NASA feed | 1–50 public HTTP(S) RSS or Atom URLs |
includeKeywords | string array | [] | Emit events containing matching case-insensitive terms |
excludeKeywords | string array | [] | Suppress events containing any excluded term |
keywordMode | any or all | any | Require any or all include keywords |
removalConfirmationRuns | integer | 2 | Consecutive successful changed fetches needed for removal |
maxEvents | integer | 1000 | Maximum event records emitted in one run |
requestTimeoutSecs | integer | 30 | Per-feed timeout; transient requests are retried twice |
stateKey | string | default | Namespace for an independent monitoring campaign |
Keyword matching covers normalized title, summary, content, author, and categories. Exclude rules take priority. Tracking state is maintained for every parsed article even when a keyword rule suppresses its event, preventing a later filter change from inventing a false first observation.
Example: monitor NASA science and mission news
{"feedUrls": [{ "url": "https://www.nasa.gov/news-release/feed/" }],"includeKeywords": ["science", "mission"],"keywordMode": "any","removalConfirmationRuns": 2,"maxEvents": 50,"stateKey": "nasa-science-missions"}
On its first run, this input emits matching current entries as new. Later runs emit only matching changes observed while reusing the same key-value store.
Output fields
Every event is written to the default dataset.
| Field | Meaning |
|---|---|
eventType | new, updated, or removed |
articleId | Feed GUID/Atom ID or deterministic fallback identity |
title | Plain-text title, nullable |
url | Feed-supplied article URL, nullable |
summary | Plain-text description or Atom summary, nullable |
content | Plain-text full feed content when supplied, nullable |
author | Feed author or creator, nullable |
publishedAt | Valid publication timestamp in ISO 8601 form, nullable |
updatedAt | Valid update timestamp in ISO 8601 form, nullable |
categories | Feed category labels |
feedUrl | Source feed URL |
feedTitle | Channel/feed title, nullable |
detectedAt | Time this transition was detected |
firstSeenAt | First observation in this state namespace |
lastSeenAt | Most recent successful changed response containing the article |
missingRuns | Consecutive changed responses where the item was absent |
changedFields | Fields changed on an updated event |
Example output
This record was produced locally from the public USGS Atom feed on 2026-08-03 (timestamps and feed contents naturally change):
{"articleId": "urn:earthquake-usgs-gov:us:6000tgb9","title": "M 6.8 - 2026 Uto, Japan Earthquake","url": "https://earthquake.usgs.gov/earthquakes/eventpage/us6000tgb9","summary": "PAGER - RED ShakeMap - IX DYFI? - IX Time 2026-07-28 07:27:15 UTC 2026-07-28 07:27:15 UTC at epicenter Location 32.682°N 130.722°E Depth 10.00 km (6.21 mi)","content": null,"author": null,"publishedAt": null,"updatedAt": "2026-08-01T21:29:17.417Z","categories": ["Past Week", "Magnitude 6", "us"],"eventType": "new","feedUrl": "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_month.atom","feedTitle": "USGS Significant Earthquakes, Past Month","detectedAt": "2026-08-03T06:15:34.347Z","firstSeenAt": "2026-08-03T06:15:34.347Z","lastSeenAt": "2026-08-03T06:15:34.347Z","missingRuns": 0,"changedFields": []}
How updates and removals are detected
The fingerprint includes normalized identity, title, URL, summary, content, author, publication/update dates, and categories. When one of those fields changes for the same identity, the Actor emits updated and lists the differences in changedFields.
A missing item is not immediately removed. The counter advances only after a successful fetch with a changed feed response. Failed fetches and HTTP 304 responses never count against an article. Set removalConfirmationRuns to 3 or more for feeds that frequently rotate or truncate their visible window.
A feed removing an old entry does not necessarily mean the linked page was deleted. The event means the entry was confirmed absent from the feed under your configured rule.
Persistent state and scheduled runs
State is stored in the run's default key-value store under a hash of stateKey and feed URL. Apify Tasks reuse their assigned default storages, which makes them the recommended way to schedule monitoring.
Use a different stateKey for independent campaigns in the same storage. Changing the key intentionally creates a fresh baseline. Deleting or purging the key-value store also resets the baseline.
Direct standalone Actor runs commonly receive fresh default storage, so they are best for one-time extraction unless you explicitly reuse storage through an Apify Task.
Conditional HTTP fetching and retries
When feeds provide ETag or Last-Modified headers, the Actor sends If-None-Match and If-Modified-Since on the next run. This saves bandwidth and avoids unnecessary parsing.
Network timeouts, HTTP 408/429, and temporary 5xx responses are retried up to twice. Stable client errors are not retried blindly. One failed feed does not discard successful results from other feeds; the run fails only when every requested feed fails.
How much does it cost to monitor RSS feed articles?
Pricing uses one start event per run plus one tiered item event for each emitted article event. Unchanged feeds, filtered records, failed feeds, duplicate entries, and parsed records that produce no transition have no item event charge.
The measured pricing contract starts at $0.005 per run. Article-event tiers are FREE $0.001012, BRONZE $0.00088, SILVER $0.0006864, GOLD $0.000528, PLATINUM $0.000352, and DIAMOND $0.0002464 per emitted event. Live Store pricing remains the authority.
Examples at the BRONZE item tier:
- a scheduled run with no changes: about $0.005;
- a run emitting 10 article events: about $0.0138;
- a baseline emitting 100 article events: about $0.093.
Apify applies the tier associated with account usage. Platform compute is covered by PPE pricing for customers under the active Store configuration.
Automation and integration ideas
- Schedule every 15 minutes and send only
newevents to Slack. - Route
updatedevents to an editorial audit table usingchangedFields. - Trigger a fact-check workflow when monitored headlines or summaries change.
- Send
removedevents to a review queue rather than deleting downstream content automatically. - Combine multiple public agency feeds into a normalized public-event intelligence dataset.
- Export a one-time baseline to CSV for content inventory analysis.
Apify integrations can connect datasets and run webhooks to Make, Zapier, Google Sheets, Slack, webhooks, and other services.
Run through the Apify API with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~rss-feed-article-monitor/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"feedUrls": [{"url": "https://www.nasa.gov/news-release/feed/"}],"maxEvents": 50,"stateKey": "nasa-news"}'
For persistent monitoring, call an Apify Task configured with this Actor rather than creating unrelated standalone run storages.
JavaScript API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/rss-feed-article-monitor').call({feedUrls: [{ url: 'https://www.nasa.gov/news-release/feed/' }],includeKeywords: ['science', 'mission'],keywordMode: 'any',stateKey: 'nasa-science-missions',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python API example
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/rss-feed-article-monitor').call(run_input={'feedUrls': [{'url': 'https://www.nasa.gov/news-release/feed/'}],'removalConfirmationRuns': 3,'stateKey': 'nasa-news-releases',})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
Use with Apify MCP
Add this Actor to Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/rss-feed-article-monitor"
Claude Desktop, Cursor, and VS Code setup
Add the same HTTP server configuration to Claude Desktop, Cursor, or VS Code:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/rss-feed-article-monitor"}}}
Example prompts:
- “Run the RSS Feed Article Monitor for NASA news and return only science or mission events.”
- “Schedule this feed-monitoring Task hourly and send new article dataset items to my webhook.”
- “Summarize updated headlines and show which fields changed.”
Limits and expected behavior
- Supports RSS 2.0, RSS 1.0/RDF, and Atom XML—not JSON Feed.
- Accepts up to 50 feeds and responses up to 10 MB each.
- Emits up to 10,000 events per run.
- Does not fetch full linked web pages; fields are limited to what the feed publishes.
- Does not bypass authentication, CAPTCHAs, geo-restrictions, or paywalls.
- Private/local network targets and URLs containing credentials are rejected.
- A publisher may recycle GUIDs incorrectly; identity quality ultimately depends on feed data.
- Feed-window disappearance means absence from that feed, not confirmed deletion of the article page.
- Reordering entries alone does not create an update.
Troubleshooting
The second run emits all articles as new again.
Use an Apify Task and do not purge its default key-value store. Keep stateKey unchanged. Independent standalone runs may use independent storage.
I expected a removed event but received none.
The item must be absent from the configured number of consecutive successful changed responses. HTTP 304 and failed requests do not advance the counter.
A feed returns “unsupported RSS or Atom feed.”
Open the exact URL and confirm it returns RSS/Atom XML rather than an HTML page, JavaScript shell, JSON Feed, login page, or challenge response.
Some articles do not match my keyword.
Matching uses the text the feed supplies. The Actor does not visit the article page to discover additional body text. Check keywordMode and remember that exclusions take priority.
Responsible use and legality
Process only public feeds you are authorized to access. Follow publisher terms, applicable robots guidance, copyright rules, privacy law, and reasonable request frequencies. Feed content may be copyrighted; an accessible feed is not a grant to republish it without restriction.
Do not use this Actor to target internal services, authenticated/private feeds, or personal data unlawfully. Store only the fields needed for your legitimate workflow and apply appropriate retention controls downstream.
Related scrapers
RSS Feed Article Monitor is intentionally focused on turning already-known public feed URLs into stateful article events. These Automation Lab Actors support adjacent workflows:
- RSS Feed Reader returns the current entries from RSS and Atom feeds when you need a snapshot rather than change events.
- News Article Extractor extracts article-page content after a feed event supplies a URL.
- Google News Scraper discovers news by search query when you do not already have feed URLs.
Pair this Actor's dataset and webhooks with Apify schedules and integrations for notification or storage workflows. It does not claim feed discovery, website conversion, full-page extraction, or delivery as built-in features.
FAQ
Does the first run show only future articles?
No. The first run establishes state and emits current matching entries as new.
Can it monitor more than one feed?
Yes, up to 50 in one run. State is isolated by normalized feed URL and stateKey.
Does it detect article body edits?
Only when the feed itself updates its supplied summary/content or another normalized field. Linked pages are not fetched.
Can I receive notifications?
Connect the dataset or run webhook to an Apify integration. The Actor emits records but does not send email or chat notifications directly.
What does a removed event prove?
It proves that an identity was absent from the configured number of successful changed feed snapshots. It does not prove the article URL is offline.
Are duplicate feed entries charged twice?
No. Duplicate identities in the same parsed feed are collapsed, and unchanged identities do not emit item events.