Événements

Enveloppe

Chaque événement a la même enveloppe ; d porte la charge utile propre au type, décrite ci-dessous.

ChampTypeSignification
vintVersion de l'enveloppe. 1 aujourd'hui
tstringType d'événement, d'après le tableau ci-dessous
opcreate | update | deletecreate, update (enrichissement du même id) ou delete
idstringIdentité stable. Dédupliquez sur ce champ
tsint (ms)Quand cela s'est produit sur X, en ms depuis l'epoch. X ne donne pas le moment d'un changement de profil, d'un abonnement ou désabonnement, d'un nouvel abonné vérifié ni d'une suppression de publication : pour ces événements, c'est le moment où nous l'avons détecté
sidstringPosition dans le flux pour le rejeu ; présent sur le flux et dans l'historique
target.idstringIdentifiant X numérique du compte surveillé (pour search.match, celui de l'auteur de la publication)
target.screen_namestringNom d'utilisateur du compte surveillé
target.namestringLe nom affiché du compte
dobjectCharge utile propre au type

Types d'événements

TypeCatégorieSignification
tweet.createPublicationsLe compte a publié quelque chose de nouveau
tweet.replyPublicationsIl a répondu à quelqu'un ; reply_to porte la publication à laquelle il répond, avec son texte et ses médias
tweet.retweetPublicationsIl a republié quelqu'un ; retweet_of porte la publication originale en entier
tweet.quotePublicationsIl a cité quelqu'un ; quoted porte la publication citée en entier
tweet.editPublicationsIl a modifié une publication ; l'événement porte la nouvelle version, et edit_of la version qu'elle remplace
tweet.deletePublicationsUne publication que le compte avait publiée a disparu
profile.nameProfilLe nom affiché a changé
profile.screen_nameProfilLe nom d'utilisateur a changé
profile.bioProfilLa bio a changé
profile.locationProfilLa localisation a changé
profile.urlProfilLe lien du profil a changé
profile.avatarProfilL'avatar a changé ; old et new sont des URL d'images
profile.bannerProfilLa bannière a changé ; old et new sont des URL d'images
profile.pinnedProfilLa publication épinglée a changé ; tweet et old_tweet portent les publications elles-mêmes
profile.verifiedProfilLe badge de certification est apparu ou a disparu
follow.addGraphe d'abonnementsLe compte a commencé à suivre quelqu'un ; user est le profil complet de ce compte
follow.removeGraphe d'abonnementsLe compte a cessé de suivre quelqu'un
followers.verified.addGraphe d'abonnementsUn compte certifié a commencé à le suivre ; user porte bio, compteurs, localisation, date d'inscription
account.statusCompteLe compte est devenu protégé, suspendu ou indisponible, ou de nouveau actif
search.matchRechercheQuelqu'un a publié quelque chose correspondant à l'un de vos mots-clés ; keyword dit lequel, author est son profil complet

X ne fournit aucun horodatage pour « a commencé à suivre » ou « a gagné un abonné » ; pour ces événements, ts est donc le moment où nous avons détecté le changement.

Vous n'êtes pas obligé de recevoir tous les types de tous les comptes. Choisir les types d'événement explique comment n'en recevoir que certains, par exemple seulement les nouveaux abonnés vérifiés.

Charges utiles

Cinq formes de charge utile couvrent les dix-huit types.

Charge utile Tweet

Le d de tweet.create, tweet.reply, tweet.retweet et tweet.quote, et la base de search.match.

ChampTypeSignification
tweet_idstringL'identifiant de la publication, sous forme de chaîne
kindtweet | reply | retweet | quoteDe quel genre de publication il s'agit
textstringTexte intégral (publications longues comprises)
langstring | nullLangue détectée par X
authorUserLe compte qui l'a publié, en User complet — le même objet que l'auteur d'un search.match : nom d'utilisateur, nom, bio, avatar, bannière, compteurs, vérification, localisation, lien et date d'inscription. Sur une première trame allégée, c'est le compte tel que lu en dernier ; l'update le porte tel que lu avec la publication
reply_toBrief+ | nullPour les réponses : la publication à laquelle on répond — un Brief plus screen_name, tweet_id et user_id de son auteur
retweet_ofBrief | nullPour les republications : la publication originale
quotedBrief | nullPour les citations : la publication citée
mediastring[]URL d'images simples, une par élément média
media_itemsMedia[]Chaque élément média avec son type, ses variantes vidéo et ses dimensions
urlsstring[]Liens développés dans la publication
articleArticle | nullPour les publications qui renvoient vers un article X : l'article
counts{reply, rt, like, quote, bookmark}Nombre de réponses, republications, j'aime, citations et signets au moment de notre lecture
viewsint | nullNombre de vues, quand X l'expose
urlstringLien canonique vers la publication
fullboolfalse sur une première trame create allégée ; true une fois que l'événement porte la publication entière
kind_finalbooltrue quand kind est définitif. false seulement sur une première trame allégée dont le kind est tweet : la publication peut encore se révéler être une citation, et l'update sur le même id tranche
kind_wastweet | null (update only)Seulement sur l'update qui fixe le type d'une publication, et seulement si la première trame disait autre chose : le type qu'avait cette trame (tweet pour une publication qui s'est révélée être une citation)
edit_ofBrief | nullSur tweet.edit : la version que celle-ci remplace (son identifiant, et son texte et son auteur quand nous les avions)
exemple
{
  "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
  }
}

