LurkAPI

Reddit RSS feeds end November 13: how to keep yours working

Reddit turns off every RSS feed on November 13, 2026. Keep your feed URLs: a small Cloudflare Worker serves the same paths from LurkAPI. Change only the host.

5 min read

A railway handcar loaded with rolled newspapers rolls toward a switch: a short spur ends at an amber buffer stop, the main line curves on over green hills.

If your feed reader, an n8n or Zapier step or a Discord bot reads reddit.com/r/…/.rss, it goes quiet on November 13, 2026. Reddit is switching off every RSS feed that day and offers nothing in their place unless you moderate the community.

You can keep the feed anyway. A 49-line Cloudflare Worker answers the same feed URLs with posts read through LurkAPI, so you change only the host. Refreshed every hour, one subreddit costs 24 credits a day.

One subreddit subscribed twice, from reddit.com and from the Worker. Reddit’s goes gray on November 13; the Worker’s keeps taking in new posts.

Every Reddit feed stops, and switching readers won’t help

Reddit announced it on September 30: RSS has become a route for large-scale scraping, so the feeds go, with no exceptions. Subreddit feeds stop, and so do sorted ones like /new/.rss, multireddits (/r/a+b/.rss), search, user and comment feeds, and the private feeds that carry a token in the URL.

Inoreader, Zapier’s RSS step, WordPress aggregators and Discord feed bots all poll the feed URLs on reddit.com, and none of them keeps its own copy of Reddit. Inoreader has already said it won’t get new Reddit posts after the 13th.

Moderators get one replacement, Discord Relay: a Reddit app that posts mod-queue items, reports and modmail to Discord or Slack. That covers mod teams who pointed RSS at their mod queue. For everyone else Reddit says there is no replacement, and the official API is closing as well: new requests for access stopped on October 31 (Reddit’s API timeline).

If your Reddit feeds were failing long before this, that began in June. A logged-out reader now gets one Reddit feed refresh per minute per IP, and the rest come back as 429 Too Many Requests. The limit counts your IP, not the feed, so a reader that checks a dozen Reddit feeds in one pass gets the first and errors for the others.

Keep the feed URL, change the host

Swap the host and keep the path. These are the feed URLs the Worker answers.

For each feed URL, the Worker asks LurkAPI for that subreddit or search and writes the posts out as an Atom feed, newest first, with the text, image, score and comment count. LurkAPI reads reddit.com’s public pages, so the feed doesn’t depend on either thing Reddit is switching off, the .rss URLs or the public API. User and comment feeds aren’t covered, and private feeds (your saved posts, your front page) belong to your Reddit login, so those end on the 13th.

To set it up:

  1. Get a LurkAPI key. New accounts start with 100 credits.
  2. Save worker.js and wrangler.toml (below) in an empty folder.
  3. Run the two commands below in that folder. The first stores your key as a secret; the second deploys the Worker and prints its URL, something like https://reddit-feeds.yourname.workers.dev.
  4. In your reader, bot or automation, replace https://www.reddit.com with that URL in each feed address.
