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.
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
www.reddit.com
/r/selfhosted/new/.rss
reddit-feeds.yourname.workers.dev
/r/selfhosted/new/.rss
- /r/selfhosted/.rssSubreddit
- /r/selfhosted/new/.rssSorted: hot, new, top, rising
- /r/rss+selfhosted/new/.rssMultireddit
- /search.rss
?q=rss+reader&sort=newSearch all of Reddit - /r/selfhosted/search.rss
?q=backup&restrict_sr=onSearch one subreddit
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:
- Get a LurkAPI key. New accounts start with 100 credits.
- Save
worker.jsandwrangler.toml(below) in an empty folder. - 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. - In your reader, bot or automation, replace
https://www.reddit.comwith that URL in each feed address.
npx wrangler secret put LURK_KEYnpx wrangler deployworker.js (49 lines) and wrangler.toml
// 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" } });
},
};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.
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 every | Per day | Free feeds |
|---|---|---|
| 15 minutes | 96 credits | 0 |
| 1 hour | 24 credits | 0 |
| 4 hours | 6 credits | 3 |
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.
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.



