Ir al contenido

Expansions de la API de Twitter y autores de posts

En la API oficial de X, un post llega solo con su ID y su texto; agregar expansions=author_id devuelve el perfil del autor en un bloque includes aparte, y desde el 22 de noviembre de 2026 cada autor devuelto así se factura a $0.010.

Respuesta corta: Agrega expansions=author_id y user.fields a la solicitud, y luego asocia el author_id de cada post con un usuario de includes.users. Desde el 22 de noviembre de 2026, un post con su autor cuesta hasta $0.015. Sorsa API incluye el perfil completo del autor dentro de cada post: POST /tweet-info-bulk lee 100 posts por solicitud desde $0.014 por 1,000, y 100 solicitudes gratis cubren los primeros 10K.

Endpoint
POST /tweet-info-bulk
Tamaño de página
100 posts por solicitud
Precio
desde $0.014 por 1,000

#Qué son las expansions de la API de Twitter y qué devuelven

Una expansion es un parámetro de solicitud de la API v2 oficial de X que agrega a la respuesta un objeto relacionado, como el autor, una foto o un post citado. Sin una, la consulta de un post devuelve tres campos: id, text y edit_history_tweet_ids. El autor no está, y ni siquiera su ID.

Con expansions=author_id, cada post gana un author_id, y la respuesta gana una lista includes.users con una entrada por autor. Por defecto esa entrada contiene solo id, name y username. Todo lo demás, como la bio, los conteos de seguidores o el avatar, hay que nombrarlo en user.fields.

La lista de abajo reúne las expansions de posts que más usan los desarrolladores y lo que cuesta cada una con los precios de la API de X vigentes desde el 22 de noviembre de 2026. Cada objeto de usuario cuesta el doble que el post con el que vino.

ExpansionAgrega a includesAPI oficial de X, por objeto desde el 22 de nov
author_idEl autor del post$0.010
referenced_tweets.idEl post citado, respondido o republicado$0.005
referenced_tweets.id.author_idEl autor de ese post$0.010
in_reply_to_user_idLa cuenta a la que se responde$0.010
entities.mentions.usernameCada cuenta mencionada$0.010
attachments.media_keysCada foto, video o GIF$0.005
attachments.poll_idsLa encuesta$0.005
geo.place_idEl lugar etiquetado$0.005
  • author_id

    Agrega a includes
    El autor del post
    API oficial de X, por objeto desde el 22 de nov
    $0.010
  • referenced_tweets.id

    Agrega a includes
    El post citado, respondido o republicado
    API oficial de X, por objeto desde el 22 de nov
    $0.005
  • referenced_tweets.id.author_id

    Agrega a includes
    El autor de ese post
    API oficial de X, por objeto desde el 22 de nov
    $0.010
  • in_reply_to_user_id

    Agrega a includes
    La cuenta a la que se responde
    API oficial de X, por objeto desde el 22 de nov
    $0.010
  • entities.mentions.username

    Agrega a includes
    Cada cuenta mencionada
    API oficial de X, por objeto desde el 22 de nov
    $0.010
  • attachments.media_keys

    Agrega a includes
    Cada foto, video o GIF
    API oficial de X, por objeto desde el 22 de nov
    $0.005
  • attachments.poll_ids

    Agrega a includes
    La encuesta
    API oficial de X, por objeto desde el 22 de nov
    $0.005
  • geo.place_id

    Agrega a includes
    El lugar etiquetado
    API oficial de X, por objeto desde el 22 de nov
    $0.005

Las tarifas vienen del aviso de X sobre la facturación de expansions del 23 de octubre de 2026 (se abre en una pestaña nueva), que dice que los objetos devueltos mediante expansions se facturarán "at the standard PPU rate for that resource, the same as direct lookups." Antes de esa fecha no costaban nada adicional al post.

#Obtén cada post con su autor en una sola llamada en Sorsa API

Sorsa API, una API y scraper de Twitter (X), devuelve cada post con un objeto user dentro: el perfil público completo del autor, 19 campos, sin costo adicional. No hay expansion que agregar, ni segunda lista que unir, ni cargo por autor. Una solicitud con tu clave API devuelve los posts, y cada uno ya sabe quién lo escribió.

  1. Obtén una clave. Regístrate y copia la clave API de tu panel. No interviene ninguna cuenta de desarrollador de X ni OAuth.

  2. Envía hasta 100 enlaces o IDs de posts. POST /tweet-info-bulk (se abre en una pestaña nueva) recibe una lista de URL de posts o de IDs sueltos y los devuelve en una sola respuesta, sin paginación.

    Terminal
    curl -X POST "https://api.sorsa.io/v3/tweet-info-bulk" \
      -H "ApiKey: YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"tweet_links": ["1849212213712385091",
           "https://x.com/kai_builds_tools/status/1849212213712385092"]}'
    
    Response200 OK
    {
      "tweets": [
        {
          "id": "1849212213712385091",
          "full_text": "Shipped the new export queue today.",
          "created_at": "2026-10-24T09:12:44Z",
          "likes_count": 214,
          "retweet_count": 31,
          "view_count": 18402,
          "user": {
            "id": "1592041833471827968",
            "username": "kai_builds_tools",
            "display_name": "Kai Builds",
            "description": "Data tooling for small teams.",
            "followers_count": 1840,
            "followings_count": 312,
            "tweets_count": 2291,
            "verified": false,
            "created_at": "2022-11-14T08:03:10Z",
            "location": "Lisbon",
            "profile_image_url": "https://pbs.twimg.com/profile_images/1/kai.jpg"
          }
        }
      ]
    }
    
  3. Lee el autor directamente de cada post. El perfil está en tweet["user"], así que un bucle sobre los posts es todo el código que hace falta.

    import requests
    
    URL = "https://api.sorsa.io/v3/tweet-info-bulk"
    HEADERS = {"ApiKey": "YOUR_API_KEY"}
    
    
    def tweets_with_authors(ids):
        for start in range(0, len(ids), 100):
            batch = ids[start:start + 100]
            r = requests.post(URL, headers=HEADERS,
                              json={"tweet_links": batch})
            r.raise_for_status()
            for tweet in r.json()["tweets"]:
                author = tweet["user"]
                yield (tweet["id"], author["username"],
                       author["followers_count"], tweet["full_text"])
    

Un 403 significa que falta la clave o que se quedó sin solicitudes; un 429 significa más de 20 solicitudes en un segundo, así que espera un momento y reintenta. Las solicitudes fallidas nunca se cobran.

El mismo objeto user viene con los posts de búsquedas, cronologías, respuestas y citas. POST /search-tweets (se abre en una pestaña nueva) devuelve unos 20 posts por página con sus autores, busca posts públicos desde 2006 con los operadores de búsqueda de X y entrega un next_cursor para la página siguiente hasta que el cursor vuelve vacío.

API oficial de X v2 El autor va junto al post data[0] id: "1849…091" text: "Shipped the new…" author_id: "1592…968" unir por id includes.users[0] id: "1592…968" name: "Kai Builds" username: "kai_bu…" $0.005 post + $0.010 autor Sorsa API El autor va dentro del tweet tweets[0] id: "1849…091" full_text: "Shipped the…" user: { username: "kai_builds…" display_name: "Kai Builds" followers_count: 1840 + 16 campos más } Autor incluido, sin costo extra
La API oficial de X envía el autor junto al post y lo factura aparte; Sorsa API lo incluye dentro del post.

#Asocia posts con autores en la API oficial de X

Para asociar posts con autores en la API oficial de X, arma un diccionario de includes.users con el ID de usuario como clave y luego busca en él el author_id de cada post. La guía de expansions (se abre en una pestaña nueva) de X señala que los objetos de includes no tienen posición, así que el ID es el único vínculo entre las dos listas.

Terminal
curl -G "https://api.x.com/2/tweets" \
  -H "Authorization: Bearer YOUR_BEARER_TOKEN" \
  --data-urlencode "ids=1849212213712385091,1849212213712385092" \
  --data-urlencode "expansions=author_id" \
  --data-urlencode "user.fields=description,public_metrics,profile_image_url"
Response200 OK
{
  "data": [
    {
      "id": "1849212213712385091",
      "text": "Shipped the new export queue today.",
      "author_id": "1592041833471827968",
      "edit_history_tweet_ids": ["1849212213712385091"]
    },
    {
      "id": "1849212213712385092",
      "text": "Next up: retries with backoff.",
      "author_id": "1592041833471827968",
      "edit_history_tweet_ids": ["1849212213712385092"]
    }
  ],
  "includes": {
    "users": [
      {
        "id": "1592041833471827968",
        "name": "Kai Builds",
        "username": "kai_builds_tools",
        "description": "Data tooling for small teams.",
        "public_metrics": {"followers_count": 1840, "following_count": 312}
      }
    ]
  }
}

Dos posts, un autor: includes.users lista cada autor una vez por respuesta, no una vez por post. Por eso la lista suele ser más corta que data, y por eso indexarla por posición, o leer includes["users"]["username"] como si fuera un solo objeto, falla. El bucle de abajo recorre los resultados de la búsqueda reciente y mantiene un solo diccionario de autores a lo largo de las páginas.

Python
import requests

URL = "https://api.x.com/2/tweets/search/recent"
HEADERS = {"Authorization": "Bearer YOUR_BEARER_TOKEN"}
params = {
    "query": "from:kai_builds_tools",
    "max_results": 100,
    "expansions": "author_id",
    "user.fields": "description,public_metrics,profile_image_url",
}

authors, rows = {}, []
while True:
    page = requests.get(URL, headers=HEADERS, params=params).json()
    for user in page.get("includes", {}).get("users", []):
        authors[user["id"]] = user
    for post in page.get("data", []):
        author = authors.get(post["author_id"], {})
        rows.append((post["id"], author.get("username"), post["text"]))
    token = page.get("meta", {}).get("next_token")
    if not token:
        break
    params["next_token"] = token

Usa .get() en el autor: una cuenta suspendida o retenida puede faltar en includes mientras su post sigue en data, y entonces la respuesta lista el hueco en un arreglo errors.

El autor de un repost o de una cita

Un repost o una cita es un post que apunta a otro post, y su author_id es la persona que republicó o citó, no el autor original. Para obtener también al autor original, pide tres expansions: author_id, referenced_tweets.id y referenced_tweets.id.author_id. El post original queda en includes.tweets, su autor queda en includes.users junto a quien republicó, y los unes mediante referenced_tweets[0].id y luego el author_id de ese post. Desde el 22 de noviembre, ese único repost factura dos posts y dos usuarios: $0.030.

En Sorsa API, el post republicado llega como retweeted_status y el citado como quoted_status, cada uno un post completo con su propio user dentro.

#Lo que cuestan las expansions desde el 22 de noviembre de 2026

Desde el 22 de noviembre de 2026, cada objeto que agrega una expansion se factura como una lectura directa: $0.010 por usuario y $0.005 por post, foto, video, encuesta o lugar. Un post leído con su autor cuesta por tanto hasta $0.015, tres veces los $0.005 que costaba antes. Agrega una foto por post y el post cuesta hasta $0.020; agrega también el post citado y su autor y llega a $0.035.

X deduplica dentro de un día UTC de 24 horas: según su página de precios de pago por uso (se abre en una pestaña nueva), un recurso obtenido de nuevo el mismo día no se vuelve a cobrar. Un usuario que escribió 50 de tus posts ese día se factura una sola vez. Así, 1,000 posts de 200 autores distintos cuestan $5.00 por los posts y $2.00 por los autores, $7.00 en total; 1,000 posts de 1,000 autores cuestan $15.00. La deduplicación se reinicia a medianoche UTC, y X la llama una garantía blanda.

En Sorsa API el precio no cambia según lo que lleve un post. Los posts por ID cuestan desde $0.014 por 1,000 con sus autores, posts citados y enlaces a medios dentro; los resultados de búsqueda cuestan desde $0.07 por 1,000. Frente a $15.00 por 1,000 posts con autores en la API oficial de X, son unas 1,000 veces menos.

Lo que lees, por cada 1,000 postsSorsa APIAPI oficial de X desde el 22 de nov
Solo postsdesde $0.014$5.00
Posts con sus autoresdesde $0.014hasta $15.00
Más una foto o video cada unodesde $0.014hasta $20.00
Más el post citado y su autordesde $0.014hasta $35.00
  • Solo posts

    Sorsa API
    desde $0.014
    API oficial de X desde el 22 de nov
    $5.00
  • Posts con sus autores

    Sorsa API
    desde $0.014
    API oficial de X desde el 22 de nov
    hasta $15.00
  • Más una foto o video cada uno

    Sorsa API
    desde $0.014
    API oficial de X desde el 22 de nov
    hasta $20.00
  • Más el post citado y su autor

    Sorsa API
    desde $0.014
    API oficial de X desde el 22 de nov
    hasta $35.00

