snscrape, Twint, and Nitter are dead. What now?
All three depended on X showing content to visitors who were not logged in. X removed that. Twint stopped working first, snscrape broke when guest tokens went, and public Nitter instances shut down when guest accounts were cut. No fork, flag, or version pin brings it back.
If you need public posts, profiles, followers, or search, call an API that reads X for you. Openhandle returns the same data these tools returned, absorbs X changes, and never asks you for an X account or a cookie.
Checked September 2026 · request and response run against the API · no affiliate links
curl "https://api.openhandle.dev/v1/twitter/search/posts?q=synthetic&sort=latest" \
-H "Authorization: Bearer $OPENHANDLE_API_KEY"import { OpenHandle } from '@openhandle/sdk';
const openhandle = new OpenHandle({ apiKey: process.env.OPENHANDLE_API_KEY! });
let page = await openhandle.twitter.search.posts.list({ q: 'synthetic', sort: 'latest' });
while (page) {
for (const post of page.data) console.log(post.author.handle, post.text);
page = await page.next();
}{
"platform": "twitter",
"resource": "post",
"capturedAt": "2026-09-18T10:58:02Z",
"source": "live",
"data": [
{
"id": "940100000000000001",
"url": "https://x.com/copperfield_lab_x_test/status/940100000000000001",
"text": "A deterministic text post from a fictional lab. #synthetic",
"createdAt": "2026-08-09T15:30:00Z",
"author": { "id": "940000000001", "handle": "copperfield_lab_x_test" },
"metrics": { "likes": 42, "reposts": 3, "comments": 3, "quotes": 0, "views": null }
}
],
"meta": { "cursors": { "next": "b3BhcXVlLWN1cnNvcg" } }
}Trimmed to one post and the fields snscrape gave you. The example is a Test fixture, so you can run it on a free Test key.
Map the old tools to the API
| You ran | Openhandle |
|---|---|
snscrape twitter-search "query" | GET /v1/twitter/search/posts?q=query&sort=latest |
snscrape twitter-user handle | GET /v1/twitter/profiles/@handle/posts, one page per request |
twint -u handle --followers | GET /v1/twitter/profiles/@handle/followers |
| A Nitter profile page | GET /v1/twitter/profiles/@handle |
| A Nitter thread page | GET /v1/twitter/posts/{id} and /comments for the replies |
| A status URL | POST /v1/urls/fetch with the URL |
What is different
- —It costs money. One price per answered request, after use. The old tools were free because X paid the bill. That ended.
- —Search is what X shows now. There is no full archive.
sort=latestreturns recent public posts. Run it on a schedule and store IDs to build your own history. - —Views may be null. X shows view counts only in some places. When it does not, the field is
null, never0. - —Protected accounts stay protected. A protected account returns
PROFILE_PRIVATE. The old tools could not read those either.
What we never do
Openhandle never logs in to X with your account or anyone else’s. It never posts, likes, reposts, or follows. Public data only, read on request. The public data notice lists every limit.
When this does not work
The answers you will see instead of a stack trace.
| Situation | Status | Code |
|---|---|---|
| The account is protected | 403 | PROFILE_PRIVATE |
| The account is suspended, deleted, or never existed | 404 | PROFILE_NOT_FOUND |
| The cursor came from another query or sort | 400 | CURSOR_MISMATCH |
{
"error": {
"code": "PROFILE_NOT_FOUND",
"message": "This profile was not found.",
"requestId": "req_01j8…",
"retryable": false
}
}Every new workspace starts with 100 free live requests, no card needed. A full synthetic Test dataset covers every X endpoint at no charge.
Read next
More X (Twitter) questions
Send your agent ahead.
Paste the prompt into your agent and it sets everything up. Or come yourself, it takes five minutes.