RSS Change Monitor: Competitor Blog & News Alerts
Pricing
Pay per usage
RSS Change Monitor: Competitor Blog & News Alerts
Monitor public RSS and Atom feeds, such as a competitor's blog, newsroom or changelog, and get only the new items since the last run: title, link, published date and summary. Optional webhook for Slack, Zapier or Make. Lightweight HTTP, no browser, no login.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
SingletonOps
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 days ago
Last modified
Categories
Features
Share
Public RSS Change Monitor
Monitor public RSS and Atom feeds and get notified only when new items appear. Perfect for marketers, researchers, and ops teams who want cheap recurring feed watches without scraping login walls.
What does Public RSS Change Monitor do?
This Actor:
- Fetches one or more public RSS/Atom feed URLs you provide
- Normalizes each entry to
title,link,published, andsummary - Compares items against the last run’s state (stored in the default key-value store under
seen-state) - Writes only new items to the default dataset
- Optionally POSTs a JSON summary to your webhook URL when something new is found
Schedule it on Apify (e.g. every 15–60 minutes) for continuous monitoring with predictable compute cost.
Why use this Actor?
| Benefit | Detail |
|---|---|
| Low legal risk | Public feeds only — no logins, paywalls, or authenticated APIs |
| Recurring value | Change detection across runs (state persisted in KVS) |
| Cheap compute | Lightweight HTTP + XML parse — no browser |
| Integrations | Optional webhook, plus Apify dataset/API exports to Zapier, Make, Slack, etc. |
Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
feedUrls | string[] | ✅ | — | Public RSS, Atom or JSON Feed URLs |
maxItemsPerFeed | integer | ❌ | 50 | Max items read per feed (1–500) |
webhookUrl | string | ❌ | — | HTTPS URL to POST when new items exist |
webhookSecretHeader | string | ❌ | — | Value sent as X-Webhook-Secret (you supply it) |
stateStoreName | string | ❌ | rss-change-monitor-state | Named key-value store that remembers seen items between runs |
Example input
{"feedUrls": ["https://www.nasa.gov/news-release/feed/", "https://feeds.bbci.co.uk/news/rss.xml"],"maxItemsPerFeed": 50,"webhookUrl": "https://example.com/hooks/rss-new","webhookSecretHeader": "your-own-shared-secret"}
Webhook secret: Provide your own value. The Actor never generates secrets. When set, it is sent only as the
X-Webhook-SecretHTTP header so your endpoint can verify the request.
Output
Dataset (new items only)
Each dataset row is one newly detected feed entry:
| Field | Type | Description |
|---|---|---|
id | string | Stable ID from guid / id / link |
feedUrl | string | Source feed URL |
title | string | Entry title |
link | string | Entry URL |
published | string | null | Publish time from the feed |
summary | string | null | Plain-text snippet (HTML stripped) |
detectedAt | string | When this run marked the item as new (ISO-8601) |
Key-value store
| Key | Contents |
|---|---|
RUN-SUMMARY | Per-feed status for this run: ok / error / skipped, new item count, and an error code, message and hint for any feed that could not be read |
seen-state | Compatibility copy of seen item IDs (feedUrl → string[]) as of this run |
Seen item IDs are stored in the named key-value store set by stateStoreName (one record per feed, kept separate per saved task), so scheduled runs remember what they have already output. On the first run, every item within maxItemsPerFeed is treated as new and written to the dataset. Later runs emit only items not seen before.
Errors: a feed that cannot be read (HTTP 403/404/429/5xx, DNS, TLS, timeout, redirect loop, HTML page instead of a feed, malformed XML, oversized response) never fails the run. It is listed in RUN-SUMMARY with an error code such as HTTP_403 or NOT_A_FEED, mentioned in the run's status message, and the other feeds are still checked. The run fails only when the input has no valid feed URL.
Webhook payload (when configured and new items exist)
{"actor": "public-rss-change-monitor","detectedAt": "2026-10-06T23:30:00.000Z","newItemCount": 3,"feeds": [{ "feedUrl": "https://www.nasa.gov/news-release/feed/", "fetched": 20, "newCount": 2 }],"items": [{"id": "...","feedUrl": "https://www.nasa.gov/news-release/feed/","title": "...","link": "...","published": "..."}]}
How to use
- Open the Actor on Apify Store and click Try for free
- Paste your public feed URLs into Feed URLs
- (Optional) Add a webhook URL and your own secret header value
- Click Start, or create a Schedule for recurring runs
- Download results from the Dataset tab or call the Apify API
Local development
cd public-rss-change-monitornpm ci # install dependenciesnpm test # unit tests for feed parsing, dedupe and seen-state (test/feed.test.ts)# Edit storage/key_value_stores/default/INPUT.jsonapify run# Inspect storage/datasets/default/
Pricing
Free to use; you pay only Apify platform usage.
Legal & acceptable use
- Public RSS/Atom feeds only. Do not use this Actor on feeds that require login, cookies, API keys, or other authentication.
- Respect publisher terms of service and robots/rate-limit policies. Prefer reasonable schedules (e.g. every 15+ minutes) rather than aggressive polling.
- You are responsible for how you use the output (attribution, redistribution, downstream automation).
- This Actor does not bypass paywalls or scrape HTML article bodies beyond what the feed already publishes.
Limitations
- Feeds that omit stable
guid/idmay fall back tolinkortitle|date; duplicates can appear if those fields change. - Very large feeds are truncated to
maxItemsPerFeed(default 50). - First run seeds state with current items — expect a burst of “new” rows once.
- Feed fetch failures are reported per URL in
RUN-SUMMARY; other feeds still process and the run succeeds. - Each feed has a 30-second timeout (2 retries for 429/5xx/timeouts) and a 20 MB size limit.
- Some publishers block data-center traffic (
HTTP_403); those feeds cannot be read from Apify.
Changelog
Unreleased (fix/rss-resilience)
- A single problem feed no longer fails the run. Fixes runs that failed with
TypeError: ... trim is not a functionwhen a feed item had an empty element with attributes (for example<title type="html"></title>or<guid isPermaLink="false"></guid>) or Atom XHTML titles. - Per-feed errors with codes and hints in a new
RUN-SUMMARYrecord and in the status message. - Invalid URLs in the list and an invalid webhook URL are reported instead of failing the run.
- Seen state now persists across runs in a named store (
stateStoreName). - Response size limit, hard timeouts, retries with backoff, gzip and charset handling, JSON Feed support, and a hint when a URL is an HTML page that links to its feed.
- Webhook POST has a 15-second timeout.
0.1
- Initial release: multi-feed monitoring, KVS
seen-state, dataset output, optional webhook
Support
Open an issue on the Actor’s Apify page or contact the author through Apify Console messaging.