Öffentliche X-Profildaten mit Python für Lead-Enrichment holen
Follower-Zahlen, Bio und Verifizierung für ein öffentliches X-Profil mit einer Anfrage und ohne Entwicklerkonto nachschlagen, plus genau das, was der Endpoint nicht abdeckt. Getestet im August 2026.

Bevor du einem Creator eine E-Mail schreibst oder einen Lead zu einer Liste hinzufügst, willst du die Basics: wie viele Follower hat der Account tatsächlich, ist er verifiziert, was steht in der Bio, wann wurde er erstellt. Das ist ein Nachschlagen eines öffentlichen Profils, kein Rechercheprojekt, und /v1/x beantwortet genau das mit einer Anfrage.
Xs eigene Entwicklerplattform kann dieselbe Frage beantworten, aber erst, nachdem du eine App registriert, eine Freigabe bekommen und eine bezahlte Stufe gewählt hast, ein echter Setup-Aufwand, wenn du nur eine Follower-Zahl für eine Handvoll Leads pro Woche brauchst. Dieser Endpoint überspringt das: Es ist ein normaler REST-Call gegen öffentliche Profildaten, abgerechnet pro Nachschlagen statt pro Abo.
Ein Parameter: profileId
Der einzige Parameter ist profileId, camelCase, und das ist der Username ohne das @. Übergib elonmusk, nicht @elonmusk und keine Profil-URL. Wenn deine Quellliste Usernames enthält, die direkt von X kopiert oder aus einem Profillink gezogen wurden, entferne das @ und jede umschließende URL, bevor du den Request baust, denn profileId ist als reines Handle dokumentiert.
import requests
API_KEY = "faf_live_..." # dein FastAF-Key
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"]}')
Das sind 5 Credits. Alles verschachtelt sich zuerst unter einem profile-Objekt, und die Zähler verschachteln sich noch eine Ebene tiefer unter profile["stats"], das ist der Teil, den Leute falsch raten, bevor sie nachschauen: followers liegt nicht auf oberster Ebene.
Was du tatsächlich bekommst
Der Call oben gegen einen echten, bekannten Account lieferte ein profile-Objekt mit: name, username (der kommt inklusive @ zurück, auch wenn der Request-Parameter es nicht enthält), user_id, description (die Bio), location, website, created_at, is_blue_verified, verified_type, protected, possibly_sensitive, und Bildfeldern (profile_image, profile_banner). Verschachtelt unter stats: followers, following, tweets und creator_subscriptions. Für diesen bestimmten Account lagen die Zahlen bei einem followers-Wert von über 241 Millionen, following bei 1.396, und tweets bei 107.673, alles reine Integer, keine Formatierung zum Entfernen. Das reicht, um eine echte Vetting-Regel zu bauen, zum Beispiel alles unterhalb einer Follower-Untergrenze abzulehnen, oder einen Account-Alter-Check, berechnet aus created_at.
location kam bei diesem Account als null zurück, eine Erinnerung daran, dass Profilfelder nur so vollständig sind wie das, was die Person auf X ausgefüllt hat: Behandle jedes Feld außer den Identitäts-Basics (name, username, user_id) als optional, wenn du den Code schreibst, der das konsumiert.
Was es nicht macht
Sei dir über den Scope im Klaren, bevor du eine Pipeline darauf baust: /v1/x liefert ein Profil, einmal, pro Call. Es liefert nicht die Posts dieses Accounts, es liefert keine Liste seiner Follower oder wem er folgt, und es ist keine Suche: Du brauchst den exakten Username schon vorher, aus einem Lead-Formular, einer CSV, einer Erwähnung, woher auch immer deine Liste kommt. Wenn dein Workflow „Accounts finden, die über X reden” statt „erzähl mir über diesen bestimmten Account” braucht, ist dieser Endpoint das falsche Werkzeug für diesen Schritt.
Es ist außerdem eine Momentaufnahme, kein Abo: Nichts pusht dir ein Update, wenn eine Follower-Zahl eine Schwelle überschreitet oder sich eine Bio ändert. Wenn du das brauchst, ruf es nach deinem eigenen Zeitplan erneut auf und diff die stats, die du zurückbekommst, gegen das, was du beim letzten Mal gespeichert hast, genauso wie du jede andere Zahl trackst, die sich über die Zeit ändert.
Vetting und Enrichment, konkret
Das übliche Muster ist ein Batch-Job: eine Liste von Usernames rein, eine bewertete oder gefilterte Liste raus. Halt den Filter selbst einfach und spezifisch für das, was du wirklich brauchst, eine Follower-Untergrenze, ein Verified-Check, ein Account-Alter-Cutoff, statt zu versuchen, aus Feldern, die nie dafür gedacht waren, sich zu einem zu kombinieren, einen einzigen „Influencer-Score” zu berechnen.
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
Wickle jeden Call in Produktion in ein try/except: Ein deaktivierter oder gesperrter Account ist eine reale Möglichkeit in jeder Liste, die du nicht gerade selbst generiert hast, und du willst, dass das eine Zeile überspringt, nicht den ganzen Batch stoppt.
Was das kostet
| Volumen | Credits | Paket, das das abdeckt | Kosten |
|---|---|---|---|
| 500 Leads, einmaliger Vetting-Durchlauf | 2.500 | Growth, $29 | ~$0,97 vom Paket |
| 5.000 Profile, in 30 Tagen angereichert | 25.000 | Growth, $29 | ~$9,67 vom Paket |
| 50.000 Profile, in 30 Tagen angereichert | 250.000 | Scale, $99 | ~$82,50 vom Paket |
Fehlgeschlagene Anfragen werden nie berechnet: Credits werden reserviert, wenn eine Anfrage startet, und zurückgegeben, wenn sie ohne Ergebnis bleibt. Der Free Tier sind 500 Credits ohne Karte, das deckt 100 Profil-Lookups ab, reichlich, um die Feldabdeckung an deiner eigenen Liste zu prüfen, bevor du dich auf einen Zeitplan festlegst.