Obtén datos públicos de perfiles de X con Python para enriquecer leads
Consulta seguidores, bio y verificación de un perfil público de X con una sola solicitud y sin cuenta de desarrollador, más lo que el endpoint no cubre exactamente. Probado en agosto de 2026.

Antes de escribirle a un creador o añadir un lead a una lista, quieres lo básico: cuántos seguidores tiene de verdad, si la cuenta está verificada, qué dice la bio, cuándo se creó. Eso es una consulta de perfil público, no un proyecto de investigación, y /v1/x responde justo eso con una sola solicitud.
La propia plataforma de desarrolladores de X puede responder la misma pregunta, pero solo después de registrar una app, conseguir la aprobación, y elegir un nivel de pago, un coste de puesta en marcha real si lo único que necesitas es el número de seguidores de un puñado de leads a la semana. Este endpoint se salta todo eso: es una llamada REST normal contra datos de perfil público, facturada por consulta en vez de por suscripción.
Un solo parámetro: profileId
El único parámetro es profileId, en camelCase, y es el nombre de usuario sin la @. Pasa elonmusk, no @elonmusk ni una URL de perfil. Si tu lista de origen tiene nombres de usuario copiados directamente de X o de un enlace de perfil, quita la @ y cualquier URL alrededor antes de construir la solicitud, ya que profileId está documentado como el handle desnudo.
import requests
API_KEY = "faf_live_..." # tu clave de FastAF
resp = requests.get(
"https://api.fastaf.co/v1/x",
params={"profileId": "elonmusk"},
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=60,
)
resp.raise_for_status()
profile = resp.json()["profile"]
stats = profile["stats"]
print(f'{profile["name"]} ({profile["username"]})')
print(f'verified: {profile["is_blue_verified"]}')
print(f'followers: {stats["followers"]:,} following: {stats["following"]:,} tweets: {stats["tweets"]:,}')
print(f'bio: {profile["description"]}')
print(f'created: {profile["created_at"]}')
Eso son 5 créditos. Todo anida primero bajo un objeto profile, y los contadores anidan otra vez un nivel más abajo bajo profile["stats"], que es la parte que la gente adivina mal antes de comprobarlo: followers no está en el nivel superior.
Qué obtienes en realidad
Ejecutar la llamada de arriba contra una cuenta real y conocida devolvió un objeto profile con: name, username (este vuelve con la @ incluida, aunque el parámetro de la solicitud no la lleve), user_id, description (la bio), location, website, created_at, is_blue_verified, verified_type, protected, possibly_sensitive, y campos de imagen (profile_image, profile_banner). Anidados bajo stats: followers, following, tweets, y creator_subscriptions. Para esa cuenta en concreto, los números eran un recuento de followers por encima de 241 millones, following en 1.396, y tweets en 107.673, todo enteros planos, sin formato que quitar. Eso basta para montar una regla de vetting real, por ejemplo rechazar cualquier cosa por debajo de un mínimo de seguidores, o una comprobación de antigüedad de cuenta calculada a partir de created_at.
location volvió como null en esta cuenta, lo cual recuerda que los campos del perfil son tan completos como lo que la persona rellenó en X: trata todos los campos, salvo lo básico de identidad (name, username, user_id), como opcionales cuando escribas el código que consume esto.
Lo que no hace
Ten claro el alcance antes de montar un pipeline sobre esto: /v1/x devuelve un perfil, una vez, por llamada. No devuelve las publicaciones de esa cuenta, no devuelve un listado de sus seguidores ni a quién sigue, y no es un buscador: ya necesitas el nombre de usuario exacto, de un formulario de leads, un CSV, una mención, de donde sea que venga tu lista. Si tu flujo necesita “encontrar cuentas que hablan de X” en vez de “cuéntame sobre esta cuenta concreta”, este endpoint no es la herramienta adecuada para ese paso.
También es una foto fija, no una suscripción: nada te empuja una actualización cuando un recuento de seguidores cruza un umbral o cambia una bio. Si necesitas eso, llámalo de nuevo con tu propio horario y compara el stats que recibes contra lo que guardaste la última vez, igual que seguirías cualquier otro número que cambia con el tiempo.
Vetting y enriquecimiento, en concreto
El patrón común es un job por lotes: entra un listado de nombres de usuario, sale un listado puntuado o filtrado. Mantén el filtro en sí simple y específico para lo que realmente necesitas, un mínimo de seguidores, una comprobación de verificación, un corte de antigüedad de cuenta, en vez de intentar calcular un único “influencer score” a partir de campos que nunca se diseñaron para combinarse en uno.
def enrich(usernames, min_followers=10_000):
qualified = []
for handle in usernames:
resp = requests.get(
"https://api.fastaf.co/v1/x",
params={"profileId": handle},
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=60,
)
resp.raise_for_status()
p = resp.json()["profile"]
if p["stats"]["followers"] >= min_followers:
qualified.append({
"username": p["username"],
"followers": p["stats"]["followers"],
"verified": p["is_blue_verified"],
"bio": p["description"],
})
return qualified
Envuelve cada llamada en un try/except en producción: una cuenta desactivada o suspendida es una posibilidad real en cualquier lista que no hayas generado tú mismo, y quieres que eso salte una fila, no que pare el lote.
Cuánto cuesta esto
| Volumen | Créditos | Pack que lo cubre | Coste |
|---|---|---|---|
| 500 leads, pasada de vetting puntual | 2.500 | Growth, $29 | ~$0,97 del pack |
| 5.000 perfiles enriquecidos en 30 días | 25.000 | Growth, $29 | ~$9,67 del pack |
| 50.000 perfiles enriquecidos en 30 días | 250.000 | Scale, $99 | ~$82,50 del pack |
Las solicitudes fallidas nunca se cobran: los créditos se reservan al iniciar una solicitud y se devuelven si no llega ningún resultado. El plan gratuito es de 500 créditos sin tarjeta, lo que cubre 100 consultas de perfil, de sobra para comprobar la cobertura de campos en tu propia lista antes de comprometerte con un horario.