La calculadora estima el costo de un mes de posts con las expansions que uses. Cuenta cada autor como nuevo, el extremo alto del rango; elige autores repetidos para ver el efecto de la deduplicación.

Publicaciones al mes
Expansiones en la API oficial de X
Autores
API oficial de X desde el 22 de nov
hasta $15,000
al mes: $0.005 por publicación + $0.010 por autor
Sorsa API
desde $14
al mes, tweets por ID, con el autor dentro de cada uno

Cada expansión suma su propio cargo en la API oficial de X; en Sorsa API el autor, la publicación citada y los enlaces de medios vienen dentro del tweet.

Para tener en cuenta

El plan de pago por uso de X se detiene en 3 millones de lecturas de posts al mes; más allá, la API oficial de X es un contrato Enterprise desde unos $42,000 al mes. En Sorsa API el precio por cada 1,000 posts baja a medida que crece el plan, y el autor es parte de cada post en todos los planes.

#Por qué el autor ya no está dentro del post

El autor solía ser parte del post. En el formato v1.1, cada objeto de post llevaba un objeto user con el perfil del autor, de modo que un post era autocontenido, como lo expresa la documentación de twarc (se abre en una pestaña nueva). La versión 2 de la API, lanzada en 2020, recortó cada objeto a unos pocos campos por defecto y movió los objetos relacionados a includes, accesibles solo mediante expansions.

Hasta ahora esa separación costaba código pero no dinero: los objetos devueltos mediante expansions no contaban para el uso, así que una expansion simplemente ahorraba una segunda solicitud. El aviso de octubre de 2026 cambió la parte del dinero. Desde el 22 de noviembre, el autor que unes desde includes.users se factura como si lo hubieras consultado por separado.

API v1.1 user dentro de cada tweet Parte del post API v2, 2020 includes.users con expansions=author_id No cuenta en el uso 22 nov 2026 Cada autor expandido se cobra como lectura de usuario $0.010 por autor Sorsa API: user dentro de cada tweet, 19 campos, sin costo extra
El autor salió del post en 2020 y se volvió un cargo aparte en 2026; Sorsa API lo mantiene dentro del post.

El post de Sorsa API se parece en esto al de v1.1: user está dentro. El código escrito para v1.1 que lee tweet["user"]["screen_name"] solo necesita un nombre de clave nuevo, username; la guía para migrar de la API de Twitter/X asigna el resto de una base de código v2 endpoint por endpoint.

#Qué campos del autor vienen con cada post de Sorsa API

Cada post de Sorsa API lleva 19 campos del autor bajo user, sin nada que solicitar. La tabla asigna los que más necesita el código a los nombres de la API oficial de X que listarías en user.fields.

Campo user de Sorsa APINombre en user.fields de la API oficial de X
usernameusername
display_namename
descriptiondescription
followers_countpublic_metrics.followers_count
followings_countpublic_metrics.following_count
tweets_countpublic_metrics.tweet_count
profile_image_urlprofile_image_url
created_atcreated_at
locationlocation
verifiedverified
protectedprotected
pinned_tweet_idspinned_tweet_id
bio_urlsentities.description.urls
  • username

    Nombre en user.fields de la API oficial de X
    username
  • display_name

    Nombre en user.fields de la API oficial de X
    name
  • description

    Nombre en user.fields de la API oficial de X
    description
  • followers_count

    Nombre en user.fields de la API oficial de X
    public_metrics.followers_count
  • followings_count

    Nombre en user.fields de la API oficial de X
    public_metrics.following_count
  • tweets_count

    Nombre en user.fields de la API oficial de X
    public_metrics.tweet_count
  • profile_image_url

    Nombre en user.fields de la API oficial de X
    profile_image_url
  • created_at

    Nombre en user.fields de la API oficial de X
    created_at
  • location

    Nombre en user.fields de la API oficial de X
    location
  • verified

    Nombre en user.fields de la API oficial de X
    verified
  • protected

    Nombre en user.fields de la API oficial de X
    protected
  • pinned_tweet_ids

    Nombre en user.fields de la API oficial de X
    pinned_tweet_id
  • bio_urls

    Nombre en user.fields de la API oficial de X
    entities.description.urls

