RSS to JSON

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.

GET https://corsproxy.io/?key=…&input=rss&output=json&url=https://feeds.bbci.co.uk/news/rss.xml
Auto
Format detection
RSS, Atom
Feed formats supported
1 line
Integration effort
0
Backend needed
API Reference

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.

Response Shape

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.

Code Examples

Copy & Ship

Vanilla JS Fetch feed items
// 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 })));
React Component Live news feed
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>;
}
Auto-detect Format Reddit & others
// 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.