Automation · News & feeds
RSS Feed Scraper — Atom, Podcast & Multi-Feed Aggregator
Turn any list of RSS or Atom feed URLs into one flat, typed dataset — title, link, author, ISO-8601 published/updated, summary, full content:encoded HTML body, tags and GUID — with RSS 2.0, RSS 1.0 and Atom collapsed into a single row shape. A dead, slow or malformed feed is skipped with a warning instead of killing the batch.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
RSS and Atom are still the most reliable way to subscribe to a publication. This Actor parses any feed URL — news site, blog, podcast, GitHub release feed, Reddit, Substack, Medium per-user — and writes one row per item. Output is normalised across RSS and Atom dialects so downstream code never needs to care which format it received.
Feed sources that work out of the box:
What we handle for you
- 🛡️ Browser fingerprint rotation —
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes so the target sees a browser, not a Python script. - 🌐 Residential proxy rotation via Apify Proxy — fresh session and exit IP on every block or 429 response.
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per feed,Retry-Afterheader honoured. - 🧱 Rate-limit-aware pacing — when a feed host pushes back, we slow down and surface exactly what was collected before the limit hit.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, stable IDs, exportable as JSON / CSV / Excel straight from Apify Console.
- 💰 Pay-Per-Event pricing — you pay only for results that land in your dataset. No data, no charge (beyond the small actor-start fee).
- 📡 Multi-feed batching — pass a list of URLs; the Actor fetches and normalises them all in one run, deduplicating by GUID.
- 📝 Full HTML content — when a feed publishes
content:encodedor Atomcontent, we capture the full body alongside the summary, not just a truncated snippet.
Use cases
- News aggregation dashboard — pull 20 publications into one stream and pipe to Slack, Discord, or a webhook.
- Brand monitoring — track every Google Alerts RSS feed for your company name, product, or competitors.
- Content automation — feed company-blog RSS into a translation pipeline, summary LLM, or newsletter tool.
- Podcast RSS parser — podcast RSS is standard RSS with
<enclosure>tags; this Actor surfaces the episode link, title, author, and published date for every episode in the feed. - LLM-ready news digest — pass structured rows straight to an LLM pipeline; ISO-8601 timestamps and clean HTML make chunking predictable.
- RSS-to-Google-Sheets / Notion / Airtable — export via Apify's native integration or the API; no glue code required.
- Feed archival — schedule the Actor daily to build a rolling archive of feeds that don't publish full history.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
feedUrls | array | yes | List of RSS / Atom feed URLs. One URL per line. Each becomes one or more dataset rows. |
maxItemsPerFeed | integer | no | Cap on items pulled from a single feed. |
includeContent | boolean | no | When true, include the full HTML body (RSS `content:encoded` / Atom `content`). When false, only the summary. |
userAgent | string | no | Custom UA string. Default identifies as Devil Scrapes RSS reader. |
{
"feedUrls": [
"https://news.ycombinator.com/rss",
"https://feeds.arstechnica.com/arstechnica/index"
],
"maxItemsPerFeed": 25,
"includeContent": true,
"proxyConfiguration": {
"useApifyProxy": false
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
feed_urlfeed_titlefeed_formatitem_idtitlelinkauthorsummarycontent_htmlcategoriespublishedupdatedscraped_at
{
"feed_url": "https://news.ycombinator.com/rss",
"feed_title": "Hacker News",
"feed_format": "rss",
"item_id": "https://news.ycombinator.com/item?id=48000000",
"title": "Show HN: Building a hosted RSS parser for the post-LLM web",
"link": "https://news.ycombinator.com/item?id=48000000",
"author": null,
"summary": "A discussion about ...",
"content_html": null,
"categories": [],
"published": "2026-05-15T20:00:00+00:00",
"updated": null,
"scraped_at": "2026-06-01T09:00:00+00:00"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.01 | Once per run, covers warm-up and proxy session setup. |
| Result emitted | $0.0010 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
Limitations
- Paginated feeds — we don't follow
<link rel="next">paged feeds automatically. Pass each page URL explicitly if you need full history. - JavaScript-rendered feeds — feeds that require JavaScript to load are not supported. You would need a browser-based Actor for those.
- Malformed XML —
feedparseris lenient and handles most broken XML, but severely corrupted feeds may yield partial or empty results. The run surfaces a warning, not a silent empty dataset. - Rate-limiting by feed hosts — heavily scraped feeds (e.g. Reddit) may enforce per-IP rate limits. Enable Apify Proxy in
proxyConfigurationto rotate IPs.
FAQ
Is this the same as an rss parser api?
Does this handle podcasts?
<enclosure> tags. This Actor is a capable podcast RSS parser: the enclosure URL (the audio file) appears in the link field for each episode row, alongside the episode title, author, and published date.What about atom feed parser support?
feed_format field tells you which dialect was parsed. Both RSS and Atom rows share the same output schema, so your downstream code needs no format-specific logic.Why is `content_html` empty for some feeds?
What if a feed URL returns an error?
Can I run this on a schedule?
Does it deduplicate items across runs?
id. Across runs, deduplication is your responsibility — filter by item_id in your downstream pipeline or use a named dataset with upsert logic.Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors