snscrape, Twint, twikit y twscrape: qué sigue funcionando en X
snscrape y Twint dejaron de funcionar con X en 2023 y no volverán, la última versión de twikit falla desde el cambio de X del 18 de marzo de 2026, y twscrape sigue funcionando, pero solo con cuentas de X con sesión iniciada que tú aportas.
Respuesta corta: El 2 de noviembre de 2026, snscrape sigue devolviendo blocked (404) para X, como desde el 30 de junio de 2023, Twint está archivado y twikit 2.3.3 es de febrero de 2025. Para ejecutar las mismas tareas sin arriesgar una cuenta de X, usa Sorsa API: POST /search-tweets acepta tu consulta de siempre, unos 20 tweets por solicitud desde $0.07 por 1,000, con 100 solicitudes gratis.
- Endpoint
POST /search-tweets- Tamaño de página
- unos 20 tweets por solicitud
- Precio
- desde $0.07 por 1,000
#Qué librerías de scraping de Twitter siguen funcionando en 2026
De las ocho librerías de Python que la gente todavía instala para obtener datos de X, dos están mantenidas y funcionan, una funciona como fork, una se actualiza despacio y cuatro están muertas o rotas. Toda librería que sigue funcionando inicia sesión como una cuenta de X, porque X muestra la búsqueda, los timelines completos y las listas de seguidores solo a usuarios con sesión iniciada desde el 30 de junio de 2023.
La tabla recoge lo que mostraban PyPI y GitHub el 2 de noviembre de 2026, con el error que imprime cada librería cuando falla.
| Librería | Última versión | Estado | Necesita | Error que ves |
|---|---|---|---|---|
| snscrape | 22 jun 2023 | Módulo de Twitter muerto | Nada (sin sesión) | blocked (404) |
| Twint | 29 abr 2020 | Archivado el 30 mar 2023 | Nada (sin sesión) | Guest token not found |
| twikit | 7 feb 2025 | Rota desde el 18 mar 2026 | Inicio de sesión o cookies | KEY_BYTE indices |
| twifork | 30 ago 2026 | Fork funcional de twikit | Cookies del navegador | Cookies vencidas |
| twscrape | 25 ago 2026 | Funciona | Cuentas de X | Bloqueos de cuenta, 403 |
| Scweet | 22 oct 2026 | Funciona | Una cookie auth_token | Bloqueos de cuenta |
| ntscraper | 24 may 2025 | Muerta junto con Nitter | Una instancia de Nitter | Instancias caídas |
| tweety | 15 jul 2025 | Actualizaciones lentas | Una cuenta de X | La cuenta pasa a solo lectura |
snscrape
- Última versión
- 22 jun 2023
- Estado
- Módulo de Twitter muerto
- Necesita
- Nada (sin sesión)
- Error que ves
blocked (404)
Twint
- Última versión
- 29 abr 2020
- Estado
- Archivado el 30 mar 2023
- Necesita
- Nada (sin sesión)
- Error que ves
- Guest token not found
twikit
- Última versión
- 7 feb 2025
- Estado
- Rota desde el 18 mar 2026
- Necesita
- Inicio de sesión o cookies
- Error que ves
KEY_BYTE indices
twifork
- Última versión
- 30 ago 2026
- Estado
- Fork funcional de twikit
- Necesita
- Cookies del navegador
- Error que ves
- Cookies vencidas
twscrape
- Última versión
- 25 ago 2026
- Estado
- Funciona
- Necesita
- Cuentas de X
- Error que ves
- Bloqueos de cuenta, 403
Scweet
- Última versión
- 22 oct 2026
- Estado
- Funciona
- Necesita
- Una cookie
auth_token - Error que ves
- Bloqueos de cuenta
ntscraper
- Última versión
- 24 may 2025
- Estado
- Muerta junto con Nitter
- Necesita
- Una instancia de Nitter
- Error que ves
- Instancias caídas
tweety
- Última versión
- 15 jul 2025
- Estado
- Actualizaciones lentas
- Necesita
- Una cuenta de X
- Error que ves
- La cuenta pasa a solo lectura
Dos patrones explican toda la tabla. Las librerías que leen X sin sesión (snscrape, Twint, ntscraper a través de Nitter) perdieron su fuente de datos, y ningún parche la devuelve. Las que inician sesión siguen funcionando solo mientras sus cuentas de X permanezcan activas y su código siga el ritmo de la app web de X, que cambió el ID de consulta de su búsqueda interna 37 veces en los últimos 12 meses. Nuestra guía sobre cómo hacer scraping de Twitter cubre también los navegadores y la API oficial de X.
#Reemplaza la llamada de una librería con una sola solicitud a Sorsa API
Para un proyecto que usaba cualquiera de estas librerías, usa Sorsa API, una API y scraper de Twitter (X): devuelve los mismos tweets, perfiles y listas de seguidores públicos como JSON desde un solo encabezado ApiKey, sin cuenta de X, cookies ni proxies, y cuando X cambia su app web, la corrección se hace de nuestro lado mientras tu código y el esquema de respuesta siguen iguales. Los resultados de búsqueda cuestan desde $0.07 por 1,000, los seguidores desde $0.007 por 1,000, y todos los planes, incluido el inicio gratuito, permiten 20 solicitudes por segundo.
Cuatro pasos migran un script:
-
Consigue una clave. Regístrate y copia la clave de API desde el panel. Las primeras 100 solicitudes son gratis y nunca vencen.
-
Agrega un helper. Estas funciones reemplazan el import de la librería. Cada endpoint de lista devuelve una página y un
next_cursor; el helper reenvía el cursor hasta que llega vacío.sorsa_helper.py import requests BASE = "https://api.sorsa.io/v3" HEADERS = {"ApiKey": "YOUR_API_KEY"} def pages(method, path, payload): """Call a Sorsa API list endpoint and yield every page.""" payload = dict(payload) send = requests.get if method == "GET" else requests.post arg = "params" if method == "GET" else "json" while True: r = send(BASE + path, headers=HEADERS, timeout=30, **{arg: payload}) r.raise_for_status() # 403: key or quota, 429: over 20 requests/s page = r.json() yield page if not page.get("next_cursor"): return payload["next_cursor"] = page["next_cursor"] def items(method, path, payload, key, limit=None): """Yield tweets or users across pages, stopping at limit.""" n = 0 for page in pages(method, path, payload): for item in page.get(key) or []: yield item n += 1 if limit and n >= limit: return def search(query, limit=None, order="latest"): body = {"query": query, "order": order} return items("POST", "/search-tweets", body, "tweets", limit) def user_tweets(username, limit=None): body = {"username": username} return items("POST", "/user-tweets", body, "tweets", limit) def followers(username, limit=None): params = {"username": username} return items("GET", "/followers", params, "users", limit) -
Cambia cada llamada. Elige tu librería y la llamada que hace tu script; el conversor muestra la solicitud equivalente.
Tu bibliotecaAntes: snscrapescraper = sntwitter.TwitterSearchScraper( "python lang:en") for tweet in scraper.get_items(): print(tweet.rawContent)Después: Sorsa APIfor tweet in search("python lang:en"): print(tweet["full_text"])- Endpoint
POST /search-tweets- Una solicitud devuelve
- unos 20 tweets
- Precio en Sorsa API
- desde $0.07 por 1,000 tweets
Tu cadena de consulta pasa tal cual:
from:,since:,until:,lang:ymin_faves:funcionan igual. Defineorderen"latest"para el orden de snscrape, de lo más reciente a lo más antiguo.Cada llamada de la biblioteca corresponde a un endpoint de Sorsa API. Las llamadas de escritura y los me gusta no tienen equivalente de solo lectura.
-
Revisa la primera página. Cada respuesta trae el perfil completo del autor dentro de cada tweet, así que desaparece la segunda consulta que twscrape y twikit necesitan para un ID de usuario.
Respuesta200 OK { "tweets": [ { "id": "2116173807613027825", "full_text": "Moved our nightly tweet pull off a dead library.", "created_at": "2026-10-30T14:22:07Z", "lang": "en", "likes_count": 214, "retweet_count": 37, "reply_count": 19, "quote_count": 6, "view_count": 18450, "conversation_id_str": "2116173807613027825", "user": { "id": "1592041833471827968", "username": "lena_ships_python", "display_name": "Lena Ships Python", "followers_count": 2310 } } ], "next_cursor": "DAACCgACGW7xDmNAJxAKAAMZbvEOY0AnEAgABAAAAAEAAA" }
El mapa completo de llamadas
Las tablas cubren las llamadas que hacen la mayoría de los scripts. Cada fila es una solicitud a Sorsa API; las columnas de las librerías indican la llamada que reemplaza. Las librerías con sesión iniciada van primero, porque sus scripts son los que siguen en funcionamiento.
Buscar tweets
- twikit
- search_tweet
- twscrape
- search
Tweets de un usuario
- twikit
- get_user_tweets
- twscrape
- user_tweets
Un perfil
- twikit
- get_user_by_screen_name
- twscrape
- user_by_login
Seguidores
- twikit
- get_user_followers
- twscrape
- followers
Seguidos
- twikit
- get_user_following
- twscrape
- following
Un tweet
- twikit
- get_tweet_by_id
- twscrape
- tweet_details
100 tweets por ID
- twikit
- get_tweets_by_ids
- twscrape
- ninguna
Respuestas a un tweet
- twikit
- get_tweet_by_id
- twscrape
- tweet_replies
Quienes hicieron retweet
- twikit
- get_retweeters
- twscrape
- retweeters
Buscar usuarios
- twikit
- search_user
- twscrape
- search_user
Tweets de una lista
- twikit
- get_list_tweets
- twscrape
- list_timeline
Tendencias
- twikit
- get_place_trends
- twscrape
- trends
Datos de "About" de la cuenta
- twikit
- ninguna
- twscrape
- user_about
snscrape y Twint cubrían menos tareas, y cada una se asigna a los mismos endpoints:
| Tarea | Sorsa API | snscrape | Twint |
|---|---|---|---|
| Buscar tweets | POST /search-tweets | TwitterSearchScraper | run.Search |
| Hashtag | POST /search-tweets | TwitterHashtagScraper | c.Search con #tag |
| Tweets de un usuario | POST /user-tweets | TwitterUserScraper | c.Username |
| Un perfil | GET /info | TwitterUserScraper.entity | run.Lookup |
| Seguidores | GET /followers | ninguna | run.Followers |
| Seguidos | GET /follows | ninguna | run.Following |
| Un tweet | POST /tweet-info | TwitterTweetScraper | ninguna |
| Tweets de una lista | GET /list-tweets | TwitterListPostsScraper | ninguna |
| Tendencias | GET /trends | TwitterTrendsScraper | ninguna |
Buscar tweets
- Sorsa API
POST /search-tweets- snscrape
- TwitterSearchScraper
- Twint
- run.Search
Hashtag
- Sorsa API
POST /search-tweets- snscrape
- TwitterHashtagScraper
- Twint
- c.Search con #tag
Tweets de un usuario
- Sorsa API
POST /user-tweets- snscrape
- TwitterUserScraper
- Twint
- c.Username
Un perfil
- Sorsa API
GET /info- snscrape
- TwitterUserScraper.entity
- Twint
- run.Lookup
Seguidores
- Sorsa API
GET /followers- snscrape
- ninguna
- Twint
- run.Followers
Seguidos
- Sorsa API
GET /follows- snscrape
- ninguna
- Twint
- run.Following
Un tweet
- Sorsa API
POST /tweet-info- snscrape
- TwitterTweetScraper
- Twint
- ninguna
Tweets de una lista
- Sorsa API
GET /list-tweets- snscrape
- TwitterListPostsScraper
- Twint
- ninguna
Tendencias
- Sorsa API
GET /trends- snscrape
- TwitterTrendsScraper
- Twint
- ninguna
Otras dos solicitudes no tienen un equivalente en las librerías que merezca una fila. GET /info-batch (se abre en una pestaña nueva) devuelve hasta 100 perfiles en una solicitud, mientras que todas las librerías consultan las cuentas una por una, y GET /verified-followers (se abre en una pestaña nueva) reemplaza verified_followers de twscrape y get_user_verified_followers de twikit.
Dos tareas no tienen reemplazo de solo lectura. La lista de quienes dieron me gusta a un post (get_favoriters de twikit, --favorites de Twint) y los me gusta o marcadores de un usuario no son datos públicos que Sorsa API devuelva. Publicar, seguir y los DM (create_tweet, follow_user, send_dm de twikit) se quedan con la API oficial de X, ya que Sorsa API es de solo lectura por diseño y nunca toca tu cuenta de X.
#Por qué snscrape devuelve blocked (404)
snscrape devuelve blocked (404) en todo scrape de Twitter porque lee X sin sesión, y X dejó de servir la búsqueda y los timelines a visitantes sin sesión el 30 de junio de 2023. El mantenedor abrió el issue #996 (se abre en una pestaña nueva), "All Twitter scrapes are failing" (todos los scrapes de Twitter están fallando), ese mismo día; sigue abierto, con 161 comentarios.
La librería obtenía un guest token, el pase que X daba antes a los visitantes anónimos, y llamaba a los endpoints que usaba la página web sin sesión. Iniciar sesión queda fuera de su alcance por diseño: el issue #270 (se abre en una pestaña nueva) dice que snscrape "does not and will not support logging into social network accounts" (no admite ni admitirá iniciar sesión en cuentas de redes sociales). La última versión en PyPI, 0.7.0.20230622, salió ocho días antes de la ruptura, así que reinstalar, usar otra versión de Python o la rama de desarrollo no cambia nada. Los módulos de otras redes son otra historia; el módulo de Twitter no tiene vuelta atrás.
El ciclo de búsqueda que enseñaban la mayoría de los tutoriales se migra línea por línea. Tu cadena de consulta conserva sus operadores: from:, since:, until:, lang: y min_faves: funcionan igual en el campo query.
import itertools
import snscrape.modules.twitter as sntwitter
query = "from:lena_ships_python since:2026-10-01"
scraper = sntwitter.TwitterSearchScraper(query)
for tweet in itertools.islice(scraper.get_items(), 100):
print(tweet.date, tweet.likeCount, tweet.rawContent)
TwitterUserScraper("lena_ships_python") pasa a ser user_tweets("lena_ships_python"), y TwitterHashtagScraper("yourtag") pasa a ser search("#yourtag"). Nuestra referencia de operadores de búsqueda de Twitter lista cada operador que acepta el campo query, con posts desde 2006.
#Twint: errores de guest token y el archivo
Twint está muerto para siempre: su dueño archivó el repositorio de GitHub el 30 de marzo de 2023, su última versión en PyPI (2.1.20) es del 29 de abril de 2020, y lee X con el mismo guest token sin sesión que perdió snscrape.
Sus fallas empezaron años antes del archivo. RefreshTokenException: Could not find the Guest token in HTML aparece en issues desde octubre de 2020, y el issue #1433 (se abre en una pestaña nueva), abierto el 3 de marzo de 2023, es el último reporte antes del archivo. El otro error que la gente cita, CRITICAL:root:twint.run:Twint:Feed:noData, significa que la página que Twint analizó regresó sin los datos que esperaba. Los forks que parchean token.py chocaron con el mismo muro de inicio de sesión en junio de 2023.
El objeto Config de Twint se asigna a argumentos simples. c.Search y c.Username pasan a ser la consulta o el nombre de usuario, c.Since y c.Until se mueven a la consulta como since: y until:, y c.Store_csv pasa a ser un escritor de CSV que controlas tú.
import twint
c = twint.Config()
c.Search = "python"
c.Since = "2026-10-01"
c.Limit = 100
c.Store_csv = True
c.Output = "tweets.csv"
twint.run.Search(c)
twint.run.Followers(c) y twint.run.Following(c) pasan a ser GET /followers y GET /follows, con hasta 200 cuentas por página. Un timeline completo, más allá del antiguo límite de desplazamiento de 3,200 tweets de Twint, es una búsqueda por rango de fechas, que explica nuestra guía para descargar todos los tweets de un usuario.
#twikit: la ruptura de marzo de 2026 y twifork
La última versión de twikit, la 2.3.3 del 7 de febrero de 2025, falla en todas las llamadas desde que X cambió su app web el 18 de marzo de 2026. El issue #408 (se abre en una pestaña nueva) reporta Couldn't get KEY_BYTE indices y sigue abierto, y el issue #425 suma un KeyError del 23 de abril de 2026.
La causa está en cómo twikit habla con X. Inicia sesión como un usuario normal de X y llama a los endpoints GraphQL internos que usa la app web de x.com, y cada llamada necesita un encabezado x-client-transaction-id calculado a partir de un script que sirve X. Cuando X cambió ese script, el parser de twikit dejó de reconocerlo. El repositorio original tiene 160 issues y pull requests abiertos, y no ha salido ninguna versión.
Un fork lleva el código adelante. twifork (se abre en una pestaña nueva) 2.4.0, publicado el 30 de agosto de 2026, conserva el import from twikit import Client y corrige las rupturas de 2026, y su README es claro sobre los límites: el inicio de sesión con contraseña "cannot be made to work" (no se puede hacer funcionar) y el acceso de invitado "is closed on X's side; use cookies" (está cerrado por parte de X; usa cookies). Usarlo implica exportar las cookies auth_token y ct0 de una sesión de navegador de una cuenta de X y vigilar que esa cuenta no sea bloqueada.
Una búsqueda de twikit como search_tweet("python", "Latest") pasa a ser una sola llamada al helper:
from sorsa_helper import search
for t in search("python", limit=20):
print(t["created_at"], t["user"]["username"], t["full_text"])
El producto 'Top' de twikit se asigna a "order": "popular" y 'Latest' a "latest". El archivo de cookies, el ciclo de asyncio y la cuenta que hay detrás desaparecen.
#twscrape: funciona, con cuentas de X que tú aportas
twscrape sigue funcionando en 2026: la versión 0.20.1 salió el 25 de agosto de 2026, y su repositorio se actualizó otra vez el 31 de octubre. Su README (se abre en una pestaña nueva) enuncia la condición desde el principio: "requires authorized X/Twitter accounts" (requiere cuentas autorizadas de X/Twitter), agregadas a partir de cookies del navegador que contienen auth_token y ct0.
La librería maneja un pool de esas cuentas, así que cada cuenta del pool está en riesgo de bloqueo.
En la práctica aparecen tres fallas:
- Cuentas bloqueadas o sin sesión. Un pool sin cuenta activa espera, o lanza
NoAccountError. - Bloqueos de Cloudflare. El issue #337 (se abre en una pestaña nueva), abierto (12 de septiembre de 2026), registra
Blocked by Cloudflare: 403enuser_by_id. - Cambios en la app web de X. X agrega flags a sus llamadas GraphQL internas, y cuando uno se vuelve obligatorio, twscrape lanza
GqlFeaturesOutdatedErrorhasta que una versión se pone al día.
Las llamadas user_by_login, user_tweets y followers de twscrape pasan a ser dos llamadas al helper:
from sorsa_helper import followers, user_tweets
tweets = list(user_tweets("lena_ships_python", limit=100))
fans = list(followers("lena_ships_python", limit=1000))
No hace falta consultar el ID de usuario, porque POST /user-tweets y GET /followers aceptan un nombre de usuario directamente. Mil seguidores llegan en cinco solicitudes, a 200 por página.
#twscrape, twikit y snscrape: cómo se comparan
De las tres, twscrape es la única que sigue funcionando desde su versión oficial, twikit funciona solo a través de su fork y snscrape no tiene arreglo para X; hoy ninguna funciona sin cuentas de X. Los criterios que deciden un reemplazo son si funciona ahora, qué te pide, si tu código sigue funcionando, cuánto devuelve una solicitud y cuánto cuestan 1,000 resultados.
| Criterio | Sorsa API | twscrape | twikit | snscrape |
|---|---|---|---|---|
| Funciona hoy con X | Sí | Sí | A través de twifork | No |
| Cuenta de X necesaria | Ninguna | Un pool de ellas | Una, por cookies | Ninguna, pero muerta |
| Cuando X cambia algo | Lo arreglamos de nuestro lado | Hay que esperar una versión | El fork lo parchea | Nunca se arregla |
| Tweets por solicitud | Unos 20; 100 por ID | Unos 20 | Unos 20 | Eran unos 20 |
| Cuenta en riesgo | Nunca | Todas las del pool | La cuenta de las cookies | Ninguna |
| Configuración | Una clave de API | Cuentas, cookies, proxies | Exportar cookies | Nada, no devuelve nada |
| Precio por 1,000 tweets | Desde $0.07 | Cuentas, proxies, tiempo | Cuentas, tiempo | Gratis, sin datos |
Funciona hoy con X
- Sorsa API
- Sí
- twscrape
- Sí
- twikit
- A través de twifork
- snscrape
- No
Cuenta de X necesaria
- Sorsa API
- Ninguna
- twscrape
- Un pool de ellas
- twikit
- Una, por cookies
- snscrape
- Ninguna, pero muerta
Cuando X cambia algo
- Sorsa API
- Lo arreglamos de nuestro lado
- twscrape
- Hay que esperar una versión
- twikit
- El fork lo parchea
- snscrape
- Nunca se arregla
Tweets por solicitud
- Sorsa API
- Unos 20; 100 por ID
- twscrape
- Unos 20
- twikit
- Unos 20
- snscrape
- Eran unos 20
Cuenta en riesgo
- Sorsa API
- Nunca
- twscrape
- Todas las del pool
- twikit
- La cuenta de las cookies
- snscrape
- Ninguna
Configuración
- Sorsa API
- Una clave de API
- twscrape
- Cuentas, cookies, proxies
- twikit
- Exportar cookies
- snscrape
- Nada, no devuelve nada
Precio por 1,000 tweets
- Sorsa API
- Desde $0.07
- twscrape
- Cuentas, proxies, tiempo
- twikit
- Cuentas, tiempo
- snscrape
- Gratis, sin datos
Para un pipeline que tiene que funcionar el mes que viene, elige Sorsa API: los mismos operadores de búsqueda y las mismas tareas que estas librerías, unos 20 tweets por solicitud de búsqueda o 100 por consulta en lote por ID, 20 solicitudes por segundo en todos los planes y ninguna cuenta de X que pueda bloquearse. Está en producción desde 2022, con más de 6 mil millones de solicitudes procesadas, primero como TweetScout API.
#Migra los campos que lee tu código
Sorsa API nombra sus campos en snake case y anida el perfil completo del autor en user, así que una migración renombra una docena de atributos y conserva todo lo demás. La tabla da el nombre antiguo en cada librería y el campo que lo reemplaza.
| Campo de Sorsa API | snscrape, twscrape | twikit | Twint |
|---|---|---|---|
id (cadena) | id | id | id |
created_at (ISO 8601) | date | created_at | datetime |
full_text | rawContent | text | tweet |
user.username | user.username | user.screen_name | username |
user.display_name | user.displayname | user.name | name |
likes_count | likeCount | favorite_count | likes_count |
retweet_count | retweetCount | retweet_count | retweets_count |
reply_count | replyCount | reply_count | replies_count |
quote_count | quoteCount | quote_count | ninguno |
view_count | viewCount | view_count | ninguno |
conversation_id_str | conversationId | ninguno | conversation_id |
quoted_status | quotedTweet | quote | ninguno |
id(cadena)- snscrape, twscrape
id- twikit
id- Twint
id
created_at(ISO 8601)- snscrape, twscrape
date- twikit
created_at- Twint
datetime
full_text- snscrape, twscrape
rawContent- twikit
text- Twint
tweet
user.username- snscrape, twscrape
user.username- twikit
user.screen_name- Twint
username
user.display_name- snscrape, twscrape
user.displayname- twikit
user.name- Twint
name
likes_count- snscrape, twscrape
likeCount- twikit
favorite_count- Twint
likes_count
retweet_count- snscrape, twscrape
retweetCount- twikit
retweet_count- Twint
retweets_count
reply_count- snscrape, twscrape
replyCount- twikit
reply_count- Twint
replies_count
quote_count- snscrape, twscrape
quoteCount- twikit
quote_count- Twint
- ninguno
view_count- snscrape, twscrape
viewCount- twikit
view_count- Twint
- ninguno
conversation_id_str- snscrape, twscrape
conversationId- twikit
- ninguno
- Twint
conversation_id
quoted_status- snscrape, twscrape
quotedTweet- twikit
quote- Twint
- ninguno
Para una base de código grande, un adaptador pequeño mantiene vivos los nombres de atributos antiguos mientras migras el resto. Envuelve cada tweet de Sorsa API en un objeto que responde a los nombres de snscrape y twscrape:
from datetime import datetime
from types import SimpleNamespace
def as_snscrape(t):
"""A Sorsa API tweet under snscrape/twscrape attribute names."""
u = t["user"]
return SimpleNamespace(
id=int(t["id"]),
url=f"https://x.com/{u['username']}/status/{t['id']}",
date=datetime.fromisoformat(t["created_at"].replace("Z", "+00:00")),
rawContent=t["full_text"],
lang=t.get("lang"),
likeCount=t["likes_count"],
retweetCount=t["retweet_count"],
replyCount=t["reply_count"],
quoteCount=t["quote_count"],
viewCount=t.get("view_count"),
user=SimpleNamespace(
username=u["username"],
displayname=u["display_name"],
followersCount=u["followers_count"],
),
)
for tweet in map(as_snscrape, search(query)): alimenta entonces el cuerpo del ciclo antiguo sin cambios. Los IDs llegan como cadenas en Sorsa API, así que el adaptador los convierte de nuevo en enteros, como los entregaba snscrape.
#Cuánto cuesta la misma tarea
En Sorsa API, los tweets de una búsqueda cuestan desde $0.07 por 1,000, frente a $5.00 por 1,000 posts en la API oficial de X, que además requiere una cuenta de desarrollador, OAuth y créditos prepagados. Las librerías no cobran tarifa; cuestan cuentas de X, proxies y las horas que se gastan cada vez que X cambia su app web.
API oficial de X
$5,000
para 1M tweets de búsqueda
$0.005 por post
Sorsa API
desde$70
para 1M tweets de búsqueda
desde $0.07 por 1,000
El pago por uso (se abre en una pestaña nueva) de la API oficial de X se detiene en 3M de lecturas de posts al mes; más allá solo se aplica un contrato Enterprise. Consultar tweets por ID en lotes de 100 baja el precio de Sorsa API a $0.014 por 1,000, y las listas de seguidores cuestan desde $0.007 por 1,000 a 200 por página. Las solicitudes fallidas nunca se cobran.
#Ejecuta hoy tu consulta de snscrape en Sorsa API
snscrape y Twint ya no existen, y las librerías que siguen funcionando necesitan cuentas de X que X no haya bloqueado. Para mantener en marcha una tarea de Twint, snscrape, twikit o twscrape sin ese riesgo, pásala a Sorsa API: una clave, tus consultas de búsqueda actuales, unos 20 tweets por solicitud desde $0.07 por 1,000. Pega el helper de arriba, cambia una llamada y tus 100 solicitudes gratis devuelven unos 2,000 tweets para comparar la salida con lo que producía el script anterior.
#Preguntas frecuentes
¿Sigue mantenido twikit en 2026?
No, no el original: la última versión de twikit es la 2.3.3 del 7 de febrero de 2025, y desde el cambio de X del 18 de marzo de 2026 todas las llamadas fallan con "Couldn't get KEY_BYTE indices" (issue #408, todavía abierto). El fork de la comunidad twifork 2.4.0, publicado el 30 de agosto de 2026, corrige esa ruptura, conserva el import de twikit y solo funciona con cookies exportadas de una cuenta de X con sesión iniciada.
¿Sigue funcionando twscrape sin una cuenta de X?
No. twscrape funciona en 2026, con la versión 0.20.1 del 25 de agosto de 2026, pero su README dice que requiere cuentas de X autorizadas, agregadas a partir de cookies que contienen auth_token y ct0. Funciona con un pool de esas cuentas, y X puede bloquear cualquiera de ellas.
¿Hay un fork de snscrape que funcione con Twitter?
Ningún fork puede devolverlo a la vida para X. snscrape lee X sin sesión, y desde el 30 de junio de 2023 X devuelve búsquedas y timelines solo a usuarios con sesión iniciada, así que cualquier fork que parchee el guest token termina igual en "blocked (404)". El mantenedor descartó los inicios de sesión en el issue #270, así que una solución tendría que reescribir la librería en torno a cuentas con sesión iniciada.
¿Puedo conservar mis consultas de búsqueda de snscrape o Twint?
Sí. La búsqueda de Sorsa API acepta la sintaxis de consulta de X, así que las cadenas con from:, since:, until:, lang:, min_faves: y filter: funcionan sin cambios en el campo query de POST /search-tweets. Pon "order" en "latest" para el orden de más nuevo a más antiguo que devolvía snscrape, o en "popular" para la pestaña Top, y los resultados llegan unos 20 por página con un cursor.
¿Cuál es la mejor alternativa a snscrape para datos de Twitter?
Para recopilar tweets públicos como lo hacía snscrape, sin cuenta de X, la mejor alternativa es Sorsa API: los mismos operadores de búsqueda, unos 20 tweets por solicitud de búsqueda desde $0.07 por 1,000, 100 tweets por consulta en lote por ID desde $0.014 por 1,000 y 20 solicitudes por segundo en todos los planes. Devuelve solo datos públicos y nunca pide tu usuario ni tus cookies de X, y cada cuenta nueva recibe 100 solicitudes gratis.
#Cómo lo verificamos
El 2 de noviembre de 2026 leímos el historial de versiones en PyPI y el estado del repositorio en GitHub de snscrape, Twint, twikit, twifork, twscrape, Scweet, ntscraper, tweety y Nitter, además de los issues citados arriba. Ese mismo día tomamos los nombres de métodos y atributos de cada librería de su código fuente en GitHub. Cada endpoint, parámetro y campo de Sorsa API que aparece aquí coincide con la referencia de la API en vivo; las solicitudes se escribieron a partir de ella, y no ejecutamos el código de las librerías contra x.com.
Fuentes
- snscrape issue #996: All Twitter scrapes are failing (se abre en una pestaña nueva)
- snscrape issue #270: Support for authentication (se abre en una pestaña nueva)
- snscrape on PyPI (se abre en una pestaña nueva)
- Twint repository (archived) (se abre en una pestaña nueva)
- Twint issue #1433: Could not find the Guest token in HTML (se abre en una pestaña nueva)
- twikit issue #408: ClientTransaction broken as of March 18, 2026 (se abre en una pestaña nueva)
- twikit on PyPI (se abre en una pestaña nueva)
- twifork README (se abre en una pestaña nueva)
- twscrape README (se abre en una pestaña nueva)
- twscrape issue #337: user_by_id blocked by Cloudflare (se abre en una pestaña nueva)
- Scweet on PyPI (se abre en una pestaña nueva)
- ntscraper README (se abre en una pestaña nueva)
- Nitter repository (archived) (se abre en una pestaña nueva)
- X API pay-per-use pricing (docs.x.com) (se abre en una pestaña nueva)
- Sorsa API reference, OpenAPI
- Search operators (Sorsa API docs) (se abre en una pestaña nueva)