Récupérer les données publiques d'un profil X avec Python pour enrichir des leads

Récupérez le nombre d'abonnés, la bio et la vérification d'un profil X public en une seule requête et sans compte développeur, plus exactement ce que l'endpoint ne couvre pas. Testé en août 2026.

Avant d’écrire à un créateur ou d’ajouter un lead à une liste, vous voulez les bases : combien d’abonnés il a vraiment, si le compte est vérifié, ce que dit la bio, quand il a été créé. C’est une consultation de profil public, pas un projet de recherche, et /v1/x répond exactement à ça en une seule requête.

La plateforme développeur de X elle-même peut répondre à la même question, mais seulement après avoir enregistré une app, obtenu une approbation, et choisi un palier payant, un vrai coût de mise en place si tout ce dont vous avez besoin est un nombre d’abonnés sur une poignée de leads par semaine. Cet endpoint évite tout ça : c’est un appel REST normal sur des données de profil public, facturé à la consultation plutôt qu’à l’abonnement.

Un seul paramètre : profileId

Le seul paramètre est profileId, en camelCase, et c’est le nom d’utilisateur sans le @. Passez elonmusk, pas @elonmusk et pas une URL de profil. Si votre liste source a des noms d’utilisateur copiés directement depuis X ou depuis un lien de profil, retirez le @ et toute URL autour avant de construire la requête, puisque profileId est documenté comme le simple handle.

import requests

API_KEY = "faf_live_..."  # votre clé 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"]}')

Ça fait 5 crédits. Tout est imbriqué d’abord sous un objet profile, et les compteurs sont imbriqués encore un niveau plus bas sous profile["stats"], ce qui est la partie que les gens devinent mal avant de vérifier : followers n’est pas au premier niveau.

Ce que vous obtenez vraiment

Lancer l’appel ci-dessus sur un compte réel et connu a renvoyé un objet profile avec : name, username (celui-là revient avec le @ inclus, même si le paramètre de la requête ne le prend pas), user_id, description (la bio), location, website, created_at, is_blue_verified, verified_type, protected, possibly_sensitive, et des champs d’image (profile_image, profile_banner). Imbriqués sous stats : followers, following, tweets, et creator_subscriptions. Pour ce compte précis, les chiffres étaient un nombre de followers au-delà de 241 millions, following à 1 396, et tweets à 107 673, tous des entiers bruts, sans formatage à retirer. C’est suffisant pour construire une vraie règle de vetting, par exemple rejeter tout ce qui est sous un plancher d’abonnés, ou une vérification d’ancienneté de compte calculée à partir de created_at.

location est revenu à null sur ce compte, ce qui rappelle que les champs de profil ne sont complets qu’à hauteur de ce que la personne a rempli sur X : traitez tous les champs sauf les bases d’identité (name, username, user_id) comme optionnels quand vous écrivez le code qui consomme ça.

Ce que ça ne fait pas

Soyez au clair sur le périmètre avant de construire un pipeline là-dessus : /v1/x renvoie un profil, une fois, par appel. Ça ne renvoie pas les posts de ce compte, ça ne renvoie pas la liste de ses abonnés ou de qui il suit, et ce n’est pas une recherche : il vous faut déjà le nom d’utilisateur exact, depuis un formulaire de lead, un CSV, une mention, peu importe d’où vient votre liste. Si votre workflow a besoin de “trouver des comptes qui parlent de X” plutôt que de “me dire des choses sur ce compte précis”, cet endpoint n’est pas le bon outil pour cette étape.

C’est aussi un instantané, pas un abonnement : rien ne vous pousse de mise à jour quand un nombre d’abonnés franchit un seuil ou qu’une bio change. Si vous en avez besoin, rappelez-le sur votre propre planning et comparez le stats que vous récupérez à ce que vous aviez stocké la dernière fois, de la même façon que vous suivriez n’importe quel autre chiffre qui change dans le temps.

Vetting et enrichissement, concrètement

Le pattern courant, c’est une tâche par lot : une liste de noms d’utilisateur en entrée, une liste notée ou filtrée en sortie. Gardez le filtre lui-même simple et spécifique à ce dont vous avez vraiment besoin, un plancher d’abonnés, une vérification du badge, un seuil d’ancienneté de compte, plutôt que d’essayer de calculer un “score d’influence” unique à partir de champs qui n’ont jamais été conçus pour se combiner en un seul.

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

Enveloppez chaque appel dans un try/except en production : un compte désactivé ou suspendu est une vraie possibilité dans n’importe quelle liste que vous n’avez pas générée vous-même, et vous voulez que ça saute une ligne, pas que ça arrête le lot entier.

Ce que ça coûte

Volume Crédits Pack qui le couvre Coût
500 leads, passage de vetting ponctuel 2 500 Growth, 29 $ ~0,97 $ du pack
5 000 profils enrichis en 30 jours 25 000 Growth, 29 $ ~9,67 $ du pack
50 000 profils enrichis en 30 jours 250 000 Scale, 99 $ ~82,50 $ du pack

Les requêtes échouées ne sont jamais facturées : les crédits sont réservés quand une requête démarre et rendus si elle ne revient pas avec un résultat. L’offre gratuite est de 500 crédits sans carte, ce qui couvre 100 consultations de profil, largement de quoi vérifier la couverture des champs sur votre propre liste avant de vous engager sur un planning.