Une première trame create est volontairement allégée : elle porte l'identifiant, l'auteur (author, le compte tel que lu en dernier) et le texte, éventuellement raccourci, afin de pouvoir partir dès que la publication est vue ; url pointe déjà vers la publication. À ce moment, une citation ne se distingue pas toujours d'une publication originale : une telle trame indique donc tweet.create avec kind_final: false. L'update qui suit sur le même id porte la charge complète ci-dessus et le type définitif : tweet.quote avec kind_was: "tweet" s'il s'agissait d'une citation.

la même publication telle qu'elle a été livrée en premier, avant enrichissement
{
  "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
  }
}

Charge utile de suppression

Le d de tweet.delete. Envoyé uniquement pour une publication que nous avions vue et qui a maintenant disparu. Son ts est le moment où la suppression a été détectée ; l'heure de la publication elle-même figure dans sa trame create antérieure.

ChampTypeSignification
tweet_idstringL'identifiant de la publication supprimée
urlstringOù elle se trouvait
exemple
{
  "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"
  }
}

Charge utile de changement de profil

Le d de chaque événement profile.*. op vaut update pour ceux-ci.

ChampTypeSignification
fieldstringQuel champ du profil a changé ; le même mot que celui qui suit profile. dans le type
oldanyLa valeur précédente
newanyLa nouvelle valeur
tweetBrief (pinned only)Pour profile.pinned : la publication nouvellement épinglée
old_tweetBrief (pinned only)Pour profile.pinned : la publication épinglée précédente, si nous l'avions
exemple
{
  "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."
  }
}

Charge utile d'abonnement

Le d de follow.add, follow.remove et followers.verified.add.

ChampTypeSignification
userUserL'autre compte, sous forme d'Utilisateur complet
exemple
{
  "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
    }
  }
}

Charge de statut du compte

Le d de account.status. Un statut vaut active, protected (publications visibles des seuls abonnés approuvés), suspended (par X) ou unavailable (désactivé, supprimé ou invisible pour une autre raison). ts est le moment où nous avons détecté le changement.

ChampTypeSignification
oldactive | protected | suspended | unavailableLe statut d'avant
newactive | protected | suspended | unavailableLe statut actuel
reasonstring | nullLe libellé de X, s'il en donne un (par exemple Suspended)
exemple
{
  "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"
  }
}

Le d de search.match : une charge utile Tweet plus trois champs sur la correspondance. Le target de l'enveloppe est l'auteur de la publication, qui n'est pas nécessairement l'une de vos cibles.

ChampTypeSignification
keyword.idintIdentifiant du mot-clé qui a correspondu
keyword.querystringSa requête
keyword.labelstring | nullSon libellé, si vous en avez défini un
authorUserLe profil complet de l'auteur
author_is_targetbooltrue si l'auteur est aussi un compte surveillé sur ce système
…TweetPayloadTous les champs de la charge utile Tweet
exemple
{
  "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
  }
}