How to Convert RSS to JSON (and Parse Atom or JSON Feed)
RSS is still the simplest way to follow a site, a podcast or a changelog — but most modern tools want JSON. Official 'RSS to JSON' converters exist, yet they often want a direct feed URL, break on Atom or JSON Feed, or do not discover the feed when all you have is the blog's homepage. This guide shows how to convert RSS to JSON, including auto-discovery from a website URL.
You will use the RSS to JSON Converter on Apify. It parses RSS, Atom, RDF and JSON Feed into one schema: title, link, authors, dates, categories, images, full content, and podcast enclosures with durations. If you paste a website URL, the Actor tries to discover the feed automatically.
By the end of this article you will have a CSV or JSON file on your machine, and a short Python snippet you can rerun or schedule. The same Actor is also callable from JavaScript and from AI agents through the Apify MCP server.
What you need
- An Apify account. The Free plan is enough to try a small run.
- A list of inputs for the Actor (URLs, IDs or search terms — details in the steps below).
- Optional: Python 3 with the
apify-clientpackage if you want to automate the run.
No API key is required. A feed URL or a site URL is enough.
How to run it in the Apify Console
Step 1: Open the Actor
Go to https://apify.com/veenkes/veenkes-rss-feed-reader and click Try for free.
Step 2: Paste URLs
Use a feed such as https://feeds.bbci.co.uk/news/technology/rss.xml, or a homepage like https://simonwillison.net and let auto-discovery find the feed.
Step 3: Cap items and optional filters
Set max items per feed (10 is enough to test). You can filter by keyword or posted since, and decide whether to include full content.
Step 4: Export JSON
Run the Actor and download JSON or CSV. The dataset is already flattened, so this is your RSS-to-JSON output.
Turn on discover all feeds only when a site advertises several feeds and you want them all. De-duplication drops the same item if it appears in more than one feed in the same run.
How to run it from Python
Install the official client and call the Actor by its Store id veenkes/veenkes-rss-feed-reader. Replace YOUR_APIFY_TOKEN with a token from Apify Console > Integrations. Do not commit the token to a public repository.
pip install apify-client from apify_client import ApifyClient client = ApifyClient("YOUR_APIFY_TOKEN") run = client.actor("veenkes/veenkes-rss-feed-reader").call(run_input={ "urls": [ "https://feeds.bbci.co.uk/news/technology/rss.xml" ], "maxItemsPerFeed": 50, "includeContent": True }) # Write every dataset item, then export from the Console or keep going in code. for item in client.dataset(run["defaultDatasetId"]).iterate_items(): print(item) The JavaScript client (apify-client on npm) uses the same Actor id and the same input object. You can also start the run with a plain HTTP POST to the Apify API if you prefer.
Sample output
Here is a shortened example of one dataset record (field values are illustrative of the schema, taken from a real sample run shape):
{ "title": "The rise and fall of Jensen Huang - how the tech superstar became mired in scandal", "link": "https://www.bbc.co.uk/news/articles/cmze750zg0jeo?at_medium=RSS&at_campaign=rss", "guid": "https://www.bbc.co.uk/news/articles/cmze750zg0jeo#0", "author": null, "publishedAt": "2026-11-12T17:11:48.000Z", "updatedAt": null, "categories": [], "summary": "Within days, Huang's status as a seemingly untouchable figure leading the global tech race has crumbled.", "image": "https://ichef.bbci.co.uk/ace/standard/240/cpsprodpb/38db/live/e8339120-deb0-11f1-93e1-3b657b665bcf.jpg", "enclosures": [], "durationSeconds": null, "feedTitle": "BBC News", "feedUrl": "https://feeds.bbci.co.uk/news/technology/rss.xml", "feedLink": "https://www.bbc.co.uk/news/technology", "feedFormat": "rss", "feedLanguage": "en-gb", "feedImage": "https://news.bbcimg.co.uk/nol/shared/img/bbc_news_120x60.gif", "inputUrl": "https://feeds.bbci.co.uk/news/technology/rss.xml", "scrapedAt": "2026-11-12T21:38:26.614Z", "contentText": "Within days, Huang's status as a seemingly untouchable figure leading the global tech race has crumbled…", "contentHtml": "Within days, Huang's status as a seemingly untouchable figure leading the global tech race has crumbled…" } Once the run has finished, open the dataset in the Console and use Export > CSV if a spreadsheet is your destination. JSON is usually better for code and for language models.
What to use the data for
News monitors and briefing agents pull many feeds into one table. Podcast tools need enclosure URLs and durations. Developers who would rather not maintain feedparser code in every project can call this as a small API and get a stable schema back. A scheduled run plus a webhook is a complete 'notify me when this feed updates' system.
Pricing
Pay-per-result pricing starts at $1.00 per 1,000 feed items on the Apify Free plan, with lower unit prices on paid Apify plans, plus a small per-run start fee. Always check the live pricing on the Actor page, because plans and unit prices can change. For a first test, keep the input tiny so you can inspect the schema before you scale up.
Scheduling and automations
In the Apify Console you can schedule the Actor (daily or hourly) and leave the same input in place. For incremental jobs, prefer a "since" or "posted after" style filter when the Actor offers one, so you are not paying to re-collect old rows. When a run finishes you can send a webhook, or connect the Actor in Zapier, Make or n8n. AI agents can discover and call veenkes/veenkes-rss-feed-reader through Apify's MCP server using the same input.
Good practices and limits
Feeds are published by their owners; respect copyright and the site's terms if you redistribute items. Auto-discovery depends on what the site advertises in HTML or well-known paths — a site with no feed cannot be invented. The Actor is not affiliated with any particular publisher.
If a run returns fewer rows than you expected, check the input caps, language or country filters, and the Actor log. A zero-row run is usually a filter or an unavailable source, not a silent crash — read the log before you increase limits.
Next step
Open the Actor and run a small job: RSS to JSON Converter: RSS, Atom & Feed Parser.
If you later want this on a schedule, save the input that worked, add a date filter where it applies, and export CSV automatically from the dataset or from the API snippet above.
![[ANN] PgLoom - Deterministic race-condition model checker on the PostgreSQL wire protocol](https://us1.discourse-cdn.com/flex019/uploads/rust_lang/original/3X/d/c/dc80f49bdcee4484d529dde8b7ec560de189f6d5.gif)