Deploy the Worker
npx wrangler secret put LURK_KEYnpx wrangler deploy
worker.js (49 lines) and wrangler.toml
worker.js
// Reddit's feed URLs, served from LurkAPI. Swap www.reddit.com for this Worker's host.
// /r/selfhosted/.rss  /r/selfhosted/new/.rss  /r/rss+selfhosted/new/.rss
// /search.rss?q=...&sort=new  /r/selfhosted/search.rss?q=...&restrict_sr=on
const API = "https://api.lurkapi.com/v1/reddit";
const esc = (s = "") => String(s).replace(/[&<>"']/g, (c) => `&#${c.charCodeAt(0)};`);

export default {
  async fetch(req, env) {
    const { pathname, searchParams: q, href } = new URL(req.url);
    const t = q.get("t") ? `&timeframe=${q.get("t")}` : "";
    const sub = pathname.match(/^\/r\/([\w+]+)\/(?:(hot|new|top|rising)\/)?\.rss$/);
    const search = pathname.match(/^(?:\/r\/(\w+))?\/search\.rss$/);
    let calls;
    if (sub) {
      calls = sub[1].split("+").map((s) => `${API}/subreddit?subreddit=${s}&sort=${sub[2] ?? "hot"}${t}`);
    } else if (search && q.get("q")) {
      const query = (search[1] && q.get("restrict_sr") ? `subreddit:${search[1]} ` : "") + q.get("q");
      const sort = q.get("sort") === "comments" ? "comment_count" : (q.get("sort") ?? "relevance");
      calls = [`${API}/search?query=${encodeURIComponent(query)}&sort=${sort}${t}`];
    } else return new Response("Not a Reddit feed URL", { status: 404 });

    const pages = await Promise.all(calls.map((u) => fetch(u, { headers: { "x-api-key": env.LURK_KEY } }).then((r) => r.json())));
    const failed = pages.find((p) => !p.success);
    if (failed) return new Response(failed.error, { status: 502 });

    const entries = pages
      .flatMap((p) => p.posts)
      .sort((a, b) => b.created_utc - a.created_utc)
      .map((p) => {
        const link = `https://www.reddit.com${p.permalink ?? `/comments/${p.id}/`}`;
        const img = p.thumbnail ? `<p><img src="${esc(p.thumbnail)}"></p>` : "";
        const body = p.selftext_html ?? "";
        const out = p.url_overridden_by_dest ? `<p><a href="${esc(p.url_overridden_by_dest)}">${esc(p.url_overridden_by_dest)}</a></p>` : "";
        const meta = `<p>r/${p.subreddit} · score ${p.score} · <a href="${link}">${p.num_comments} comments</a></p>`;
        return `<entry><id>${esc(link)}</id><title>${esc(p.title)}</title><link href="${esc(link)}"/>
<author><name>/u/${esc(p.author ?? "[deleted]")}</name></author><category term="${p.subreddit}" label="r/${p.subreddit}"/>
<published>${new Date(p.created_utc * 1000).toISOString()}</published><updated>${new Date(p.created_utc * 1000).toISOString()}</updated>
<content type="html">${esc(img + body + out + meta)}</content></entry>`;
      });

    const title = sub ? `r/${sub[1]} (${sub[2] ?? "hot"})` : `Reddit search: ${q.get("q")}`;
    const xml = `<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><id>${esc(href)}</id><title>${esc(title)}</title>
<link rel="self" href="${esc(href)}"/><updated>${new Date().toISOString()}</updated>
${entries.join("\n")}
</feed>`;
    return new Response(xml, { headers: { "content-type": "application/atom+xml; charset=utf-8" } });
  },
};
wrangler.toml
name = "reddit-feeds"
main = "worker.js"
compatibility_date = "2026-04-01"

It runs on Cloudflare’s free Workers plan. Your reader gets ordinary Atom with the posts Reddit’s feed would have listed, in its order, so it treats the new URL like any other feed.

If the feed only exists to start an n8n, Make or Zapier workflow, you can drop RSS altogether. An HTTP request step that calls the subreddit endpoint gets those posts as JSON, with Reddit’s own field names (title, selftext, score, num_comments, permalink). To pull a subreddit into a spreadsheet once, without code, the free Reddit scraper downloads it as CSV.

Newest posts in r/selfhosted · 1 credit
BASE=https://api.lurkapi.comcurl -G "$BASE/v1/reddit/subreddit" \-d subreddit=selfhosted -d sort=new \-H "x-api-key: $LURK_KEY"

A slower refresh catches the same posts for less

Each refresh of a subreddit feed is one call, 1 credit. Your bill depends on how often your reader refreshes:

Refresh everyPer dayFree feeds
15 minutes96 credits0
1 hour24 credits0
4 hours6 credits3
One subreddit per feed. Free feeds: how many the free daily top-up of 20 credits covers. Each feed past those, refreshed hourly, is $0.67 a month at Pro rates ($39 for 42,000 credits).

A faster refresh only changes how soon a post reaches you. Each refresh returns the newest 25 or so posts, so a feed misses something only when more than a page arrives between two refreshes.

A busy subreddit like r/selfhosted gets about 25 new posts a day, so no four-hour stretch brings more than a page. A refresh every four hours catches all of them. A refresh every 15 minutes gets the same posts a little sooner, for 16 times the calls.

A day of r/selfhosted: refreshing every 4 hours ends with the same 25 posts as every 15 minutes, in 5 refreshes instead of 80.

So start slow and speed up only for the feeds you need sooner. At four hours a feed costs 6 credits a day, and the free daily credits cover 3 of them.

A multireddit like /r/rss+selfhosted/new/.rss is one call per subreddit, 2 credits a refresh.

Questions

What is the Reddit RSS feed URL?

Add .rss to a reddit.com address: /r/<sub>/.rss for a subreddit, /r/<sub>/new/.rss for its newest posts, /r/a+b/.rss for several at once, /search.rss?q=<term> for a search. Reddit stops serving them on November 13, 2026. On the Worker in this post the same paths keep working under your own host.

Why is my Reddit RSS feed not working?

Since June 2026, Reddit allows one logged-out feed refresh per minute per IP and answers 429 Too Many Requests after that, so a reader with several Reddit feeds fails most refreshes. From November 13, 2026 the feeds are off for everyone.

Does Reddit still have RSS?

Only until November 13, 2026. After that Reddit serves no RSS feeds. Moderators get Discord Relay, an app that sends mod alerts to Discord or Slack; for everyone else Reddit says there is no replacement.

Is there a Reddit RSS feed generator that still works?

Yes. The Cloudflare Worker in this post answers Reddit's own feed URLs for subreddit, sorted, multireddit and search feeds with Atom built from LurkAPI, at 1 credit per subreddit per refresh.

How do I send a Reddit RSS feed to Discord?

Give your Discord feed bot the Worker's URL instead of the reddit.com one, and it keeps posting new threads. Moderators who only need mod-queue, report and modmail alerts can use Reddit's Discord Relay app.

Keep reading