Por Sorsa Editorial

Publicado el 13 de junio de 2026. Actualizado el 3 de julio de 2026: precios reelaborados a tarifas por cada 1,000 tweets, agregado el arranque con 100 solicitudes gratis y actualizada la comparación de costos con la API de X. Tarifas de pago por uso de la API oficial de X verificadas en julio de 2026.

Conclusión clave: Crear un dataset de Twitter (X) para machine learning significa recolectar tweets desde una API, limpiarlos y deduplicarlos, etiquetarlos según la tarea, dividirlos en conjuntos de entrenamiento, validación y prueba, y exportarlos a un formato como JSONL. Desde que la API gratuita y los scrapers abiertos dejaron de funcionar, la recolección nueva pasa por una API de datos de pago.

Ese último punto es el obstáculo práctico. Con el nivel gratuito de la API cerrado desde 2023 y con scrapers como snscrape y twint fuera de servicio, un corpus fresco y centrado en tu tema tiene que salir de una API de datos. Sorsa API, una alternativa de solo lectura para Twitter/X, devuelve tweets y perfiles públicos como JSON plano detrás de un único encabezado, con endpoints de búsqueda, cronología y volumen pensados para recolección. El cobro es de tarifa plana: una llamada cuenta como una solicitud devuelva lo que devuelva, el perfil del autor viene incluido gratis, y una sola llamada por lotes rehidrata hasta 100 IDs de tweets, que es como reviven los datasets de solo IDs que publican los investigadores. En endpoints por lotes, Sorsa sale en alrededor de $0.02 por cada 1,000 tweets en el plan Pro (desde $0.049 en Starter), y 100 solicitudes gratis, sin tarjeta y sin vencimiento, cubren los 40 endpoints completos para que puedas probar el pipeline antes de gastar.

Contenido

