RSS Feeds as JSON.
No Parser Required.
Fetch a public RSS or Atom feed as JSON with a Production API key. The response preserves the original feed structure, including podcast enclosure attributes.
JSON conversion requires Production. For raw feed access in a browser, use Free or higher and leave input and output unset. Test a raw feed.
Query Parameters
input optional rss | xml | csv Source format. Use rss for feeds (including Atom), or omit to auto-detect.
output required json Set to json to convert the feed.
url required https://feed-url.com/rss Feed URL to fetch and convert. URL-encode it.
key required YOUR_API_KEY Your CORSPROXY API key.
JSON Output
{
"type": "rss",
"data": {
"rss": {
"channel": {
"title": "Example podcast",
"item": [
{
"title": "Episode 1",
"link": "https://example.com/episodes/1",
"enclosure": {
"_url": "https://example.com/1.mp3",
"_type": "audio/mpeg"
}
},
{
"title": "Episode 2",
"link": "https://example.com/episodes/2"
}
]
}
}
}
} RSS entries are in data.rss.channel.item; Atom entries are in data.feed.entry. A single entry is an object; multiple entries form an array. XML attributes use an underscore prefix, such as _url and _href. This API does not return a normalized items array.
News Aggregators
Pull from dozens of news sources and combine them into a unified feed without a backend parser.
Podcast Players
Build a browser-based podcast player that reads any RSS feed directly from JavaScript.
Content Widgets
Embed live blog posts, YouTube videos, or Reddit threads on any website with a few lines of JS.
Developer Dashboards
Monitor GitHub release feeds, Hacker News, or product update logs in your internal dashboard.
No-Code Integrations
Use with Bubble, Webflow, or Retool to display live feed data without a custom backend.
Browser Extensions
Build RSS reader extensions that fetch and render any feed client-side without CORS issues.
Copy & Ship
// RSS to JSON requires a Production API key.
const feed = 'https://feeds.bbci.co.uk/news/rss.xml';
const params = new URLSearchParams({
key: 'YOUR_API_KEY', input: 'rss', output: 'json', url: feed
});
const res = await fetch('https://corsproxy.io/?' + params);
if (!res.ok) throw new Error('HTTP ' + res.status + ': ' + await res.text());
const { data } = await res.json();
// The original XML structure is preserved, including single-item feeds.
const entries = data.rss?.channel?.item;
const items = entries == null ? [] : Array.isArray(entries) ? entries : [entries];
console.log(items.map(item => ({ title: item.title, link: item.link }))); import { useEffect, useState } from 'react';
export function NewsFeed({ feedUrl, apiKey }) {
const [items, setItems] = useState([]);
const [error, setError] = useState('');
useEffect(() => {
const controller = new AbortController();
setItems([]);
setError('');
const params = new URLSearchParams({
key: apiKey, input: 'rss', output: 'json', url: feedUrl
});
async function load() {
try {
const res = await fetch('https://corsproxy.io/?' + params, {
signal: controller.signal
});
if (!res.ok) throw new Error('HTTP ' + res.status + ': ' + await res.text());
const { data } = await res.json();
const entries = data.rss?.channel?.item;
if (!controller.signal.aborted) {
setItems(entries == null ? [] : Array.isArray(entries) ? entries : [entries]);
}
} catch (err) {
if (!controller.signal.aborted) setError(err.message);
}
}
load();
return () => controller.abort();
}, [feedUrl, apiKey]);
if (error) return <p role="alert">{error}</p>;
return <ul>{items.map((item, index) => (
<li key={item.link || index}><a href={item.link}>{item.title}</a></li>
))}</ul>;
} // Atom uses data.feed.entry, rather than data.rss.channel.item.
// Omit input to auto-detect the source format. Requires Production.
const params = new URLSearchParams({
key: 'YOUR_API_KEY', output: 'json',
url: 'https://github.com/astro/astro/releases.atom'
});
const res = await fetch('https://corsproxy.io/?' + params);
if (!res.ok) throw new Error('HTTP ' + res.status + ': ' + await res.text());
const { data } = await res.json();
const entries = data.feed?.entry;
const items = entries == null ? [] : Array.isArray(entries) ? entries : [entries];
console.log(items); Production feature
Your first JSON feed in 60 seconds.
Use Production for RSS-to-JSON conversion. Free browser accounts can fetch the original RSS or Atom XML without conversion, within their request and bandwidth limits.
