GuidesNEWS

Free news API without an API key

Prefix https://proxy.cors.dev/ to a publisher RSS feed and you have a free news API: no key, no signup, 600 requests per minute, feeds up to 1 MiB. Most news feeds send no Access-Control-Allow-Origin header, so fetch() from your page fails with a CORS error. The 27 feeds below, from the BBC, The Guardian, Al Jazeera, Sky News, NPR and others, were checked through the proxy with item counts and sizes; 24 need it and 3 work without it.

Why news APIs break in the browser

News API services and news feeds fail in a browser for different reasons. NewsAPI.org's free Developer plan allows 100 requests per day, delays articles by 24 hours and enables CORS for localhost only, so an app that works on your machine breaks once it is deployed; paid plans start at $449 per month. Keyed services also put the key in your page, where anyone can copy it.

Publisher RSS feeds need no key and update throughout the day; the BBC feeds set a ttl of 15 minutes. Most of them send no CORS header, so the browser hides the response from your script. Through cors.dev the request runs on a server and the feed comes back with Access-Control-Allow-Origin set to your origin.

Merge several feeds into one headline list

This fetches three feeds in parallel, keeps whatever loads if one fails, and sorts the items by date. It reads title, link, pubDate and the Media RSS thumbnail that many of these feeds include.

Merge several news feeds into one headline list
// Markup: <ul id="headlines"></ul>
const feeds = {
  BBC: 'https://feeds.bbci.co.uk/news/world/rss.xml',
  'Al Jazeera': 'https://www.aljazeera.com/xml/rss/all.xml',
  'The Guardian': 'https://www.theguardian.com/world/rss',
};
const MEDIA = 'http://search.yahoo.com/mrss/';

async function readFeed(source, url) {
  const response = await fetch('https://proxy.cors.dev/' + url, { credentials: 'omit' });
  if (!response.ok) {
    throw new Error(`${source}: ${response.headers.get('X-Cors-Error') ?? response.status}`);
  }

  const xml = new DOMParser().parseFromString(await response.text(), 'application/xml');
  if (xml.querySelector('parsererror')) throw new Error(`${source}: not valid XML`);

  return [...xml.querySelectorAll('item')].map((item) => {
    const media =
      item.getElementsByTagNameNS(MEDIA, 'thumbnail')[0] ?? item.getElementsByTagNameNS(MEDIA, 'content')[0];
    return {
      source,
      title: item.querySelector('title')?.textContent.trim() ?? '',
      link: item.querySelector('link')?.textContent.trim() ?? '',
      date: new Date(item.querySelector('pubDate')?.textContent ?? 0),
      image: media?.getAttribute('url') ?? null,
    };
  });
}

async function headlines(limit = 20) {
  const results = await Promise.allSettled(Object.entries(feeds).map(([source, url]) => readFeed(source, url)));
  for (const result of results) {
    if (result.status === 'rejected') console.warn(result.reason);
  }
  return results
    .flatMap((result) => (result.status === 'fulfilled' ? result.value : []))
    .sort((a, b) => b.date - a.date)
    .slice(0, limit);
}

const list = document.querySelector('#headlines');
headlines().then((items) => {
  list.replaceChildren(
    ...items.map((item) => {
      const entry = document.createElement('li');
      const link = document.createElement('a');
      if (/^https?:/.test(item.link)) link.href = item.link;
      link.textContent = item.title;
      const time = item.date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
      entry.append(link, ` (${item.source}, ${time})`);
      return entry;
    }),
  );
});

Write text with textContent and only accept http and https links, since feed content comes from a third party. For Atom feeds, more fields and safe rendering in detail, see fetch an RSS feed in JavaScript.

News feeds that work from the browser

Each feed was fetched through https://proxy.cors.dev/ with an Origin header. Item counts and sizes change through the day. Proxy needed means the publisher sends no CORS header your origin can use.

