Ereignisse

Umschlag

Jedes Ereignis hat denselben Umschlag; d trägt die unten beschriebene typspezifische Nutzlast.

FeldTypBedeutung
vintUmschlagversion. Heute 1
tstringEreignistyp, aus der Tabelle unten
opcreate | update | deletecreate, update (Anreicherung derselben ID) oder delete
idstringStabile Identität. Hierauf deduplizieren
tsint (ms)Wann es auf X geschah, ms seit der Epoche. X nennt keinen Zeitpunkt für Profiländerungen, Folgen und Entfolgen, neue verifizierte Follower und gelöschte Beiträge: Bei diesen Ereignissen ist es der Zeitpunkt unserer Erkennung
sidstringStream-Position für das Replay; vorhanden auf dem Stream und in der Historie
target.idstringNumerische X-ID des überwachten Kontos (bei search.match: des Beitragsautors)
target.screen_namestringHandle des überwachten Kontos
target.namestringDer Anzeigename des Kontos
dobjectTypspezifische Nutzlast

Ereignistypen

TypKategorieBedeutung
tweet.createBeiträgeDas Konto hat etwas Neues gepostet
tweet.replyBeiträgeEs hat jemandem geantwortet; reply_to trägt den beantworteten Beitrag mit Text und Medien
tweet.retweetBeiträgeEs hat jemanden repostet; retweet_of trägt den Originalbeitrag vollständig
tweet.quoteBeiträgeEs hat jemanden zitiert; quoted trägt den zitierten Beitrag vollständig
tweet.editBeiträgeEs hat einen Beitrag bearbeitet; das Ereignis trägt die neue Fassung, edit_of die Fassung, die sie ersetzt
tweet.deleteBeiträgeEin Beitrag, den das Konto veröffentlicht hatte, ist verschwunden
profile.nameProfilAnzeigename geändert
profile.screen_nameProfilHandle geändert
profile.bioProfilBio geändert
profile.locationProfilStandort geändert
profile.urlProfilProfil-Link geändert
profile.avatarProfilAvatar geändert; old und new sind Bild-URLs
profile.bannerProfilBanner geändert; old und new sind Bild-URLs
profile.pinnedProfilAngepinnter Beitrag geändert; tweet und old_tweet tragen die Beiträge selbst
profile.verifiedProfilVerifizierungsabzeichen erschienen oder verschwunden
follow.addFolgt-GraphDas Konto folgt jetzt jemandem; user ist das vollständige Profil dieses Kontos
follow.removeFolgt-GraphDas Konto folgt jemandem nicht mehr
followers.verified.addFolgt-GraphEin verifiziertes Konto folgt ihm jetzt; user trägt Bio, Zähler, Standort, Beitrittsdatum
account.statusKontoDas Konto wurde geschützt, gesperrt oder nicht mehr sichtbar, oder ist wieder aktiv
search.matchSucheJemand hat etwas gepostet, das zu einem Ihrer Stichwörter passt; keyword sagt, zu welchem, author ist das vollständige Profil

X liefert keinen Zeitstempel für „folgt jetzt“ oder „hat einen Follower gewonnen“; bei diesen Ereignissen ist ts daher der Moment, in dem wir die Änderung bemerkt haben.

Sie müssen nicht jeden Typ von jedem Konto erhalten. Ereignistypen wählen zeigt, wie Sie nur einige erhalten, etwa nur neue verifizierte Follower.

Nutzlasten

Fünf Nutzlastformen decken alle achtzehn Typen ab.

Tweet-Nutzlast

Das d von tweet.create, tweet.reply, tweet.retweet und tweet.quote sowie die Basis von search.match.

