Ir al contenido

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ónEstadoNecesitaError que ves
snscrape22 jun 2023Módulo de Twitter muertoNada (sin sesión)blocked (404)
Twint29 abr 2020Archivado el 30 mar 2023Nada (sin sesión)Guest token not found
twikit7 feb 2025Rota desde el 18 mar 2026Inicio de sesión o cookiesKEY_BYTE indices
twifork30 ago 2026Fork funcional de twikitCookies del navegadorCookies vencidas
twscrape25 ago 2026FuncionaCuentas de XBloqueos de cuenta, 403
Scweet22 oct 2026FuncionaUna cookie auth_tokenBloqueos de cuenta
ntscraper24 may 2025Muerta junto con NitterUna instancia de NitterInstancias caídas
tweety15 jul 2025Actualizaciones lentasUna cuenta de XLa 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.

Cuándo dejó de leer X cada librería Fechas de releases e issues de PyPI y GitHub, revisadas el 2 nov 2026 2020 2021 2022 2023 2024 2025 2026 ahora Twint Archivada Errores de guest token, oct 2020 Archivada el 30 mar 2023 snscrape Sin uso en X Dejó de funcionar el 30 jun 2023 (#996) Último release 8 días antes ntscraper Muerta con Nitter Último release el 24 may 2025 Nitter archivado el 9 oct 2026 twikit Rota en origen Último release el 7 feb 2025 Dejó de funcionar el 18 mar 2026 (#408) twscrape Funciona con cuentas 0.20.1 el 25 ago 2026 Pide cuentas X con login
Toda librería que lee sin sesión ha desaparecido. Las librerías que siguen funcionando, twscrape incluida, corren sobre cuentas con sesión iniciada.

#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:

  1. Consigue una clave. Regístrate y copia la clave de API desde el panel. Las primeras 100 solicitudes son gratis y nunca vencen.

  2. 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)
    
  3. Cambia cada llamada. Elige tu librería y la llamada que hace tu script; el conversor muestra la solicitud equivalente.

    Tu biblioteca
    Antes: snscrape
    scraper = sntwitter.TwitterSearchScraper(
        "python lang:en")
    for tweet in scraper.get_items():
        print(tweet.rawContent)
    Después: Sorsa API
    for 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: y min_faves: funcionan igual. Define order en "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.

  4. 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.

TareaSorsa APItwikittwscrape
Buscar tweetsPOST /search-tweets (se abre en una pestaña nueva)search_tweetsearch
Tweets de un usuarioPOST /user-tweets (se abre en una pestaña nueva)get_user_tweetsuser_tweets
Un perfilGET /info (se abre en una pestaña nueva)get_user_by_screen_nameuser_by_login
SeguidoresGET /followers (se abre en una pestaña nueva)get_user_followersfollowers
SeguidosGET /follows (se abre en una pestaña nueva)get_user_followingfollowing
Un tweetPOST /tweet-info (se abre en una pestaña nueva)get_tweet_by_idtweet_details
100 tweets por IDPOST /tweet-info-bulk (se abre en una pestaña nueva)get_tweets_by_idsninguna
Respuestas a un tweetPOST /comments (se abre en una pestaña nueva)get_tweet_by_idtweet_replies
Quienes hicieron retweetPOST /retweeters (se abre en una pestaña nueva)get_retweetersretweeters
Buscar usuariosPOST /search-users (se abre en una pestaña nueva)search_usersearch_user
Tweets de una listaGET /list-tweets (se abre en una pestaña nueva)get_list_tweetslist_timeline
TendenciasGET /trends (se abre en una pestaña nueva)get_place_trendstrends
Datos de "About" de la cuentaGET /about (se abre en una pestaña nueva)ningunauser_about

snscrape y Twint cubrían menos tareas, y cada una se asigna a los mismos endpoints:

TareaSorsa APIsnscrapeTwint
Buscar tweetsPOST /search-tweetsTwitterSearchScraperrun.Search
HashtagPOST /search-tweetsTwitterHashtagScraperc.Search con #tag
Tweets de un usuarioPOST /user-tweetsTwitterUserScraperc.Username
Un perfilGET /infoTwitterUserScraper.entityrun.Lookup
SeguidoresGET /followersningunarun.Followers
SeguidosGET /followsningunarun.Following
Un tweetPOST /tweet-infoTwitterTweetScraperninguna
Tweets de una listaGET /list-tweetsTwitterListPostsScraperninguna
TendenciasGET /trendsTwitterTrendsScraperninguna
  • 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:

Después: Sorsa API
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: 403 en user_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 GqlFeaturesOutdatedError hasta 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:

Después: Sorsa API
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.

CriterioSorsa APItwscrapetwikitsnscrape
Funciona hoy con XSíSíA través de twiforkNo
Cuenta de X necesariaNingunaUn pool de ellasUna, por cookiesNinguna, pero muerta
Cuando X cambia algoLo arreglamos de nuestro ladoHay que esperar una versiónEl fork lo parcheaNunca se arregla
Tweets por solicitudUnos 20; 100 por IDUnos 20Unos 20Eran unos 20
Cuenta en riesgoNuncaTodas las del poolLa cuenta de las cookiesNinguna
ConfiguraciónUna clave de APICuentas, cookies, proxiesExportar cookiesNada, no devuelve nada
Precio por 1,000 tweetsDesde $0.07Cuentas, proxies, tiempoCuentas, tiempoGratis, 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 APIsnscrape, twscrapetwikitTwint
id (cadena)ididid
created_at (ISO 8601)datecreated_atdatetime
full_textrawContenttexttweet
user.usernameuser.usernameuser.screen_nameusername
user.display_nameuser.displaynameuser.namename
likes_countlikeCountfavorite_countlikes_count
retweet_countretweetCountretweet_countretweets_count
reply_countreplyCountreply_countreplies_count
quote_countquoteCountquote_countninguno
view_countviewCountview_countninguno
conversation_id_strconversationIdningunoconversation_id
quoted_statusquotedTweetquoteninguno
  • 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:

adapter.py
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.

Cómo llega cada librería a X y qué la detiene Librería Cómo lee X Qué la detiene snscrape Twint Un guest token sin sesión, el pase que X daba a visitantes anónimos Cerrado el 30 jun 2023: la búsqueda exige login ntscraper Instancias públicas de Nitter que retransmitían páginas de X Nitter archivado el 9 oct 2026 twikit, twifork twscrape, Scweet Cookies de cuentas con sesión enviadas a la app web de x.com Bloqueos de cuentas y cada cambio en x.com Sorsa API Un header ApiKey, JSON de vuelta, unos 20 tweets por página Sin cuenta de X, nada que bloquear
Las rutas sin sesión están cerradas. La ruta con sesión funciona mientras duren tus cuentas; una clave de API no lleva ninguna cuenta de X.

#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.

Tweets

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.

Por el equipo de Sorsa API. Creamos y operamos Sorsa API, la API y scraper de Twitter/X de solo lectura, en producción desde 2022 (antes TweetScout API) y con más de 6 mil millones de solicitudes procesadas. Acerca de Sorsa API

Qué cambió
  • Primera publicación.