RSS Feed Scraper & Extractor - RSS to JSON & CSV
Pricing
from $2.00 / 1,000 results
RSS Feed Scraper & Extractor - RSS to JSON & CSV
Scrape, filter, and convert public RSS, Atom, and JSON feeds into clean structured JSON/CSV data. Fast, reliable, and AI-ready.
Pricing
from $2.00 / 1,000 results
Rating
5.0
(2)
Developer
NodeFlow
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
RSS Feed Scraper & Extractor — RSS, Atom & JSON Feed
Turn news, blog, podcast and release feeds into structured data for newsletters, research, monitoring and AI workflows.
Paste feed URLs, choose a result limit, and run. It reads RSS 2.0, Atom 1.0 and JSON Feed 1/1.1 without a browser or a third-party API key. It returns normalized entries and a separate source health report so you can distinguish an empty feed from a failed source.
Try it
{"feedUrls": ["https://feeds.bbci.co.uk/news/rss.xml"],"maxItems": 10}
Use the actual feed URL, not a publisher homepage. Independently tested examples include BBC News RSS, NASA's https://www.nasa.gov/feed/, and Node.js releases at https://github.com/nodejs/node/releases.atom. Publisher availability can change.
What you get
- Normalized titles, article URLs, feed-provided text, dates, authors and categories.
- Attachment URLs and MIME types, including podcast enclosures when present.
- Stable hashed identifiers and URL-based deduplication across feeds within the run.
- Case-insensitive keyword matching and an optional UTC publication-date filter.
- A RUN_REPORT record with counts and the status of every requested source.
- JSON, CSV and other exports through the Apify dataset interface.
The use cases are newsletter curation, keyword-based news tracking, podcast metadata collection and release monitoring. Schedule the Actor using Apify schedules and connect its dataset to your workflow. Scheduled runs are independent: cross-run deduplication and notification delivery belong to your downstream workflow. Stable IDs make that straightforward.
Simple input
| Field | Default | Meaning |
|---|---|---|
feedUrls | Required | 1–100 public HTTPS feed URLs. Duplicate URLs are removed. |
maxItems | 100 | 1–10,000 total unique matching results across feeds. |
keywords | [] | Optional keywords; match ANY keyword in title or feed text. |
publishedAfter | Unset | Optional inclusive UTC date, YYYY-MM-DD. Unknown dates fail this filter. |
Feeds are processed in input order, and entries retain publisher order. This is not a global newest-first sort. When the total limit is reached, later feeds are not requested. Narrow filters may legitimately return zero entries.
Filtered example:
{"feedUrls": ["https://www.nasa.gov/feed/"],"maxItems": 50,"keywords": ["moon", "artemis"],"publishedAfter": "2026-09-01"}
Output
Each dataset row represents an entry actually present in a fetched feed. Missing optional values are null. Diagnostics are kept out of the billable dataset.
Illustrative, synthetic example (not a claim about a real publisher):
{"id": "sha256-derived-stable-identifier","sourceId": "release-2","title": "Release 2","url": "https://example.org/release","summary": "New features","publishedAt": "2026-09-04T12:00:00.000Z","updatedAt": "2026-09-04T12:00:00.000Z","author": "Team","categories": ["software"],"imageUrl": null,"attachments": [],"feedUrl": "https://example.org/feed","feedTitle": "Releases","format": "atom","matchedKeywords": [],"scrapedAt": "2026-09-05T12:00:00.000Z"}
summary is plain text supplied by the feed, up to 50,000 characters. It may contain a full feed article or only an excerpt. Article pages and media files are not fetched. Dates are normalized to UTC; Atom entries without published use updated. The ID hashes the resolved article URL, falling back to feed URL plus source ID or entry text. Tracking query parameters remain part of the URL identity.
Open Output → Source health and run report, or Storage → Key-value store → RUN_REPORT, for per-source diagnostics. Run status:
| Status | Meaning |
|---|---|
| succeeded | One or more actual entries stored. |
| partial | At least one source failed; other sources were processed. |
| no_matches | Accessible feeds had no matching entries. Check source counts. |
| charge_limit | Budget prevented all result writes. |
| failed | All feeds failed, or storage/processing failed; Actor exits with an error. |
Source statuses distinguish ok, empty, filtered, duplicates, error, storage_error, charge_limit, and not_requested. The report contains entriesFound, stored, filtered, duplicates, and invalidEntries where applicable. The report is written before a controlled all-source/storage failure. An infrastructure crash can prevent report persistence.
Pricing
Proposed launch price: $1 per 1,000 stored entries (event feed-entry, $0.001 each). Final prices displayed in Apify Console/Store are authoritative. Pricing is configured on the platform; editing source code alone does not change it.
Before publishing:
- Select Pay per event and create the event
feed-entry. - Remove any old result events, paid
apify-actor-start, and automatic dataset-item charge from previous configurations. - Charge only the custom
feed-entryevent to avoid overlapping charges. - Test a small paid run and a budget-limited run in your account, and check the resulting charges.
The code uses the Apify SDK's dataset write with event name and checks eventChargeLimitReached. A trimmed item is not counted. Empty, failed, duplicate and filtered entries do not trigger this custom event. Platform compute/storage costs depend on the chosen monetization mode and account. No paid start event is intended. Check profitability against actual cloud costs before choosing an all-inclusive price; this repository does not claim a measured profit margin.
Console, API, CLI and MCP
Console: Build the GitHub main branch, enter feed URLs, select a limit, and start. The two output links show entries and diagnostics.
API: Substitute your actual owner and Actor slug. The repository folder name does not determine the platform slug.
curl -X POST "https://api.apify.com/v2/acts/YOUR_USERNAME~rss-feed-scraper/run-sync-get-dataset-items" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"feedUrls":["https://feeds.bbci.co.uk/news/rss.xml"],"maxItems":10}'
For lengthy multi-feed runs, use the asynchronous /runs endpoint, then fetch the returned default dataset and key-value store. The synchronous endpoint has a platform timeout.
CLI: Save the example as input.json, then use apify call YOUR_USERNAME/rss-feed-scraper --input-file input.json. See the installed CLI help for version-specific flags.
MCP: In an authenticated Apify MCP client, select the deployed Actor and ask: “Run YOUR_USERNAME/rss-feed-scraper with feedUrls containing https://feeds.bbci.co.uk/news/rss.xml and maxItems 10; return entries and RUN_REPORT.” MCP configuration and authentication are provided by Apify, not this repository.
Network and limitations
Only public HTTPS feeds on port 443 are accepted. Private/local IP addresses, embedded credentials and redirects into private networks are rejected. DNS resolution is checked and the socket is pinned to a checked address. Requests use TLS validation, a 20-second timeout, up to two transient retries, a 30-second backoff cap and at most five redirects. Responses are capped at 5 MiB after decompression. Gzip/deflate and UTF-8 feeds are supported. XML DTD/entity declarations are rejected.
RSS 1.0/RDF, authenticated/private feeds, HTML feed discovery, article scraping, JavaScript pages and proprietary APIs are not supported. Some Atom XHTML constructs and publisher-specific extension fields may be absent from normalized output. A source can return 403, 429, malformed data or no entries; the health report explains this without invented records. Arbitrary sites are not guaranteed to work.
This Actor reads explicitly supplied syndication feeds. It does not crawl article pages or independently evaluate a publisher's robots.txt. Use feeds that the publisher permits you to consume automatically. Respect publisher terms, copyright, attribution, privacy and applicable data protection obligations. Feed availability does not grant unrestricted republication rights. This independent product is not affiliated with the example publishers.
Development
Node.js 24 recommended; no browser required.
npm cinpm run verifynpm run test:live
verify checks syntax, all five Actor schemas, and deterministic tests with synthetic fixtures/mocked transport. test:live deliberately contacts BBC, NASA and GitHub and asserts three real normalized entries from each, plus two entries from jsonfeed.org; it uses a local writer and does not test Apify billing. It writes evidence to artifacts/live-smoke.json.
For an actual SDK local run, save an input in storage/key_value_stores/default/INPUT.json and run npm start. Local runs do not prove cloud pricing. GitHub Actions runs verification and a Docker build on Linux.