Keyword News & RSS Monitor
Pricing
from $2.50 / 1,000 matching articles
Keyword News & RSS Monitor
Give it RSS feeds (or news domains) and keywords — it checks them on a schedule and returns only matching articles, deduplicated across runs. No external API keys.
Pricing
from $2.50 / 1,000 matching articles
Rating
0.0
(0)
Developer
Proyecto Apify
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Give it your RSS feeds and your keywords — it checks them on a schedule and hands back only the articles that match. Deduplicated across runs, so a daily recurring run never returns the same article twice.
No external API keys. No paywall scraping. No sentiment analysis. Just accurate keyword matching on the title and summary that the feed itself provides.
What it does
- Takes feeds or bare domains. Pass a full RSS/Atom URL or a domain like
bbc.co.ukand the Actor auto-discovers the feed via the homepage<link rel="alternate" type="application/rss+xml">tag, then common paths (/rss,/feed,/rss.xml,/atom.xml,/feed.xml,/index.xml,/feeds/posts/default). - Parses RSS 2.0 and Atom 1.0 with
fast-xml-parser(no paid API). Extractstitle,summary(HTML stripped),source,publishedAt(ISO 8601),link. - Filters by lookback window — only articles published within
lookbackHours(default 24h) are kept. Articles with no parseable date are treated as fresh. - Matches keywords against
title + summary.matchMode: "any"= at least one keyword;"all"= every keyword.caseSensitivedefaults tofalse. - Deduplicates across runs via a persisted KeyValueStore record (
dedup-state), capped at 10,000 entries with LRU eviction so it stays bounded over months of scheduled runs. - Pushes one row per matching new article to the default dataset.
Input
| Field | Type | Default | Description |
|---|---|---|---|
feeds | array | — | RSS/Atom URLs or bare domains. Required. |
keywords | array | — | Keywords or phrases to match. Required (pass [] to disable matching). |
matchMode | any | all | any | How to combine multiple keywords. |
caseSensitive | boolean | false | Case-sensitive matching. |
maxArticlesPerFeed | integer | 100 | Cap on matching articles emitted per feed per run. |
lookbackHours | integer | 24 | Only articles newer than this are kept. |
Output
One row per matching article in the default dataset:
{"title": "OpenAI announces new regulation policy","summary": "The company said it will publish quarterly safety reports...","source": "Hacker News","publishedAt": "2026-07-23T09:14:00.000Z","matchedKeywords": ["AI", "regulation"],"link": "https://news.ycombinator.com/item?id=12345678"}
Setting up a daily scheduled run
- Open the Actor in Apify Console → Schedules → Create new.
- Pick Cron =
0 8 * * *(08:00 UTC every day) or your preferred time. - Set the input. Example:
{"feeds": [{ "url": "https://hnrss.org/frontpage" },{ "url": "https://feeds.bbci.co.uk/news/rss.xml" },{ "url": "reuters.com" }],"keywords": ["AI", "regulation", "antitrust"],"matchMode": "any","lookbackHours": 24}
- Save. Each scheduled run reads the persisted
dedup-statefrom the default KeyValueStore, so articles seen in yesterday's run are automatically filtered out.
Reading the results programmatically
curl "https://api.apify.com/v2/acts/<your-username>~keyword-news-rss-monitor/runs/last/dataset/items?format=json" \-H "Authorization: Bearer $APIFY_TOKEN"
Error handling
- Unreachable, malformed, or non-RSS feeds are logged (
WARNING: No RSS feed discovered for …orFailed to parse feed …) and skipped. The run continues. - Per-feed retries: 2 (Crawlee default), then
failedRequestHandlerlogs and moves on. - If no feeds resolve at all, the Actor exits non-zero so the schedule surfaces the failure.
Limitations
- Only reads what the feed itself exposes — typically title + summary. Does not fetch full article bodies.
- No paywall bypass, no login flows.
- Keyword matching is plain substring (regex-escaped). No stemming, no fuzzy match.
- Discovery probes the homepage and a fixed list of common paths; if a site publishes its feed at a non-standard URL and doesn't advertise it in
<link rel="alternate">, pass the full feed URL directly.