News RSS feeds through cors.dev, checked October 2026
FeedURLItemsSizeProxy needed
BBC News top storieshttps://feeds.bbci.co.uk/news/rss.xml3125 KBYes
BBC Worldhttps://feeds.bbci.co.uk/news/world/rss.xml3124 KBYes
BBC Technologyhttps://feeds.bbci.co.uk/news/technology/rss.xml2115 KBYes
BBC Businesshttps://feeds.bbci.co.uk/news/business/rss.xml5339 KBYes
BBC Sporthttps://feeds.bbci.co.uk/sport/rss.xml7157 KBYes
Al Jazeerahttps://www.aljazeera.com/xml/rss/all.xml2517 KBYes
The Guardian Worldhttps://www.theguardian.com/world/rss45152 KBYes
The Guardian Technologyhttps://www.theguardian.com/uk/technology/rss32120 KBYes
Sky Newshttps://feeds.skynews.com/feeds/rss/home.xml912 KBYes
NPR Newshttps://feeds.npr.org/1001/rss.xml1014 KBYes, allows apps.npr.org only
CBS Newshttps://www.cbsnews.com/latest/rss/main3027 KBYes
The Wall Street Journal Worldhttps://feeds.a.dj.com/rss/RSSWorldNews.xml2013 KBYes
Euronewshttps://www.euronews.com/rss5033 KBYes
Le Monde in Englishhttps://www.lemonde.fr/en/rss/une.xml1419 KBYes
Der Spiegel Internationalhttps://www.spiegel.de/international/index.rss2021 KBYes
Times of Indiahttps://timesofindia.indiatimes.com/rssfeedstopstories.cms4851 KBYes
NDTVhttps://feeds.feedburner.com/ndtvnews-top-stories2029 KBYes
ABC News Australiahttps://www.abc.net.au/news/feed/51120/rss.xml2587 KBYes
UN Newshttps://news.un.org/feed/subscribe/en/news/all/rss.xml3034 KBYes
TechCrunchhttps://techcrunch.com/feed/2017 KBYes, allows techcrunch.com only
Ars Technicahttps://feeds.arstechnica.com/arstechnica/index2076 KBYes
The Vergehttps://www.theverge.com/rss/index.xml1030 KBYes
Engadgethttps://www.engadget.com/rss.xml2037 KBYes
Hacker News front pagehttps://hnrss.org/frontpage2017 KBYes
The New York Timeshttps://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml1535 KBNo, sends *
DW Englishhttps://rss.dw.com/xml/rss-en-all13684 KBNo, sends *
Fox News latesthttps://moxie.foxnews.com/google-publisher/latest.xml25166 KBNo, sends *

NPR and TechCrunch do send a CORS header, but only for their own sites, so your page still needs the proxy. The New York Times, DW and Fox News send Access-Control-Allow-Origin: *; call those directly. To check a feed that is not listed:

Check whether a feed needs the proxy
# No output: the feed sends no CORS header, so your page needs the proxy
curl -s -o /dev/null -D - -H 'Origin: https://example.com' \
  https://feeds.bbci.co.uk/news/rss.xml | grep -i access-control-allow-origin

# access-control-allow-origin: * means fetch() works without a proxy
curl -s -o /dev/null -D - -H 'Origin: https://example.com' \
  https://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml | grep -i access-control-allow-origin

Feeds that do not work through the proxy

  • Google News RSS: Google answers the proxy with 503 and its automated queries error page, so news.google.com feeds do not work through cors.dev.
  • CNN: the rss.cnn.com feeds are served over plain HTTP and fail over HTTPS, and cors.dev only fetches HTTPS targets.
  • Yahoo News and France 24: Yahoo answers 403, and France 24 returns an HTML page instead of the feed.
  • CNBC: the proxy cannot reach its feed host and answers 502 upstream_unreachable, but CNBC sends Access-Control-Allow-Origin: *, so call it directly.

Limits

  • cors.dev free tier: GET and HEAD, 600 requests per minute per client IP, no daily or monthly quota, responses up to 1 MiB. Every feed in the table is under 200 KB, and the biggest one checked, The Guardian International at 395 KB, still fits.
  • Headers: send a plain fetch() with no custom headers. The free tier forwards only Accept, If-None-Match and If-Modified-Since and answers 400 header_not_allowed when your code or HTTP library adds Authorization or a custom header such as X-Api-Key.
  • Polling: refresh every 5 to 15 minutes and cache between visits; feeds do not change every second.
  • Reuse: a feed is free to read, not free to republish. Show headlines with a link back, and check the terms of the publisher before you use full text or images in a product.

Good questions.

Is there a free news API with no API key?

Yes: the RSS feeds that publishers such as the BBC, The Guardian, Al Jazeera and NPR provide for their readers. They are free, need no key or signup, and update throughout the day. From a browser most of them need a CORS proxy such as https://proxy.cors.dev/.

Why does NewsAPI work on localhost but fail after I deploy?

NewsAPI.org's free Developer plan enables CORS for localhost only, so browser requests from your deployed domain are refused. It also limits you to 100 requests per day with a 24-hour delay. Call it from a server, pay for a plan, or switch to RSS feeds.

Can I send my NewsAPI key through cors.dev?

The free tier refuses an apiKey parameter in the target URL and an X-Api-Key header with a 400 error. Pro accepts keys, but a key in browser code is public, so keyed news APIs belong on a server.

Does Google News RSS work through a CORS proxy?

Not through cors.dev. Google answers the proxy with 503 and its automated queries error page for news.google.com feeds, so use publisher feeds instead.

Do the feeds include images?

Many do, as a Media RSS thumbnail or content element with a url attribute: the BBC, The Guardian, Sky News and The New York Times among them. Load that URL in an img tag; images do not need the proxy.

How often should I refresh a news feed?

Every 5 to 15 minutes is plenty. The BBC feeds set a ttl of 15 minutes, and at 600 requests per minute per client IP the proxy is not what limits you.