RSS Feed Scraper icon

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 rotationcurl-cffi impersonates 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-After header 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:encoded or Atom content, 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.

FieldTypeRequiredWhat 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

EventPriceWhen
Actor start$0.01Once per run, covers warm-up and proxy session setup.
Result emitted$0.0010Per 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 XMLfeedparser is 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 proxyConfiguration to rotate IPs.

FAQ

Is this the same as an rss parser api?
Functionally, yes — you call it via the Apify API (or the Console UI), pass feed URLs, and get back structured JSON. The difference is that we handle the messy parts a bare HTTP client doesn't: malformed XML, charset detection, multi-dialect normalisation, and the network-level blocks that make your home-rolled parser fail on 1 in 20 feeds.
Does this handle podcasts?
Yes — podcast RSS is standard RSS with <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?
Full Atom 1.0 support is built in. The 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?
Some publishers deliberately publish summary-only feeds to drive clicks to their site. The full body lives on the publisher's page, not in the feed XML. We surface what the feed provides — no fabrication.
What if a feed URL returns an error?
The Actor logs the failure with the HTTP status code, marks that feed as errored in the status message, and continues processing the remaining URLs. You never get a silent empty dataset — partial success is surfaced explicitly.
Can I run this on a schedule?
Yes. Use Apify Schedules to trigger a run on any cron cadence. Pair it with a named dataset to accumulate a rolling archive without overwriting previous results.
Does it deduplicate items across runs?
Within a single run, items are deduplicated by GUID / Atom 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.

Read more

Articles about this Actor

Related Actors

Teams that run this also run