FeldTypBedeutung
tweet_idstringDie ID des Beitrags, als Zeichenkette
kindtweet | reply | retweet | quoteWelche Art von Beitrag es ist
textstringVolltext (auch bei langen Beiträgen)
langstring | nullVon X erkannte Sprache
authorUserDas Konto, das es veröffentlicht hat, als vollständiger User – dasselbe Objekt wie der Autor eines search.match: Handle, Name, Bio, Avatar, Banner, Zähler, Verifizierung, Ort, Link und Beitrittsdatum. Auf einem schlanken ersten Frame das Konto wie zuletzt gelesen; das update trägt es so, wie es mit dem Beitrag gelesen wurde
reply_toBrief+ | nullBei Antworten: der beantwortete Beitrag – ein Brief plus screen_name, tweet_id und user_id seines Autors
retweet_ofBrief | nullBei Reposts: der Originalbeitrag
quotedBrief | nullBei Zitaten: der zitierte Beitrag
mediastring[]Einfache Bild-URLs, eine je Medienelement
media_itemsMedia[]Jedes Medienelement mit Typ, Videovarianten und Abmessungen
urlsstring[]Aufgelöste Links im Beitrag
articleArticle | nullBei Beiträgen, die auf einen X-Artikel verlinken: der Artikel
counts{reply, rt, like, quote, bookmark}Antwort-, Repost-, Like-, Zitat- und Lesezeichen-Zähler zum Zeitpunkt unseres Lesens
viewsint | nullAufrufzähler, wenn X ihn preisgibt
urlstringKanonischer Link zum Beitrag
fullboolfalse bei einem ersten, schlanken create-Frame; true, sobald das Ereignis den ganzen Beitrag trägt
kind_finalbooltrue, wenn kind feststeht. false nur auf einem schlanken ersten Frame, dessen kind tweet ist: Der Beitrag kann sich noch als Zitat herausstellen, das folgende update mit derselben id klärt es
kind_wastweet | null (update only)Nur im update, das die Art eines Beitrags festlegt, und nur, wenn der erste Frame etwas anderes sagte: die Art, die dieser Frame hatte (tweet bei einem Beitrag, der sich als Zitat herausstellte)
edit_ofBrief | nullBei tweet.edit: die Fassung, die diese ersetzt (ihre ID, sowie Text und Autor, wenn wir sie hatten)
Beispiel
{
  "v": 1,
  "t": "tweet.create",
  "op": "create",
  "id": "tweet:2097879002992070835",
  "ts": 1789012345678,
  "sid": "1789012346012-0",
  "target": {
    "id": "1652541",
    "screen_name": "Reuters",
    "name": "Reuters"
  },
  "d": {
    "tweet_id": "2097879002992070835",
    "kind": "tweet",
    "text": "Ash-covered shoes and a president in crisis…",
    "lang": "en",
    "author": {
      "id": "1652541",
      "screen_name": "Reuters",
      "name": "Reuters",
      "bio": "Top and breaking news, pictures and videos from Reuters.",
      "avatar": "https://pbs.twimg.com/profile_images/1874154135869616128/nJDmubGJ_normal.jpg",
      "banner": "https://pbs.twimg.com/profile_banners/1652541/1573687397",
      "followers": 25900000,
      "following": 1150,
      "tweets": 1080000,
      "location": "Around the world",
      "url": "https://www.reuters.com",
      "verified": true,
      "verified_type": "Business",
      "protected": false,
      "created_at": "2007-03-20T17:46:05Z",
      "category": null
    },
    "reply_to": null,
    "retweet_of": null,
    "quoted": null,
    "media": [
      "https://pbs.twimg.com/media/….jpg"
    ],
    "media_items": [
      {
        "type": "photo",
        "url": "https://pbs.twimg.com/media/….jpg",
        "expanded_url": "https://x.com/Reuters/status/2097879002992070835/photo/1",
        "width": 1200,
        "height": 675
      }
    ],
    "urls": [
      "https://reut.rs/…"
    ],
    "counts": {
      "reply": 12,
      "rt": 40,
      "like": 131,
      "quote": 3,
      "bookmark": 9
    },
    "views": 20411,
    "url": "https://x.com/Reuters/status/2097879002992070835",
    "full": true,
    "kind_final": true
  }
}

Ein erster create-Frame ist bewusst schlank: Er trägt die ID, den Autor (author, das Konto wie zuletzt gelesen) und den Text, der gekürzt sein kann, damit er in dem Moment abgehen kann, in dem der Beitrag gesehen wird; url zeigt bereits auf den Beitrag. In diesem Moment lässt sich ein Zitat nicht immer von einem Originalbeitrag unterscheiden, daher sagt ein solcher Frame tweet.create mit kind_final: false. Das folgende update mit derselben id trägt die vollständige Nutzlast oben und den festgelegten Typ: tweet.quote mit kind_was: "tweet", wenn es ein Zitat war.

derselbe Beitrag, wie er zuerst geliefert wurde, vor der Anreicherung
{
  "v": 1,
  "t": "tweet.create",
  "op": "create",
  "id": "tweet:2097879002992070835",
  "ts": 1789012345678,
  "sid": "1789012346012-0",
  "target": {
    "id": "1652541",
    "screen_name": "Reuters",
    "name": "Reuters"
  },
  "d": {
    "tweet_id": "2097879002992070835",
    "kind": "tweet",
    "text": "Ash-covered shoes and a president in crisis…",
    "author": {
      "id": "1652541",
      "screen_name": "Reuters",
      "name": "Reuters",
      "bio": "Top and breaking news, pictures and videos from Reuters.",
      "avatar": "https://pbs.twimg.com/profile_images/1874154135869616128/nJDmubGJ_normal.jpg",
      "banner": "https://pbs.twimg.com/profile_banners/1652541/1573687397",
      "followers": 25900000,
      "following": 1150,
      "tweets": 1080000,
      "location": "Around the world",
      "url": "https://www.reuters.com",
      "verified": true,
      "verified_type": "Business",
      "protected": false,
      "created_at": "2007-03-20T17:46:05Z",
      "category": null
    },
    "url": "https://x.com/Reuters/status/2097879002992070835",
    "full": false,
    "kind_final": false
  }
}

Lösch-Nutzlast

Das d von tweet.delete. Wird nur für einen Beitrag gesendet, den wir gesehen hatten und der jetzt weg ist. Sein ts ist der Zeitpunkt, zu dem die Löschung erkannt wurde; die Zeit des Beitrags selbst steht in seinem früheren create-Frame.

