Nitter alternative for developers: getting tweets into code
A Nitter alternative for scripts and RSS readers: where Nitter stands after X's legal letters, self-hosting, RSS-Bridge, and an API script for Twitter RSS.
Piyushh · October 14, 2026 · 7 min read
The working Nitter alternative for developers is an API plus a few lines of code that turn its JSON into a feed. Most public Nitter instances went dark after X Corp. sent cease and desist letters on August 24, 2026. The zedeus/nitter repository is archived, and on October 10 the maintainer wrote that the project has no legal counsel. Any script or RSS reader that pointed at a Nitter instance needs a new source.
This post covers what happened, the options for code (self-hosting, RSS-Bridge, the official X API, a hosted API), and a Python script that builds a Twitter RSS feed from an API call, with real sample output. If you only want to read X in a browser without an account, XAutoDM tested which Nitter instances and viewers still work. Everything below was checked on October 14, 2026.
What happened to Nitter in 2026
The timeline below comes from the project's own pages:
- August 24, 2026: according to the Nitter README, "cease and desist letters were sent by X Corp. demanding a permanent takedown of Nitter instances and the project's repository."
- August 25: in issue #1442, titled "All public nitter instances do not work," maintainer zedeus wrote: "We have received cease and desist letters. Awaiting legal advice at the moment, but for now expect all nitter instances to remain down for the foreseeable future."
- September 6 and 7: a commit titled "Update README - Nitter lives," and a nitter.net update saying the project would continue with legal representation.
- September 8: per nitter.net, X sent another letter "with the same demands and legal threats."
- October 9: the GitHub repository was archived (read-only). Its last push was that day.
- October 10: the nitter.net update says the earlier legal assurances "have since turned out to be untrue" and that "Nitter currently has no legal counsel."
XCancel, a widely used Nitter instance, shows "XCancel service is suspended" and returns HTTP 451 (unavailable for legal reasons). Tech commentator @EvanKirstel reported that X cited "a Texas computer access law and the Lanham Act" (post). The letters themselves aren't public.
Feed users felt it first. @TRX9800_ asked, in capitals, how they were supposed to use RSS for Twitter now (post).
Why Nitter feeds were fragile for scripts
Nitter was never an API. It was a front end that fetched X content on the server and rendered it as HTML and RSS. When someone on Hacker News asked how instances got their content, one commenter answered: "HTTP. They just load the page while logged in to one of the server's accounts" (comment). Another put it shorter: "It's basically a proxy" (comment).
Every script built on Nitter inherited that design:
- RSS depended on the instance and was often switched off. The README lists "RSS feeds (instance-specific, often disabled due to abuse)," and
nitter.example.confhas a separate switch for each feed type, fromenableRSSUserTweetstoenableRSSSearch. - Each instance shared its rate limits with all of its users. Issue #1442 opened with "Every instance has the same
Instance has been rate limited.error." - The output was shaped like HTML. Feeds carried rendered text and Nitter links instead of structured fields like likes, views or reply counts.
A replacement should give you structured data from a source you control.
Nitter alternatives for developers, compared
| Option | What you need | Structured data | Main risk |
|---|---|---|---|
| Self-hosted Nitter | A server, Nim, Redis or Valkey, logged-in X account cookies | No (HTML and RSS) | Account suspensions; legal letters |
| RSS-Bridge, Twitter V2 bridge | A PHP host and your own X API Bearer token | RSS only | X pay-per-use bill |
| RSS-Bridge, other Twitter bridges | A PHP host | RSS only | Depend on guest tokens or Nitter instances |
| Official X API | An X developer app and credits | Yes (JSON) | Per-post billing |
| Hosted API (for example ChatterAPI) | One API key | Yes (JSON) | A third party in your stack |
| Browser viewers | Nothing | No | Not built for code |
Self-hosting Nitter
Self-hosting still works for some people. In the same issue, user MiningTcup wrote: "My instance still works and self-hosting should still work" (comment).
The README lists what you need: Nim to compile, libsass, Redis or Valkey, a nitter.conf with your hostname and HMAC key, and, for the Docker Compose setup, a sessions.jsonl file. That last file holds cookies (auth_token and ct0) from logged-in X accounts, and the repo's tools/ folder has create_session_browser.py to produce them. The older curl-based script is marked deprecated because "X now requires a castle token generated by client-side JavaScript during the login flow."
There are two problems to know about before you set one up. X's developer guidelines list "Non-API access" as prohibited, with "scraping and browser automation = permanent ban," so the accounts in sessions.jsonl can be suspended. The project is also archived, so when X changes something again, no fix will come from upstream.
RSS-Bridge
RSS-Bridge is maintained (last push October 13, 2026) and ships several Twitter bridges. Read the code before you rely on one:
TwitterV2Bridgecallsapi.twitter.com/2and "requires a unique API Bearer Token." That means you need an X developer app and pay-per-use credits. By default it requests 10 posts per poll.TwitterBridge, the classic one, requests guest tokens from X's API. We didn't test it. Nitter itself moved to logged-in sessions, so assume guest-token access is unreliable.FarsideNitterBridgereads through farside.link, a redirector to public Nitter instances.farside.link/nitter/returned 404 when we checked.
The official X API
The first-party option is the official API. You create an app in X's Developer Console (our X API key guide has the steps) and poll the user timeline or recent search. Reads cost $0.005 per post returned, according to X's pricing page on Oct 14, 2026, and new developers get no free tier. Our post on whether the X API is free covers the starter credits.
Build a Twitter RSS feed from an API
In practice, a Nitter RSS alternative looks like this. The script below polls ChatterAPI's x.tweets endpoint for an account, or x.search for a query, and prints an RSS 2.0 feed. It needs only requests and the standard library.
import os, sys, requests
from email.utils import format_datetime
from datetime import datetime
from xml.sax.saxutils import escape
API = "https://api.chatterapi.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['CHATTERAPI_KEY']}"}
def fetch(kind, value):
if kind == "user":
url, params = f"{API}/x/users/{value}/tweets", {"includeRetweets": "false"}
title, link = f"@{value} on X", f"https://x.com/{value}"
else:
url, params = f"{API}/x/tweets/search", {"q": value, "sort": "latest"}
title, link = f"X search: {value}", "https://x.com/search"
r = requests.get(url, headers=HEADERS, params=params, timeout=60)
r.raise_for_status()
return title, link, r.json()["data"]
def to_rss(title, link, tweets):
items = []
for t in tweets:
when = datetime.fromisoformat(t["createdAt"].replace("Z", "+00:00"))
first_line = t["text"].split("\n")[0][:100]
items.append(f""" <item>
<title>{escape(t['author']['handle'] + ': ' + first_line)}</title>
<link>{t['url']}</link>
<guid isPermaLink="true">{t['url']}</guid>
<pubDate>{format_datetime(when)}</pubDate>
<description>{escape(t['text'])}</description>
</item>""")
return f"""<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel>
<title>{escape(title)}</title>
<link>{link}</link>
<description>Generated from the ChatterAPI X endpoints</description>
{chr(10).join(items)}
</channel></rss>"""
if __name__ == "__main__":
kind, value = sys.argv[1], sys.argv[2] # user levelsio | search '"crm recommendation"'
print(to_rss(*fetch(kind, value)))
For a search, run it with python x_rss.py search '"crm recommendation"' > feed.xml. Here is the start of the real output, from a sample recorded with a test key:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel>
<title>X search: "crm recommendation"</title>
<link>https://x.com/search</link>
<description>Generated from the ChatterAPI X endpoints</description>
<item>
<title>HesomParhizkar: meta ads: how important is the “connect to your crm” recommendation?</title>
<link>https://x.com/HesomParhizkar/status/2099495333231288346</link>
<guid isPermaLink="true">https://x.com/HesomParhizkar/status/2099495333231288346</guid>
<pubDate>Mon, 14 Sep 2026 13:47:48 +0000</pubDate>
<description>meta ads: how important is the “connect to your crm” recommendation?
...
The account version (python x_rss.py user levelsio) returned 19 items from one call, and the file parses as valid XML. Because the tweet URL doubles as the guid, feed readers dedupe items across polls on their own. Links point at x.com, not at an instance that might disappear.
Serving the feed
Most feed readers only need a URL. The simplest setup is a cron job that writes the file into a static folder your web server already serves:
# every hour: rebuild the feed into a public folder
0 * * * * cd /opt/feeds && CHATTERAPI_KEY=... python x_rss.py user levelsio > /var/www/feeds/levelsio.xml
You can also send the same JSON straight to Slack, Discord or n8n, which usually don't need RSS at all. If your reader mixed both platforms, we built the same kind of replacement for subreddits in Reddit RSS feeds are ending. Try the account endpoint first in the free X timeline scraper, or the search endpoint in X tweet search.
What polling a Twitter RSS feed costs
Say you track 10 accounts that each post about 5 times a day, and you poll every account once an hour for 30 days. Prices as listed on Oct 14, 2026:
| Route | How it bills | Monthly cost |
|---|---|---|
| RSS-Bridge Twitter V2 with your X API token | $0.005 per post returned, 10 posts per poll, repeats within a UTC day free | About 4,500 posts, about $22.50 |
ChatterAPI x.tweets | 3 credits per call | 7,200 calls, 21,600 credits, $19 (Starter, 25,000 credits) |
ChatterAPI x.tweets, polled every 30 minutes | 3 credits per call | 43,200 credits, $49 (Growth) |
The X estimate assumes the first poll each day returns the 10 latest posts and every later poll adds only the new ones, because X deduplicates charges within a UTC day. On the official API that makes polling frequency close to free. ChatterAPI charges per call. If you need feeds refreshed every few minutes, the official API can come out cheaper, and at hourly polling the two cost about the same. ChatterAPI's case rests on everything around the price: one key with no X developer app, structured JSON, and Reddit on the same balance. For bigger jobs, our Twitter API cost calculator runs the numbers.
If you want bulk archives rather than feeds, see searching tweets by date and the guide to scraping Twitter and Reddit together. The snscrape alternative page and our comparison with other third-party X APIs cover the other tools Nitter users tend to try next.
Try it
Pick the feed you lost when your Nitter instance went down and rebuild it with the script above. Sign up with Google for 100 free credits, which covers about 33 polls and needs no card. Plans start at $19 a month for 25,000 credits.