Eine kostenlose Twitter Search API, die JSON liefert, mit den Suchoperatoren von X

Eine kostenlose Twitter Search API, die JSON liefert, mit den Suchoperatoren von X
Unif Cookbooks team
Unif Cookbooks team

Aktualisiert

Aktuelle öffentliche X-Posts per Skript oder AI-Agent ohne API-Key als JSON durchsuchen: Endpunkt, funktionierende Operatoren, Paging und Limits.

Kurz gesagt: GET https://unifapi.com/tools/x/search?q=<query> liefert öffentliche X-Posts zu einer Suchanfrage als JSON. Die Nutzung ist kostenlos, ohne Login, ohne Account und ohne API-Key, und pro Besucher begrenzt. Die Suchoperatoren von X funktionieren in q: from:, to:, since:, until:, min_faves:, min_retweets:, filter:media, filter:links, -filter:replies, lang: und Phrasen in Anführungszeichen. Ergebnisse kommen zu 20 pro Seite, neueste zuerst, mit einem nextCursor zum Blättern. Das kostenlose Limit liegt bei 20 Einheiten pro 10 Minuten und Besucher, ausgewiesen in X-RateLimit-*-Headern, und eine Suche kostet 2 Einheiten, weil sie upstream der teuerste Aufruf ist; das sind also 10 Suchen. Ohne Datum bekommen Sie die neuesten Posts; mit since: und until: reicht dieselbe Suche bis 2006 zurück.

Von allem, was man von X ohne Account haben will, ist die Suche das Einzige ohne gute kostenlose Antwort. Die Link-Vorschau-APIs (FxTwitter, vxTwitter) lesen einzelne Posts. Der Syndication-Endpoint liest einzelne Posts. Nitter hatte eine Suche, und die meisten öffentlichen Nitter-Instanzen sind verschwunden oder aus rechtlichen Gründen gesperrt. Blieb entweder ein Developer-Account mit bezahltem Tarif oder ein Headless-Browser, der x.com/search steuert, was langsam und fragil ist und gegen die Nutzungsbedingungen verstößt.

Hier steht, was der kostenlose Such-Endpoint macht, wie man ihn abfragt und wo er aufhört.

Die Anfrage

curl -s "https://unifapi.com/tools/x/search?q=from%3Anasa%20filter%3Amedia"
{
  "query": "from:nasa filter:media",
  "posts": {
    "items": [
      {
        "id": "2107566197579341846",
        "text": "After delivering science and supplies to the @Space_Station earlier this year, Northrop Grumman's Cygnus XL cargo spacecraft is scheduled to depart on Friday…",
        "createdAt": "2026-10-06T20:18:32.000Z",
        "url": "https://x.com/NASA/status/2107566197579341846",
        "author": { "handle": "NASA", "name": "NASA", "verified": true, "followers": 92373839 },
        "metrics": {
          "likes": 2195,
          "reposts": 302,
          "replies": 114,
          "quotes": 20,
          "bookmarks": 104,
          "views": 1520159
        },
        "media": [
          {
            "kind": "photo",
            "url": "https://pbs.twimg.com/media/…jpg",
            "width": 1920,
            "height": 1280
          }
        ]
      }
    ],
    "hasMore": true,
    "nextCursor": "DAACCgACHUAq4qFAJxAKAAMd…"
  }
}

Dieselbe Anfrage auf der Seite für Menschen lautet https://unifapi.com/tools/x-search?q=from:nasa filter:media, und mit &format=json an dieser Seiten-URL kommt das JSON von oben zurück. Mit format=md stattdessen, oder dem Header Accept: text/markdown, kommen die Posts als Markdown, was besser ins Kontextfenster eines Modells passt als JSON.

Operatoren, die funktionieren

Die Anfrage geht unverändert an die Suche von X, also funktionieren hier die Operatoren, die X für sein eigenes Suchfeld dokumentiert. Diese nutzen wir am häufigsten:

OperatorBeispielWas er tut
from:from:nasaPosts eines Accounts
to:to:nasaAntworten, die an einen Account gerichtet sind
@handle@nasaPosts, die einen Account erwähnen
#tag#Formula1Posts mit einem Hashtag
"phrase""crew-12"Exakte Phrase
since: / until:since:2026-10-01Datumsgrenzen (ganze Tage)
min_faves:min_faves:100Mindestens N Likes
min_retweets:min_retweets:50Mindestens N Reposts
filter:mediafrom:nasa filter:mediaNur Posts mit Fotos oder Video
filter:linksfilter:linksNur Posts mit einem Link
-filter:replies#Formula1 -filter:repliesAntworten ausschließen
-filter:retweetsfrom:nasa -filter:retweetsReposts ausschließen
lang:lang:jaSprachcode
ORnasa OR esaEiner der beiden Begriffe

Sie lassen sich kombinieren. „Posts von NASA aus der letzten Woche mit mindestens 100 Likes und einem Foto, ohne Antworten“ lautet:

from:nasa since:2026-09-30 min_faves:100 filter:media -filter:replies

Die Suchseite hat für jeden der fünf häufigsten einen Filter (Account, Datum, Likes, Medien, Antworten) und zeigt die Anfrage an, die diese Filter bauen; das ist exakt der String, den die API bekommt.

Neueste, nicht Top

Die Suche von X kennt zwei Sortierungen: „Top“, die Relevanz und Alter mischt und gern mit einem Post von 2009 beginnt, und „Neueste“, strikt neueste zuerst. Der kostenlose Endpoint fragt „Neueste“ ab. Für Monitoring, Reaktionen auf ein Ereignis und alles mit einer since:-Grenze ist das die richtige Wahl. Wer „die meistgelikten Posts zu X in dieser Woche“ will, sortiert die Ergebnisse selbst nach metrics.likes oder schneidet mit min_faves: das Ende ab.

Blättern

Jede Liste in der kostenlosen API ist { items, hasMore, nextCursor }. Zum Weiterblättern den Cursor zurückgeben:

curl -s "https://unifapi.com/tools/x/search?q=%23Formula1&cursor=DAACCgACHUAq4qFAJxAKAAMd…"

Cursor sind opake Strings; nicht parsen. hasMore ist genau dann true, wenn nextCursor gesetzt ist. Eine Suchseite enthält 20 Posts, drei Anfragen lesen also rund 60 Posts für 6 Ihrer 20 Einheiten.

Limits, in der Antwort

HTTP/2 200
X-RateLimit-Limit: 20
X-RateLimit-Remaining: 16
X-RateLimit-Reset: 1791357984

Der kostenlose Tarif umfasst 20 Einheiten pro 10 Minuten und Besucher über alle /tools/x/*-Endpoints hinweg, und eine Suche kostet 2. Sind sie aufgebraucht, kommt ein 429 mit Retry-After und einem JSON-Body, der nennt, wo sich das Limit aufheben lässt:

{
  "error": {
    "type": "rate_limited",
    "message": "Free limit of 20 requests per 10 minutes reached. Retry after 412s, or use a UnifAPI workspace key (pay as you go) for uncapped access.",
    "retryAfterSeconds": 412,
    "upgrade": "https://unifapi.com/apis/twitter"
  }
}

Ein gut erzogener Agent liest X-RateLimit-Remaining, bevor er weiterblättert, und wartet die Zeit aus Retry-After ab, statt in einer Schleife neu zu versuchen.

Was der Endpoint nicht tut

  • Relevanz. Die Ergebnisse kommen ausschließlich neueste zuerst. Alte Posts sind über Datumsangaben erreichbar (from:jack until:2006-04-01 liefert Posts aus dem März 2006), aber nichts stellt das Beste eines Zeitraums nach vorn, und X zieht die Tagesgrenzen von since:/until: in seiner eigenen Zeitzone, sodass ein Zeitraum zu beiden Seiten ein paar Stunden überlaufen kann.
  • Geschützte Accounts. Es werden nur öffentliche Posts geliefert.
  • Trefferzahlen. Es gibt keine Angabe „so viele Posts haben gepasst“; X stellt für die Suche keine bereit.
  • Garantien. Der kostenlose Tarif ist geteilte Infrastruktur mit einer Obergrenze pro Besucher. Ein Workflow, der Volumen oder ein SLA braucht, wechselt zur abgerechneten API, wo die Feldnamen dieselben sind.

Eine Monitoring-Schleife in zwanzig Zeilen

import requests, time

BASE = "https://unifapi.com/tools/x/search"
seen = set()

def poll(query):
    r = requests.get(BASE, params={"q": query}, headers={"Accept": "application/json"})
    if r.status_code == 429:
        time.sleep(int(r.headers.get("Retry-After", "60")))
        return []
    r.raise_for_status()
    fresh = [p for p in r.json()["posts"]["items"] if p["id"] not in seen]
    seen.update(p["id"] for p in fresh)
    return fresh

while True:
    for post in poll('"unifapi" -filter:replies'):
        print(post["createdAt"], post["author"]["handle"], post["metrics"]["likes"], post["url"])
    time.sleep(600)

Eine Suche alle 10 Minuten sind 2 der 20 kostenlosen Einheiten; die Schleife reißt das Limit nie und behandelt den 429-Fall trotzdem.

FAQ

Gibt es 2026 eine kostenlose Twitter Search API?

Ja, diese hier: kostenlos nutzbar, ohne Login und ohne API-Key, pro Besucher begrenzt auf 10 Suchen pro 10 Minuten. Die offizielle X API hat keinen kostenlosen Such-Tarif; ihr kostenloser Plan erlaubt nur das Posten.

Funktionieren die Operatoren der erweiterten Twitter-Suche?

Ja. Die Anfrage wird unverändert an die Suche von X weitergereicht, also funktionieren from:, since:, until:, min_faves:, filter:media, -filter:replies, lang: und Phrasen in Anführungszeichen.

Wie weit reicht die Suche zurück?

Bis 2006. Ohne Datum bekommen Sie die neuesten Posts zuerst; mit since: und until: springen Sie in einen Zeitraum, zum Beispiel from:jack until:2006-04-01.

Kann ich die Ergebnisse als Markdown statt JSON bekommen?

Ja. format=md anhängen oder den Header Accept: text/markdown senden. Die Markdown-Darstellung listet jeden Post mit Autor, Text, Metriken und URL.