Los otros seis son id, favourites_count, media_count, profile_background_image_url, can_dm y possibly_sensitive. Los IDs llegan como cadenas y las fechas en ISO 8601. La lista completa de lo que contienen los posts, los perfiles y otros objetos está en la guía de qué datos puedes obtener de la API de Twitter.

Cuando tu punto de partida es una lista de IDs de posts, la guía para rehidratar IDs de posts cubre listas de millones, 100 IDs por solicitud.

#Lee tus primeros posts con sus autores

En la API oficial de X, el autor de un post es una expansion: una segunda lista que unir y, desde el 22 de noviembre de 2026, un cargo de $0.010 por autor además de los $0.005 del post. Para obtener posts con sus autores en una sola pieza, usa Sorsa API: POST /tweet-info-bulk devuelve 100 posts por solicitud, cada uno con el perfil completo de su autor dentro, desde $0.014 por 1,000, a 20 solicitudes por segundo en todos los planes.

Sorsa API nunca te pide tu inicio de sesión de X, así que tu propia cuenta nunca corre riesgo, y es de solo lectura por diseño: para publicar, combínala con la API oficial de X. Tus 100 solicitudes gratis leen los primeros 10K posts con sus autores.

#Preguntas frecuentes

¿La API oficial de X devuelve el nombre de usuario con cada post?

No, no por defecto. La API v2 oficial de X devuelve un post solo con id, text y edit_history_tweet_ids. Agrega expansions=author_id y la respuesta recibe una lista includes.users con el id, el name y el username de cada autor, que asocias con los posts por author_id. Desde el 22 de noviembre de 2026 cada uno de esos autores se factura a $0.010.

¿Cómo obtengo al autor original de un repost o de una cita?

En la API oficial de X, pide expansions=referenced_tweets.id,referenced_tweets.id.author_id. El post original aparece en includes.tweets y su autor en includes.users; sigue referenced_tweets[0].id hasta el post y luego su author_id hasta el usuario. En Sorsa API, un post republicado llega como retweeted_status y uno citado como quoted_status, cada uno con su propio objeto user dentro.

¿Se facturan las expansions de la API de Twitter?

Sí, desde el 22 de noviembre de 2026. El aviso de X del 23 de octubre dice que los objetos devueltos mediante expansions se facturan a la tarifa estándar de pago por uso: $0.010 por usuario y $0.005 por post, elemento multimedia, encuesta o lugar. Cada recurso se cobra una vez por día UTC de 24 horas, así que un autor repetido el mismo día no se factura de nuevo.

¿Por qué includes.users tiene menos elementos que data?

La API oficial de X lista a cada autor una vez por respuesta, sin importar cuántos de los posts escribió. Diez posts de tres personas devuelven tres usuarios. También puede faltar un autor cuando la cuenta está suspendida o retenida; la respuesta entonces lo nombra en un arreglo errors. Asocia por ID con un diccionario, nunca por posición.

¿Qué API debo usar para obtener posts con perfiles de autores?

Usa Sorsa API. Cada post que devuelve lleva el perfil completo de su autor, 19 campos, sin expansion y sin cargo por autor: POST /tweet-info-bulk lee 100 posts por solicitud desde $0.014 por 1,000, frente a hasta $15.00 por 1,000 posts con autores en la API oficial de X. Una sola clave API, 20 solicitudes por segundo en todos los planes y 100 solicitudes gratis para empezar.

#Cómo lo comprobamos

El 2 de noviembre de 2026 leímos las guías de expansions y de campos de X, su página de precios de pago por uso y su aviso del 23 de octubre sobre la facturación de expansions, y de ahí tomamos cada tarifa y valor por defecto de la API oficial de X. Los endpoints de Sorsa API, los cuerpos de solicitud y los 19 campos del autor vienen de la referencia de la API en vivo del mismo día. Los ejemplos de solicitud y respuesta siguen ambas referencias, con cuentas de demostración en lugar de reales.

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.