¿Cómo se crea un dataset de Twitter para machine learning? {#how-do-you-build-a-twitter-dataset-for-machine-learning}

Crear un dataset de Twitter pasa por cinco etapas: recolectar tweets crudos desde una API, limpiarlos y deduplicarlos, etiquetarlos según la tarea, dividirlos en conjuntos de entrenamiento, validación y prueba, y exportarlos a un formato de entrenamiento como JSONL. El mismo pipeline sirve tanto para un dataset de clasificación como para un conjunto de instruction tuning de un modelo de lenguaje; solo cambia el paso de etiquetado.

Parte del objetivo, no de los datos. Un clasificador de sentimientos quiere tweets cortos con una etiqueta clara de positivo, negativo o neutral. Un modelo ajustado por instrucciones quiere pares de prompt y respuesta. Una corrida de adaptación de dominio quiere una gran reserva de texto del tema con etiquetas ligeras o sin ellas. Conocer el objetivo decide la consulta, el volumen y el esquema antes de extraer un solo tweet.

El trabajo se divide limpiamente. La recolección y la rehidratación son un problema de API, cubierto abajo con código. El etiquetado, la normalización y la división son un problema de datos que resuelves en local con Python. El resto de esta guía toma cada parte por turno, señalando dónde aprietan las restricciones de 2026 que rompen la mayoría de los tutoriales viejos.

¿Crear tu propio dataset o usar uno público? {#should-you-build-your-own-dataset-or-use-a-public-one}

Usa un dataset público cuando ya exista uno que encaje con tu tarea; crea el tuyo cuando el tema, el idioma, la ventana de tiempo o las etiquetas sean específicos de tu caso. Los conjuntos públicos en Hugging Face y Kaggle son gratuitos y rápidos de cargar, pero tienen un alcance fijo, suelen tener años de antigüedad, con frecuencia solo cubren inglés, y muchos se distribuyen como IDs de tweets que debes rehidratar antes de que el texto exista.

Vale la pena conocer primero las opciones más conocidas. Sentiment140 contiene alrededor de 1.6 millones de tweets etiquetados por sentimiento, y el benchmark TweetEval de Cardiff NLP agrupa siete tareas de clasificación de tweets (ironía, odio, contenido ofensivo, postura, emoji, emoción, sentimiento). Para un modelo genérico de sentimiento o emoción en inglés, cargar uno de estos gana a recolectar cualquier cosa.

Crea el tuyo cuando la brecha sea real:

  • El tema es acotado o reciente y ningún conjunto público lo cubre.
  • Necesitas un idioma o una región que los conjuntos públicos omiten.
  • Necesitas una ventana de tiempo fresca, no tweets de 2017.
  • Tu esquema de etiquetas no coincide con ningún dataset existente.

Para el caso concreto de sentimiento, la guía de cómo clasificar el sentimiento de los tweets en Python recorre la parte de modelado una vez que los datos existen.

Cómo recolectar tweets para un dataset en 2026 {#how-to-collect-tweets-for-a-dataset-in-2026}

Recolecta tweets por tres rutas: búsqueda por palabras clave y operadores para corpus temáticos, cronologías de usuario para corpus por cuenta, y Listas o Comunidades para fuentes curadas. El nivel gratuito de la API cerró en 2023 y scrapers como snscrape y twint dejaron de funcionar, así que la recolección fresca a cualquier volumen pasa hoy por una API de datos que devuelve resultados de búsqueda y de cronología directamente.

Una API de solo lectura convierte esto en un bucle corto: consultas un endpoint, lees una página de tweets, sigues el cursor, escribes cada tweet a un archivo. El endpoint de búsqueda de Sorsa acepta los operadores de búsqueda avanzada de Twitter estándar como lang:, since:, until: y -filter:retweets, devuelve unos 20 tweets por página con el perfil del autor adjunto, y pagina con next_cursor. Si la sintaxis te resulta ajena, arma primero la consulta en el constructor visual de búsquedas.

python
import json, time, requests

API_KEY = "YOUR_SORSA_API_KEY"
BASE = "https://api.sorsa.io/v3"
HEADERS = {"ApiKey": API_KEY, "Content-Type": "application/json"}

def collect(query, target=5000):
    rows, cursor = [], None
    while len(rows) < target:
        body = {"query": query, "order": "latest"}
        if cursor:
            body["next_cursor"] = cursor
        r = requests.post(f"{BASE}/search-tweets", headers=HEADERS, json=body, timeout=30)
        if r.status_code == 429:
            time.sleep(1)
            continue
        r.raise_for_status()
        data = r.json()
        for t in data.get("tweets", []):
            rows.append({
                "id": str(t["id"]),
                "text": t.get("full_text", ""),
                "lang": t.get("lang", ""),
                "created_at": t.get("created_at", ""),
                "username": (t.get("user") or {}).get("username", ""),
            })
        cursor = data.get("next_cursor")
        if not cursor:
            break
    return rows

with open("tweets.jsonl", "w", encoding="utf-8") as f:
    for row in collect('"your topic" lang:en -filter:retweets', target=5000):
        f.write(json.dumps(row, ensure_ascii=False) + "\n")

Para corpus por cuenta, cambia la llamada de búsqueda por el endpoint de cronología del usuario con un nombre de usuario; para fuentes curadas, extrae desde una Lista o un feed de Comunidad. Para muestrear con balance, el endpoint de menciones agrega filtros como min_likes, since_date y until_date, que te permiten extraer, por ejemplo, solo tweets con buen engagement dentro de un rango de fechas.

Dos notas de eficiencia. Como el perfil del autor viaja dentro de cada tweet, obtienes el nombre de usuario, el número de seguidores y la antigüedad de la cuenta en la misma respuesta sin llamadas extra. Y cuando los datos encajan en forma de lote, los endpoints por lotes recortan el número de solicitudes: una sola llamada admite hasta 100 IDs de tweets o 100 nombres de usuario, la palanca principal para contener el volumen de solicitudes en una extracción grande.

Si prefieres evitar una API, la vieja ruta de los scrapers todavía existe, pero espera roturas; el análisis de por qué los scrapers de código abierto dejaron de funcionar explica el intercambio.

¿Cómo se rehidrata un dataset que solo tiene IDs de tweets? {#how-do-you-rehydrate-a-tweet-id-only-dataset}

Rehidratar significa tomar una lista de IDs de tweets y consultar el contenido actual de cada uno. Los datasets públicos de investigación se distribuyen como IDs en lugar de tweets completos porque los términos de la plataforma restringen redistribuir el texto, así que el texto solo existe después de consultar los IDs contra una API. Espera recuperar un subconjunto: los tweets borrados, o publicados por cuentas suspendidas o ahora privadas, ya no se devuelven.

Un endpoint por lotes lo abarata. El endpoint de tweets por lotes de Sorsa acepta hasta 100 IDs por llamada y devuelve los objetos completos de los tweets, así que un archivo de 50,000 IDs son unas 500 solicitudes en lugar de 50,000 consultas individuales.

python
import requests

API_KEY = "YOUR_SORSA_API_KEY"
URL = "https://api.sorsa.io/v3/tweet-info-bulk"
HEADERS = {"ApiKey": API_KEY, "Content-Type": "application/json"}

def chunks(seq, n=100):
    for i in range(0, len(seq), n):
        yield seq[i:i + n]

ids = [line.strip() for line in open("tweet_ids.txt") if line.strip()]
rehydrated = []
for batch in chunks(ids, 100):
    r = requests.post(URL, headers=HEADERS, json={"tweet_links": batch}, timeout=30)
    r.raise_for_status()
    rehydrated.extend(r.json().get("tweets", []))

print(f"Recovered {len(rehydrated)} of {len(ids)} tweets")

La tasa de recuperación baja cuanto más vieja es la lista de IDs, porque cada año desaparecen más tweets originales. Para saber de dónde salen las listas de IDs y cuánto sobrevive de un dataset viejo de eventos, revisa la guía de cómo recuperar tweets antiguos desde una lista de IDs.

Cómo estructurar y etiquetar un dataset para entrenamiento {#how-to-structure-and-label-a-dataset-for-training}

Dale a cada registro un esquema estable y exporta a JSONL, un objeto por línea. Un conjunto de clasificación necesita el ID del tweet, el texto, la etiqueta, el idioma y la marca de tiempo; un conjunto de instruction tuning necesita una instrucción, una entrada opcional y la salida objetivo. JSONL es el formato que la librería datasets de Hugging Face y la mayoría de los pipelines de fine-tuning leen directamente.

Un registro de clasificación y uno de instrucciones se ven así:

json
{"id": "1782368585664626774", "text": "the new build keeps crashing on launch", "label": "negative", "lang": "en", "created_at": "2026-05-01T10:30:00Z"}
json
{"instruction": "Classify the sentiment of this tweet.", "input": "the new build keeps crashing on launch", "output": "negative"}

Limpia antes de etiquetar. Deduplica por el ID del tweet, descarta tweets muy cortos o vacíos y filtra por el campo lang para que el conjunto se mantenga en tu idioma objetivo. Siguiendo la convención de TweetEval de Cardiff NLP, reemplaza las URLs por un token {{URL}} y los nombres de usuario no verificados por {{USERNAME}}, para que el modelo aprenda patrones de lenguaje y no enlaces o cuentas concretas.

Para las etiquetas, tres enfoques escalan. Etiqueta a mano un pequeño conjunto de referencia para evaluación. Pre-etiqueta el grueso con un modelo pequeño existente y deja que una persona lo corrija, que es mucho más rápido que etiquetar desde cero. O, para instruction tuning, escribe pares de prompt y respuesta alrededor de los tweets. Las guías de fine-tuning de LLM insisten en calidad sobre volumen bruto: unos pocos miles de pares limpios y bien formados suelen ganar a un conjunto ruidoso diez veces mayor.

Por último, divide antes de entrenar para que la evaluación se mantenga honesta. Una división común es 80% entrenamiento, 10% validación y 10% prueba, mezclada con una semilla fija para reproducibilidad.

python
import json, random

rows = [json.loads(line) for line in open("tweets.jsonl", encoding="utf-8")]
random.seed(42)
random.shuffle(rows)
n = len(rows)
train = rows[: int(0.8 * n)]
val = rows[int(0.8 * n): int(0.9 * n)]
test = rows[int(0.9 * n):]

¿Qué pasa con los términos de la plataforma y la ética? {#what-about-platform-terms-and-ethics}

Recolectar tweets públicos para tu propio modelo es una cosa; redistribuir el dataset es donde las reglas aprietan. La Developer Policy de X establece que, si compartes contenido con terceros, incluidos datasets descargables, solo puedes distribuir IDs de posts y de usuarios, no el texto completo, que es exactamente la razón por la que los datasets públicos de investigación se publican como IDs.

Los términos vigentes fijan límites concretos. Según la Developer Policy de X, no puedes distribuir más de 1,500,000 IDs de posts a una misma entidad dentro de un periodo de 30 días sin permiso escrito, mientras que las personas que actúan en nombre de una institución académica para investigación no comercial pueden compartir un número ilimitado de IDs. Quienes investigan bajo el acceso de la Ley de Servicios Digitales de la UE se rigen por disposiciones separadas.

El patrón práctico que te mantiene dentro de las líneas: conserva el texto completo que recolectas para tu propio entrenamiento y, si publicas un dataset, publica los IDs de los tweets y un script de rehidratación para que otros recreen el texto por su cuenta. Los términos también prohíben rastrear o monitorear grupos y eventos sensibles, así que aleja la recolección de esos usos. Esto es orientación general, no asesoría legal, y los términos cambian, así que revisa el X Developer Agreement vigente antes de publicar nada.

¿Cuánto cuesta recolectar un dataset? {#how-much-does-collecting-a-dataset-cost}

El costo depende del volumen y de si la fuente cobra por recurso o por solicitud. El cobro por recurso factura cada post y cada perfil que devuelve una respuesta, así que una llamada que trae un tweet más su autor se factura dos veces; el cobro por solicitud cuenta una llamada como una unidad devuelva lo que devuelva. En una extracción de dataset intensiva en lecturas, esa única diferencia decide la factura.

La API oficial de X cobra por recurso: cada lectura de post cuesta $0.005 y cada lectura de perfil de usuario $0.010, con un tope de 2 millones de lecturas de posts al mes, tarifas verificadas en julio de 2026 en el desglose de precios de la API de Twitter. Sorsa cobra una solicitud por llamada con el perfil del autor incluido gratis, así que en endpoints por lotes una extracción de dataset sale desde alrededor de $0.02 por cada 1,000 tweets en el plan Pro (desde $0.049 en Starter, desde $0.018 en Enterprise), y desde alrededor de $0.01 por cada 1,000 perfiles.

TareaAPI oficial de X (pago por uso)Sorsa (Pro, base por lotes)
1,000 tweets con el perfil del autor incluido$15.00 (1,000 lecturas de posts + 1,000 lecturas de usuarios)desde $0.02
Rehidratar 1,000 IDs de tweets$5.00 (1,000 lecturas de posts)desde $0.02
Recolectar 100,000 tweets de principio a finde $500 a $1,500 aproximadamentedentro de un mes del plan Pro de $199

Las cifras de Sorsa usan la base por lotes: una solicitud devuelve hasta 100 tweets o 200 perfiles. En cualquier extracción intensiva en lecturas, la factura de tarifa plana por solicitud queda muy por debajo del cobro por recurso, y el perfil del autor no cuesta nada del lado de Sorsa.

Qué ruta conviene depende del flujo de trabajo, no de un único ganador:

  • Escribir o publicar: la API oficial de X, la vía conforme para cualquier acción de escritura.
  • Volumen de lectura muy bajo, menos de unos 10,000 posts al mes: cualquiera de las dos funciona, y el pago por uso de X se mantiene barato a ese tamaño.
  • Construir un dataset, que es recolección intensiva en lecturas más rehidratación: una API de tarifa plana por solicitud como Sorsa, hasta 50 veces más barata sobre los mismos tweets y con los perfiles de autor incluidos gratis.

Los investigadores también pueden revisar el acceso con descuento para investigación académica, y el mismo código de recolección se porta a cualquier stack.

Un caso real de construcción de dataset {#a-real-dataset-build}

Un equipo pequeño de IA que construía un modelo de sentimiento financiero llegó a esto después de cotizar la ruta oficial. Necesitaban unos 200,000 tweets recientes en inglés sobre una canasta de tickers, etiquetados como positivo, negativo o neutral. Con el cobro por recurso, solo las lecturas de posts sumaban alrededor de $1,000, y los perfiles de autor lo habrían duplicado o triplicado antes de cualquier actualización, con el tope de 2 millones de lecturas mensuales acechando en cuanto planearan refrescos. Al mover la recolección a una API de tarifa plana por solicitud, extrajeron los mismos 200,000 tweets dentro de unos $20 de la cuota de un mes Pro, hasta 50 veces más barato solo en lecturas de posts (alrededor de un 98% menos), y más aún al contar los perfiles de autor gratis, porque la búsqueda devolvía 20 tweets por solicitud.

La construcción se mantuvo pequeña. Una consulta por palabra clave por cada ticker con filtro de idioma alimentó un archivo JSONL; un clasificador pequeño pre-etiquetó las filas y un analista corrigió una muestra; las URLs y los nombres de usuario se normalizaron a tokens; y el conjunto se dividió 80, 10, 10 con semilla fija. Cuando más tarde quisieron extender un dataset público antiguo de eventos, rehidrataron su lista de IDs en lotes de 100 y aceptaron que una parte de los tweets originales ya se había borrado. La lección que se quedaron fue el orden: define el esquema de etiquetas y la consulta primero, porque re-recolectar tras un cambio de esquema es el error caro, no la factura de la API.

Preguntas frecuentes {#faq}

¿Todavía se pueden recolectar tweets para un dataset en 2026?

Sí, pero no con las herramientas antiguas. El nivel gratuito de la API de Twitter cerró en 2023, y scrapers como snscrape y twint ya no funcionan contra la plataforma actual. Hoy, la recolección nueva a cualquier volumen real pasa por una API de datos de pago que devuelve resultados de búsqueda y de cronología, que recorres página por página y escribes a un archivo. Los datasets públicos siguen siendo una opción cuando alguno ya encaja con la tarea.

¿Dónde puedes conseguir un dataset de Twitter ya hecho?

Hugging Face y Kaggle alojan los principales datasets públicos de tweets. Sentiment140 contiene alrededor de 1.6 millones de tweets etiquetados por sentimiento, y el benchmark TweetEval cubre siete tareas de clasificación como ironía, odio y emoción. Muchos datasets académicos se distribuyen como IDs de tweets en lugar del texto completo, así que rehidratas los IDs contra una API antes de que el contenido exista en tu copia.

¿Cómo se rehidratan los IDs de tweets?

La rehidratación consulta el contenido actual de una lista de IDs de tweets. Un endpoint por lotes lo abarata: una API de solo lectura como Sorsa acepta hasta 100 IDs por llamada y devuelve los objetos completos de los tweets, así que un archivo de 50,000 IDs se convierte en unas 500 solicitudes. Espera recuperar solo una parte, porque los tweets borrados o publicados por cuentas suspendidas o privadas ya no se devuelven.

¿Cuántos tweets necesitas para hacer fine-tuning de un modelo?

Depende de la tarea, y la calidad importa más que el volumen. Para una tarea acotada de clasificación o de seguimiento de instrucciones, unos pocos miles de ejemplos limpios y bien etiquetados suelen mover el modelo de forma significativa, mientras que un conjunto ruidoso diez veces mayor puede lograr menos. Define el objetivo, etiqueta primero un conjunto pequeño de alta calidad y hazlo crecer solo si la evaluación muestra que el modelo necesita más cobertura.

Recolectar tweets públicos para tu propio modelo está permitido en general, pero la redistribución está restringida. La Developer Policy de X permite compartir solo IDs de posts y de usuarios en los datasets publicados, no el texto completo de los tweets, con un tope de 1,500,000 IDs por entidad cada 30 días y una excepción para instituciones académicas. Publica IDs y un script de rehidratación en lugar del texto crudo, y revisa los términos vigentes antes de publicar.

¿Necesitas la API oficial de X para crear un dataset?

No. La API oficial de X solo es necesaria para acciones de escritura como publicar. Para recolectar tweets y perfiles públicos, una alternativa de solo lectura como Sorsa API usa un único encabezado ApiKey y cobra por solicitud, no por tweet, con el perfil del autor incluido gratis. Cuesta desde alrededor de $0.02 por cada 1,000 tweets con el precio por lotes del plan Pro, y 100 solicitudes gratis, sin tarjeta, cubren una prueba real.

Cómo empezar {#getting-started}

La forma más rápida de dimensionar un dataset es ejecutar la consulta antes de escribir el pipeline. Abre el playground de la API en el navegador, corre una búsqueda con tus operadores y lee los campos del JSON que vas a mapear a JSONL. Cuando la consulta se vea bien, lleva el script de recolección de arriba a tu proyecto y apúntalo a un archivo.

Sorsa arranca con 100 solicitudes gratis: por única vez, sin tarjeta, sin vencimiento y válidas en los 40 endpoints, suficiente para rehidratar hasta 10,000 tweets o extraer hasta 20,000 perfiles mientras pruebas. Cuando estés para escalar, los planes con precio por solicitud salen desde alrededor de $0.02 por cada 1,000 tweets en endpoints por lotes, con 20 solicitudes por segundo y sin cola de aprobación.

Revisado por Keksich, fundador de Sorsa, especialista en marketing e investigador de la API de X.

Esta guía se apoya en el trabajo directo de nuestro equipo operando la Sorsa API en producción y en su documentación, además de datasets públicos y términos de la plataforma revisados al momento de escribir. Los límites de redistribución de contenido se leyeron de la Developer Policy de X, las convenciones de datasets públicos y normalización del dataset TweetEval en Hugging Face, y las tarifas por recurso de la API oficial de X se contrastaron con los desgloses públicos vigentes. Más sobre nuestro equipo en la página Acerca de. Verificado en julio de 2026.