Cómo leer las respuestas a un tweet de forma programática

Cómo leer las respuestas a un tweet de forma programática
Unif Cookbooks team
Unif Cookbooks team

Actualizado

Un endpoint gratis que devuelve las respuestas públicas de cualquier post de X en JSON o Markdown, por engagement o fecha, con paginación.

En resumen: GET https://unifapi.com/tools/x/replies?id=<id o URL de la publicación> devuelve la publicación y las respuestas públicas que tiene debajo en JSON. Es gratis, sin iniciar sesión, sin necesidad de cuenta ni clave de API, y con límite por visitante. sort=top (por defecto) ordena por engagement, sort=recent por fecha. Las páginas son de 20 respuestas con un nextCursor. Cada respuesta trae el autor, el texto, las métricas, los medios e inReplyToPostId, así que puedes reconstruir el hilo. Es el único dato de X que ninguno de los endpoints gratuitos de publicación individual expone, y la razón por la que la mayoría de las tareas de agente del tipo "lee este hilo" solían acabar en un navegador headless.

Las respuestas debajo de una publicación son donde vive la reacción. La publicación en sí te dice lo que dijo una marca; las respuestas te dicen qué piensa la gente de ello, qué se rompió, qué quieren y qué queja se llevó 4000 me gusta. Para análisis de sentimiento, investigación de clientes y monitorización de incidentes, ellas son los datos.

También son la parte de X más difícil de leer sin cuenta, y de ahí búsquedas como "ver respuestas de un tweet", "api de respuestas de twitter" o "leer un hilo de twitter desde un script". FxTwitter y vxTwitter leen una publicación. El endpoint de sindicación lee una publicación. La propia página de X carga las respuestas con JavaScript a posteriori, así que curl recibe un cascarón vacío. La API oficial expone las respuestas mediante la búsqueda de conversaciones en los planes de pago.

La solicitud

curl -s "https://unifapi.com/tools/x/replies?id=https://x.com/NASA/status/2107237881668313108"

id acepta el ID numérico de la publicación o la URL completa de x.com / twitter.com. La respuesta:

{
  "post": {
    "id": "2107237881668313108",
    "text": "Time to bring them home 🌎 …",
    "author": { "handle": "NASA", "name": "NASA", "verified": true },
    "metrics": {
      "likes": 7210,
      "reposts": 846,
      "replies": 262,
      "quotes": 60,
      "bookmarks": 197,
      "views": 2823329
    },
    "conversationId": "2107237881668313108"
  },
  "replies": {
    "items": [
      {
        "id": "2107252849688424504",
        "text": "@NASA @Space_Station @SpaceX Those space suits don't look right…",
        "createdAt": "2026-10-05T23:33:22.000Z",
        "author": {
          "handle": "Troyztoys",
          "name": "Tee Crenshaw",
          "verified": true,
          "followers": 1823
        },
        "metrics": {
          "likes": 15,
          "reposts": 1,
          "replies": 0,
          "quotes": 0,
          "bookmarks": 0,
          "views": 894
        },
        "media": [],
        "conversationId": "2107237881668313108",
        "inReplyToPostId": "2107237881668313108"
      }
    ],
    "hasMore": true,
    "nextCursor": "20@"
  }
}

post es la original. replies.items son las publicaciones públicas de su conversación distintas de la original, tanto respuestas directas como anidadas. Cada una tiene inReplyToPostId, así que una respuesta a una respuesta apunta a su padre y el hilo puede reconstruirse como un árbol.

Ordenación

sort=top (por defecto) ordena por me gusta más reposts más respuestas, más o menos como hace la pestaña "Más relevantes" de X. sort=recent ordena de más reciente a más antigua. Para "cuál es la reacción" usa top; para "qué pasó en la última hora" usa recent.

La página para personas, /tools/x-reply-viewer, tiene las mismas dos opciones como botones, y /tools/x-reply-viewer?q=<id>&sort=recent&format=json devuelve exactamente lo mismo que la API.

Paginación

Las respuestas llegan de 20 en 20. Devuelve nextCursor como cursor para continuar. El primer cursor suele tener la forma 20@, que significa "las siguientes 20 de la página ya obtenida"; los posteriores son cursores opacos de la propia X. Trátalos todos como cadenas opacas.

Una publicación con 262 respuestas son unas 14 páginas. Eso son 14 de tus 20 unidades gratuitas cada 10 minutos, así que lee X-RateLimit-Remaining en los encabezados y detente cuando tengas suficiente; la primera página ordenada por top suele contener las respuestas que importan.

Qué contiene el registro de una respuesta

CampoSignificado
id, urlEl id de la respuesta y su URL canónica en x.com
textTexto completo, con las @menciones iniciales tal como las guarda X
createdAtISO 8601, UTC
authorhandle, name, verified, followers, avatarUrl, …
metricslikes, reposts, replies, quotes, bookmarks, views
mediaFotos y videos con tamaños y URLs MP4 en el CDN de X
inReplyToPostIdLa publicación a la que responde
conversationIdLa publicación raíz de la conversación
possiblySensitiveLa marca de la propia X

La forma es el mismo registro post que devuelven los endpoints de búsqueda, perfil y medios, así que una función que puntúa una publicación funciona con una respuesta sin cambios.

Tres cosas que construir

Un resumen de reacciones. Pide la primera página ordenada por top, pasa los 20 textos a un modelo junto con la publicación original y pídele los tres sentimientos más comunes y una cita representativa de cada uno. Veinte respuestas y una llamada; la ordenación top ya ha hecho el ranking.

Un feed de quejas. Para el anuncio de una marca, consulta sort=recent cada 10 minutos, conserva las respuestas cuyo metrics.likes supere un umbral entre una consulta y la siguiente, y envíaselas a una persona. Las que suben son las que acabarán en una captura de pantalla.

Una reconstrucción del hilo. Recorre todas las páginas, construye un mapa de id a respuesta y luego cuelga cada respuesta de su inReplyToPostId. Las respuestas a la original están a profundidad uno; el resto se anida. Renderízalo como Markdown y tienes una transcripción legible de la conversación para un informe.

Límites

  • Solo respuestas públicas. Las respuestas de cuentas protegidas y las eliminadas no se incluyen, y por esa razón el recuento replies de la publicación original puede ser mayor que lo que se puede leer.
  • El límite gratuito es de 20 consultas cada 10 minutos por visitante entre todos los endpoints /tools/x/*, y una búsqueda cuenta como dos. Un 429 trae Retry-After y la URL donde se levanta el tope.
  • Volumen, historial y garantías son la API de X / Twitter con medición de uso, de pago por uso con una clave de workspace, con los mismos nombres de campo.

Preguntas frecuentes

¿Puedo obtener las respuestas a un tweet sin la API de Twitter?

Sí. El endpoint de arriba lee las respuestas públicas gratis, sin iniciar sesión, sin necesidad de cuenta y sin clave, con límite por visitante. Devuelve JSON por defecto y Markdown con format=md.

¿Por qué X dice 262 respuestas pero yo solo veo 200?

Algunas respuestas son de cuentas protegidas, otras se eliminaron y otras las ocultó el autor. El recuento de la publicación original es el de X; el conjunto legible es lo que es público.

¿Incluye las publicaciones que la citan?

No. Las citas son publicaciones aparte, no respuestas. Busca la URL de la publicación con /tools/x/search?q=<url de la publicación> para encontrarlas.

¿Puedo leer las respuestas como texto para un modelo?

Sí. format=md devuelve la publicación original y cada respuesta como un bloque Markdown con autor, texto, métricas y URL.