FeldTypBedeutung
tweet_idstringDie ID des gelöschten Beitrags
urlstringWo er früher war
Beispiel
{
  "v": 1,
  "t": "tweet.delete",
  "op": "delete",
  "id": "tweet:2097879002992070835:delete",
  "ts": 1789012345678,
  "sid": "…",
  "target": {
    "id": "1652541",
    "screen_name": "Reuters",
    "name": "Reuters"
  },
  "d": {
    "tweet_id": "2097879002992070835",
    "url": "https://x.com/Reuters/status/2097879002992070835"
  }
}

Profiländerungs-Nutzlast

Das d jedes profile.*-Ereignisses. op ist hier update.

FeldTypBedeutung
fieldstringWelches Profilfeld sich geändert hat; dasselbe Wort wie nach profile. im Typ
oldanyDer vorherige Wert
newanyDer neue Wert
tweetBrief (pinned only)Bei profile.pinned: der neu angepinnte Beitrag
old_tweetBrief (pinned only)Bei profile.pinned: der zuvor angepinnte Beitrag, falls wir ihn hatten
Beispiel
{
  "v": 1,
  "t": "profile.bio",
  "op": "update",
  "id": "profile:1652541:bio:9c1d2e3f4a5b",
  "ts": 1789012400000,
  "sid": "…",
  "target": {
    "id": "1652541",
    "screen_name": "Reuters",
    "name": "Reuters"
  },
  "d": {
    "field": "bio",
    "old": "Top news and analysis from around the world.",
    "new": "Top news, analysis and video from around the world."
  }
}

Folgt-Nutzlast

Das d von follow.add, follow.remove und followers.verified.add.

FeldTypBedeutung
userUserDas andere Konto, als vollständiger User
Beispiel
{
  "v": 1,
  "t": "follow.add",
  "op": "create",
  "id": "follow:44196397:12:add:496948",
  "ts": 1789012400000,
  "sid": "…",
  "target": {
    "id": "44196397",
    "screen_name": "elonmusk",
    "name": "Elon Musk"
  },
  "d": {
    "user": {
      "id": "12",
      "screen_name": "jack",
      "name": "jack",
      "bio": "…",
      "avatar": "https://pbs.twimg.com/profile_images/…",
      "banner": null,
      "followers": 6400000,
      "following": 4200,
      "tweets": 29000,
      "location": "",
      "url": null,
      "verified": true,
      "verified_type": "blue",
      "protected": false,
      "created_at": "2006-03-21T20:50:14Z",
      "category": null
    }
  }
}

Kontostatus-Nutzlast

Das d von account.status. Ein Status ist active, protected (Beiträge nur für bestätigte Follower sichtbar), suspended (von X gesperrt) oder unavailable (deaktiviert, gelöscht oder aus anderem Grund nicht sichtbar). ts ist der Zeitpunkt, zu dem wir die Änderung erkannt haben.

FeldTypBedeutung
oldactive | protected | suspended | unavailableDer Status vorher
newactive | protected | suspended | unavailableDer Status jetzt
reasonstring | nullDer Wortlaut von X, falls vorhanden (zum Beispiel Suspended)
Beispiel
{
  "v": 1,
  "t": "account.status",
  "op": "update",
  "id": "account:9000002:status:active>suspended:497010",
  "ts": 1789236000000,
  "sid": "…",
  "target": {
    "id": "9000002",
    "screen_name": "some_account",
    "name": "Some Account"
  },
  "d": {
    "old": "active",
    "new": "suspended",
    "reason": "Suspended"
  }
}

Das d von search.match: eine Tweet-Nutzlast plus drei Felder zum Treffer. Das target des Umschlags ist der Autor des Beitrags, der keines Ihrer Ziele sein muss.

FeldTypBedeutung
keyword.idintID des passenden Stichworts
keyword.querystringSeine Suchanfrage
keyword.labelstring | nullSein Label, falls Sie eines gesetzt haben
authorUserDas vollständige Profil des Autors
author_is_targetbooltrue, wenn der Autor zugleich ein auf diesem System überwachtes Konto ist
…TweetPayloadJedes Feld der Tweet-Nutzlast
Beispiel
{
  "v": 1,
  "t": "search.match",
  "op": "create",
  "id": "search:12:2097900000000000000",
  "ts": 1789012500000,
  "sid": "…",
  "target": {
    "id": "9000001",
    "screen_name": "some_trader",
    "name": "Some Trader"
  },
  "d": {
    "tweet_id": "2097900000000000000",
    "kind": "tweet",
    "text": "$SOL breaking out…",
    "lang": "en",
    "author": {
      "id": "9000001",
      "screen_name": "some_trader",
      "name": "Some Trader",
      "bio": "…",
      "followers": 1200,
      "verified": false,
      "…": "…"
    },
    "keyword": {
      "id": 12,
      "query": "($SOL OR \"Solana\") -filter:retweets",
      "label": "solana"
    },
    "author_is_target": false,
    "media": [],
    "media_items": [],
    "urls": [],
    "url": "https://x.com/some_trader/status/2097900000000000000",
    "full": true
  }
}