Passer au contenu principal

Account Activity API v2

L’Account Activity API v2 est désormais disponible sur Pro !

Présentation

L’Account Activity API (AAA) permet de recevoir en temps réel des événements liés aux comptes d’utilisateurs X via des webhooks. En inscrivant des comptes d’utilisateurs spécifiques à un webhook préconfiguré, votre application peut être informée de diverses activités telles que des Posts, des Messages privés, des likes, des abonnements, des blocages, et plus encore, provenant d’un ou plusieurs de vos comptes détenus ou suivis, le tout via une seule connexion.
Cette API est couramment utilisée pour créer des applications qui doivent réagir instantanément aux actions des utilisateurs ou maintenir un état à jour basé sur l’activité des utilisateurs. Vous recevrez toutes les activités pertinentes listées ci-dessous pour chaque abonnement d’utilisateur lors de l’enregistrement de votre webhook :

Types d’activité

  • Posts (par l’utilisateur)
  • Suppressions de Post (par l’utilisateur)
  • @mentions (de l’utilisateur)
  • Réponses (à ou de l’utilisateur)
  • Reposts (par l’utilisateur ou concernant l’utilisateur)
  • Posts cités (par l’utilisateur ou concernant l’utilisateur)
  • Reposts de Posts cités (par l’utilisateur ou concernant l’utilisateur)
  • Likes (par l’utilisateur ou concernant l’utilisateur)
  • Abonnements (par l’utilisateur ou concernant l’utilisateur)
  • Désabonnements (par l’utilisateur ou concernant l’utilisateur)
  • Blocages (par l’utilisateur ou concernant l’utilisateur)
  • Déblocages (par l’utilisateur ou concernant l’utilisateur)
  • Mises en sourdine (par l’utilisateur ou concernant l’utilisateur)
  • Réactivations du son (par l’utilisateur ou concernant l’utilisateur)
  • Messages privés envoyés (par l’utilisateur)
  • Messages privés reçus (par l’utilisateur)
  • Indicateurs de saisie (à l’attention de l’utilisateur)
  • Accusés de lecture (à l’attention de l’utilisateur)
  • Révocations d’abonnement (par l’utilisateur)
Remarque : Nous ne livrons pas les données du fil d’accueil via l’Account Activity API. Utilisez l’endpoint User Posts timeline by User ID pour extraire ces data.

Présentation des fonctionnalités

NiveauTarificationNombre d’abonnements uniquesNombre de webhooks
Pro5 000 $ par mois31
EnterpriseContacter les ventes5 000+5+
Ce document explique la gestion des abonnements d’utilisateurs associés à vos webhooks à l’aide des endpoints v2 de l’Account Activity API.

Gérer les abonnements

L’Account Activity API envoie des messages JSON via webhook dès qu’un événement est associé à des comptes X abonnés à votre service. X transmet ces activités à votre webhook enregistré. Dans les étapes suivantes, vous apprendrez à configurer et à gérer les abonnements pour des comptes d’utilisateur.

1. Créer une X App

Créez une X App avec un compte développeur approuvé depuis le developer portal. Si vous créez l’App au nom de votre entreprise, utilisez un compte X professionnel.
  • Activez « Read, Write, and Access direct messages » dans l’onglet Permissions de la page de votre App.
  • Dans l’onglet « Keys and Access Tokens », notez la Consumer Key (API Key), le Consumer Token (API Secret) et le Jeton Bearer de votre App.
  • Générez l’Access Token et l’Access Token Secret de votre App. Ceux-ci sont nécessaires pour vous abonner à des comptes utilisateur.
  • Consultez Obtaining Access Tokens si vous n’êtes pas familier avec X Sign-in et les contextes utilisateur.
  • Notez l’id numérique de votre App depuis la page « Apps » dans le developer portal. Ceci est requis lors de la demande d’accès à l’Account Activity API.

2. Obtenir l’accès à l’Account Activity API

L’Account Activity API est disponible uniquement sur l’offre Enterprise. Envoyez une demande d’accès à l’Enterprise via le developer portal.

3. Enregistrer un webhook

Pour recevoir des événements Account Activity, vous devez enregistrer un webhook avec une URL HTTPS accessible publiquement. Consultez la documentation de l’API Webhooks v2 pour en savoir plus sur le développement d’une App consommatrice de webhook, l’enregistrement d’un webhook, sa sécurisation et la gestion des Challenge-Response Checks (CRC).
  • Assurez-vous que votre webhook est configuré pour accepter des requêtes POST avec des charges utiles d’événements encodées en JSON.
  • Récupérez le webhook_id depuis la réponse d’enregistrement du webhook, car il est requis pour gérer les abonnements.

4. Valider la configuration

Pour vérifier que votre App et votre webhook sont correctement configurés :
  • Abonnez un compte utilisateur à votre webhook (voir « Ajouter un abonnement » ci-dessous).
  • Ajoutez en favori un Post publié par l’un des comptes X auxquels votre App est abonnée.
  • Vous devriez recevoir une payload favorite_events via une requête POST vers l’URL de votre webhook.
  • Remarque : La livraison des événements peut prendre jusqu’à 10 secondes après l’ajout d’un abonnement.

Notes importantes

  • Authentification: Lors de l’inscription des utilisateurs, utilisez la consumer key, la consumer secret, l’access token et l’access token secret du compte de l’utilisateur.
  • Messages privés: Tous les Messages privés entrants et sortants (envoyés via POST /2/dm_conversations/with/:participant_id/messages) sont transmis via des webhooks afin que votre App reste informée de toute l’activité de MP.
  • Duplication d’événements:
    • Si deux utilisateurs abonnés participent à la même conversation de MP, votre webhook reçoit des événements en double (un par utilisateur). Utilisez le champ for_user_id pour les distinguer.
    • Si plusieurs Apps partagent la même URL de webhook et le même utilisateur, les événements sont envoyés plusieurs fois (une fois par App).
    • Votre App doit dédupliquer les événements à l’aide de l’id de l’événement pour gérer les doublons occasionnels.
  • Exemple de code: Consultez Account Activity API Setup pour une application web qui affiche les événements de webhook.

Gestion des utilisateurs abonnés (API v2)

Une fois que vous avez un webhook enregistré avec un webhook_id valide, vous pouvez gérer les abonnements des utilisateurs pour recevoir l’activité de leur compte. Utilisez les endpoints suivants pour ajouter, consulter ou supprimer des abonnements. Endpoint: POST /2/account_activity/webhooks/:webhook_id/subscriptions/all
Description: Abonne l’utilisateur authentifié à la réception d’événements via le webhook spécifié.
Authentication: OAuthUser (flux OAuth à 3 étapes requis, représentant l’utilisateur à abonner).
  • Consumer Key: p. ex. xvz1evFS…
  • Access Token: p. ex. 370773112-GmHxMAgYyLbN…
Path Parameters:
ParameterDescription
webhook_idL’id du webhook auquel associer l’abonnement.
Request:
bash
curl --request POST --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all' \
--header 'authorization: OAuth oauth_consumer_key="<CONSUMER_KEY>", oauth_nonce="GENERATED", oauth_signature="GENERATED", oauth_signature_method="HMAC-SHA1", oauth_timestamp="GENERATED", oauth_token="<ACCESS_TOKEN>", oauth_version="1.0"'
Réponses :
  • Succès (200 OK) :
  • JSON
{
  "data": {
    "subscribed": true
  }
}
  • Échec (400 Bad Request):
RaisonDescription
WebhookIdInvalidLe webhook_id fourni est introuvable ou n’est pas associé à l’App.
DuplicateSubscriptionFailedUn abonnement pour cet utilisateur existe déjà pour le webhook_id spécifié.
SubscriptionLimitExceededL’application a atteint sa limite d’abonnements sur l’ensemble des webhooks.

Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all
Description: Vérifie si l’utilisateur authentifié est abonné au webhook spécifié.
Authentication: OAuthUser (flux OAuth à 3 étapes requis).
Path Parameters:
ParameterDescription
webhook_idL’id du webhook à contrôler.
Request:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all' \
--header 'authorization: OAuth oauth_consumer_key="<CONSUMER_KEY>", oauth_nonce="GENERATED", oauth_signature="GENERATED", oauth_signature_method="HMAC-SHA1", oauth_timestamp="GENERATED", oauth_token="<ACCESS_TOKEN>", oauth_version="1.0"'
Réponses :
  • Réussite (200 OK) :
  • JSON
{
  "data": {
    "subscribed": true // ou false
  }
}
  • Échec (400 Bad Request):
MotifDescription
WebhookIdInvalidLe webhook_id fourni est introuvable ou n’est pas associé à l’App.

Endpoint: DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
Description: Désactive l’abonnement pour un id utilisateur spécifique et arrête la livraison des événements au webhook.
Authentication: OAuth2 App only Jeton Bearer.
  • Jeton Bearer: p. ex., AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn…
Paramètres de chemin:
ParamètreDescription
webhook_idL’id du webhook contenant l’abonnement.
user_idL’id numérique de l’utilisateur à désabonner.
Requête:
bash
curl --request DELETE --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/:USER_ID/all' \
--header 'authorization: Bearer <BEARER_TOKEN>'
Réponses :
  • Succès (200 OK) :
  • JSON
{
  "data": {
    "subscribed": false
  }
}
  • Échec (400 Bad Request):
RaisonDescription
SubscriptionNotFoundAucun abonnement n’existe pour le user_id spécifié sur le webhook_id indiqué.
WebhookIdInvalidLe webhook_id fourni est introuvable ou n’est pas associé à l’App.
Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
Description: Récupère la liste de tous les id d’utilisateurs actuellement abonnés au webhook spécifié.
Authentication: OAuth2 App only Jeton Bearer.
Path Parameters:
ParameterDescription
webhook_idL’id du webhook pour lequel lister les abonnements.
Request:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all/list' \
--header 'authorization: Bearer <BEARER_TOKEN>'
Réponses :
  • Réussite (200 OK) :
  • json
{
  "data": {
    "application_id": "<votre id d'App>",
    "webhook_id": "<id du webhook>",
    "webhook_url": "<l'URL de callback du webhook>",
    "subscriptions": [
      { "user_id": "<user_id_1>" },
      { "user_id": "<user_id_2>" }
    ]
  }
}
  • Échec (400 Bad Request):
MotifDescription
WebhookIdInvalidLe webhook_id fourni est introuvable ou n’est pas associé à l’App.

Endpoint: GET /2/account_activity/subscriptions/count
Description: Renvoie le nombre total d’abonnements actifs ainsi que la limite provisionnée pour l’App d’authentification.
Authentication: OAuth2 App only Jeton Bearer.
Request:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/subscriptions/count' \
--header 'authorization: Bearer <BEARER_TOKEN>'
Réponses :
  • Succès (200 OK) :
  • JSON
{
  "data": {
    "account_name": "<nom de votre application>",
    "provisioned_count": "<limite d'abonnement allouée>",
    "subscriptions_count_all": "<nombre d'abonnements actifs actuels>",
    "subscriptions_count_direct_messages": "0" // Les abonnements aux messages privés uniquement ne sont plus pris en charge
  }
}
AAAv2 propose une fonctionnalité de relecture qui vous permet de récupérer des événements passés sur une plage de temps spécifiée et de les renvoyer à votre webhook. Cela est utile pour rattraper des événements manqués en raison d’une indisponibilité. Endpoint: POST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all Description: Lance un travail de relecture Authentication: OAuth2 App only Jeton Bearer Path Parameters:
ParameterDescription
webhook_idL’id du webhook pour lequel démarrer la relecture
Query Parameters:
ParameterDescription
from_dateL’horodatage UTC le plus ancien (début) à partir duquel les événements seront fournis, au format ‘yyyymmddhhmm’. La granularité est à la minute et l’intervalle est inclusif (p. ex., 12:00 inclut la minute 00). Les heures valides doivent se situer dans les dernières 24 heures, en UTC, et ne pas être plus récentes que 31 minutes avant le moment présent. Il est recommandé que from_date et to_date soient espacés d’environ 2 heures.
to_dateL’horodatage UTC le plus récent (fin) jusqu’auquel les événements seront fournis, au format ‘yyyymmddhhmm’. La granularité est à la minute et l’intervalle est exclusif (p. ex., 12:30 n’inclut pas la 30e minute de l’heure). Les heures valides doivent se situer dans les dernières 24 heures, en UTC, et être au moins 10 minutes avant le moment présent.
Responses: Succès:
200

{
  "for_user_id": "<USER_ID>"
  "replay_event": {
    "job_id": <REPLAY_JOB_ID>",
    "created_at": "aaaa-mm-jjThh:mm:ss.000Z"
  }
}
Échecs :
RaisonDescription
QueryParamInvalidfrom_date est antérieur de plus de 24 heures par rapport à l’heure actuelle.
QueryParamInvalidfrom_date est plus récent que to_date.
QueryParamInvalidfrom_date est dans le futur.
QueryParamInvalidto_date est dans le futur.
QueryParamInvalidfrom_date ou to_date n’est pas au format correct.
CrcValidationFailedRéponse incorrecte reçue depuis l’URL du webhook lors de la validation CRC.
ReplayConflictErrorUne tâche de relecture est déjà en cours pour le webhook spécifié.
WebhookIdInvalidLe webhook_id fourni est invalide ou n’est pas associé à l’App.

Messages de fin de tâche

Une fois votre tâche de relecture exécutée avec succès, X enverra l’événement de fin de tâche suivant. Dès que vous recevez cet événement, la tâche est terminée et vous pouvez en soumettre une autre.
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Complete",
    "job_state_description": "Tâche terminée avec succès",
    "job_id": "<JOB_ID>"
  }
}
Si votre job n’aboutit pas, nous renverrons le message suivant vous invitant à relancer votre Replay Job. Dès réception de cet événement, l’exécution du job est terminée et vous pouvez en soumettre un autre.
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Incomplete",
    "job_state_description": "La tâche n'a pas réussi à livrer tous les événements, veuillez relancer votre tâche de relecture",
    "job_id": "<JOB_ID>"
  }
}

Structure de l’objet de données d’activité de compte

ObjetDétails
for_user_idIdentifie l’abonnement utilisateur auquel l’événement est lié.
is_blocked_by(Conditionnel) Affiché uniquement pour les événements de mention de Post si l’utilisateur qui mentionne est bloqué par l’utilisateur abonné.
sourceL’utilisateur qui réalise l’activité (par exemple, l’utilisateur qui suit, bloque ou met en sourdine).
targetL’utilisateur auquel s’applique l’activité (par exemple, l’utilisateur suivi, bloqué ou mis en sourdine).

Activités disponibles

Type de messageDétails
tweet_create_eventsStatut de Post pour les Posts, Retweets, réponses, @mentions, Tweets cités ou Retweets de Tweets cités.
favorite_eventsÉvénement de like avec l’utilisateur et la cible.
follow_eventsÉvénement de suivi avec l’utilisateur et la cible.
unfollow_eventsÉvénement de désabonnement avec l’utilisateur et la cible.
block_eventsÉvénement de blocage avec l’utilisateur et la cible.
unblock_eventsÉvénement de déblocage avec l’utilisateur et la cible.
mute_eventsÉvénement de mise en sourdine avec l’utilisateur et la cible.
unmute_eventsÉvénement de réactivation du son avec l’utilisateur et la cible.
user_eventÉvénements de révocation lorsqu’un utilisateur retire l’autorisation de l’App (abonnement automatiquement supprimé).
direct_message_eventsStatut de DM pour les messages envoyés ou reçus.
direct_message_indicate_typing_eventsÉvénement de saisie en DM avec l’utilisateur et la cible.
direct_message_mark_read_eventsÉvénement de lecture en DM avec l’utilisateur et la cible.
tweet_delete_eventsNotification de Posts supprimés à des fins de conformité.
spaces_eventsActuellement non pris en charge. Bientôt disponible.

Exemples de charges utiles

Vous trouverez ci-dessous des exemples de charges utiles pour chaque événement Account Activity.

tweet_create_events (Posts, Retweets, Réponses, Tweets cités)

{
  "for_user_id": "2244994945",
  "tweet_create_events": [
    {
      <Objet Tweet>
    }
  ]
}

tweet_create_events (@mentions)

{
  "for_user_id": "2244994945",
  "user_has_blocked": "false",
  "tweet_create_events": [
    {
      <Objet Tweet>
    }
  ]
}

événements_favoris

{
  "for_user_id": "2244994945",
  "favorite_events": [{
    "id": "a7ba59eab0bfcba386f7acedac279542",
    "created_at": "Mon Mar 26 16:33:26 +0000 2018",
    "timestamp_ms": 1522082006140,
    "favorited_status": {
      <Objet Tweet>
    },
    "user": {
      <Objet utilisateur>
    }
  }]
}

follow_events

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "follow",
    "created_timestamp": "1517588749178",
    "target": {
      <Objet utilisateur>
    },
    "source": {
      <Objet utilisateur>
    }
  }]
}

unfollow_events

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "unfollow",
    "created_timestamp": "1517588749178",
    "target": {
      <Objet utilisateur>
    },
    "source": {
      <Objet utilisateur>
    }
  }]
}

block_events

{
  "for_user_id": "2244994945",
  "block_events": [{
    "type": "block",
    "created_timestamp": "1518127020304",
    "source": {
      <Objet utilisateur>
    },
    "target": {
      <Objet utilisateur>
    }
  }]
}

unblock_events

{
  "for_user_id": "2244994945",
  "block_events": [{
    "type": "unblock",
    "created_timestamp": "1518127020304",
    "source": {
      <Objet utilisateur>
    },
    "target": {
      <Objet utilisateur>
    }
  }]
}

mute_events

{
  "for_user_id": "2244994945",
  "mute_events": [
    {
      "type": "mute",
      "created_timestamp": "1518127020304",
      "source": {
        <Objet utilisateur>
      },
      "target": {
        <Objet utilisateur>
      }
    }
  ]
}

unmute_events

{
  "for_user_id": "2244994945",
  "mute_events": [
    {
      "type": "unmute",
      "created_timestamp": "1518127020304",
      "source": {
        <Objet utilisateur>
      },
      "target": {
        <Objet utilisateur>
      }
    }
  ]
}

user_event

{
  "user_event": {
    "revoke": {
      "date_time": "2018-05-24T09:48:12+00:00",
      "target": {
        "app_id": "13090192"
      },
      "source": {
        "user_id": "63046977"
      }
    }
  }
}

direct_message_events

{
  "for_user_id": "4337869213",
  "direct_message_events": [{
    "type": "message_create",
    "id": "954491830116155396",
    "created_timestamp": "1516403560557",
    "message_create": {
      "target": {
        "recipient_id": "4337869213"
      },
      "sender_id": "3001969357",
      "source_app_id": "13090192",
      "message_data": {
        "text": "Bonjour le monde !",
        "entities": {
          "hashtags": [],
          "symbols": [],
          "user_mentions": [],
          "urls": []
        }
      }
    }
  }],
  "apps": {
    "13090192": {
      "id": "13090192",
      "name": "FuriousCamperTestApp1",
      "url": "https://x.com/furiouscamper"
    }
  },
  "users": {
    "3001969357": {
      "id": "3001969357",
      "created_timestamp": "1422556069340",
      "name": "Jordan Brinks",
      "screen_name": "furiouscamper",
      "location": "Boulder, CO",
      "description": "Alter Ego - X PE les opinions sont les miennes",
      "url": "https://t.co/SnxaA15ZuY",
      "protected": false,
      "verified": false,
      "followers_count": 22,
      "friends_count": 45,
      "statuses_count": 494,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/851526626785480705/cW4WTi7C_normal.jpg"
    },
    "4337869213": {
      "id": "4337869213",
      "created_timestamp": "1448312972328",
      "name": "Harrison Test",
      "screen_name": "Harris_0ff",
      "location": "Burlington, MA",
      "protected": false,
      "verified": false,
      "followers_count": 8,
      "friends_count": 8,
      "statuses_count": 240,
      "profile_image_url_https": "https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png"
    }
  }
}

direct_message_indicate_typing_events

{
  "for_user_id": "4337869213",
  "direct_message_indicate_typing_events": [{
    "created_timestamp": "1518127183443",
    "sender_id": "3284025577",
    "target": {
      "recipient_id": "3001969357"
    }
  }],
  "users": {
    "3001969357": {
      "id": "3001969357",
      "created_timestamp": "1422556069340",
      "name": "Jordan Brinks",
      "screen_name": "furiouscamper",
      "location": "Boulder, CO",
      "description": "Alter Ego - X PE opinions personnelles",
      "url": "https://t.co/SnxaA15ZuY",
      "protected": false,
      "verified": false,
      "followers_count": 23,
      "friends_count": 47,
      "statuses_count": 509,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/851526626785480705/cW4WTi7C_normal.jpg"
    },
    "3284025577": {
      "id": "3284025577",
      "created_timestamp": "1437281176085",
      "name": "Bogus Bogart",
      "screen_name": "bogusbogart",
      "protected": true,
      "verified": false,
      "followers_count": 1,
      "friends_count": 4,
      "statuses_count": 35,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/763383202857779200/ndvZ96mE_normal.jpg"
    }
  }
}

direct_message_mark_read_events

{
  "for_user_id": "4337869213",
  "direct_message_mark_read_events": [{
    "created_timestamp": "1518452444662",
    "sender_id": "199566737",
    "target": {
      "recipient_id": "3001969357"
    },
    "last_read_event_id": "963085315333238788"
  }],
  "users": {
    "199566737": {
      "id": "199566737",
      "created_timestamp": "1286429788000",
      "name": "Le Braat",
      "screen_name": "LeBraat",
      "location": "Denver, CO",
      "description": "données le jour @X, design le soir",
      "protected": false,
      "verified": false,
      "followers_count": 299,
      "friends_count": 336,
      "statuses_count": 752,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/936652894371119105/YHEozVAg_normal.jpg"
    },
    "3001969357": {
      "id": "3001969357",
      "created_timestamp": "1422556069340",
      "name": "Jordan Brinks",
      "screen_name": "furiouscamper",
      "location": "Boulder, CO",
      "description": "Alter Ego - X PE mes-opinions-personnelles",
      "url": "https://t.co/SnxaA15ZuY",
      "protected": false,
      "verified": false,
      "followers_count": 23,
      "friends_count": 48,
      "statuses_count": 510,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/851526626785480705/cW4WTi7C_normal.jpg"
    }
  }
}

tweet_delete_events

{
  "for_user_id": "930524282358325248",
  "tweet_delete_events": [
    {
      "status": {
        "id": "1045405559317569537",
        "user_id": "930524282358325248"
      },
      "timestamp_ms": "1432228155593"
    }
  ]
}

Prise en charge des Posts longs

L’API Account Activity v2 prend désormais en charge les Posts longs, c’est‑à‑dire les Posts dépassant 280 caractères. Lorsqu’un Post long est inclus dans une charge utile tweet_create_events, le champ text contient les 140 premiers caractères (ou moins) et le champ truncated est défini sur true. Le contenu complet du Post est fourni dans l’objet extended_tweet, qui inclut :
  • full_text : le texte complet du Post, y compris tous les caractères au‑delà de la limite de 280 caractères.
  • entities : toutes les entités (par exemple, hashtags, URL, mentions d’utilisateurs, symboles) apparaissant dans le texte complet, y compris celles après le 280e caractère.
  • display_text_range : l’intervalle de caractères à afficher, en tenant compte du texte complet.
Cela garantit que les applications peuvent traiter l’intégralité du contenu des Posts longs, y compris les mentions ou autres entités qui apparaissent plus loin dans le texte. Ci‑dessous se trouve un exemple de charge utile tweet_create_events pour un Post long :
{
  "for_user_id": "1603419180975409153",
  "tweet_create_events": [
    {
      "created_at": "Mon May 19 14:01:46 +0000 2025",
      "id": 1924465506158879000,
      "id_str": "1924465506158878979",
      "text": "Le Mécanisme d'Anticythère : Une fenêtre sur l'ingéniosité antique Découvert en 1901 parmi les débris d'un navire romain de… https://t.co/bzbEKj8cd8",
      "display_text_range": [
        0,
        140
      ],
      ...
      "user": {
        ...
      },
      ...
      "extended_tweet": {
        "full_text": "Le Mécanisme d'Anticythère : Une fenêtre sur l'ingéniosité antique Découvert en 1901 parmi les débris d'un navire romain au large de l'île grecque d'Anticythère, le Mécanisme d'Anticythère est souvent considéré comme le premier ordinateur analogique au monde. Cet appareil complexe en bronze, datant d'environ 100 avant J.-C., a fasciné les historiens, archéologues et scientifiques par sa conception sophistiquée et son objectif mystérieux. Le mécanisme se compose d'un système complexe d'engrenages, méticuleusement conçu pour effectuer des calculs qui demeurent étonnamment avancés pour son époque. Sa découverte a remis en question des hypothèses longtemps établies sur les capacités technologiques du monde antique. La fonction principale du Mécanisme d'Anticythère semble avoir été astronomique. Il pouvait prédire les positions du soleil, de la lune et possiblement des planètes, suivre les éclipses lunaires et solaires, et même calculer les dates des Jeux olympiques. Les cadrans et aiguilles de l'appareil, associés à des inscriptions en grec ancien, suggèrent qu'il était un outil à la fois pour la recherche scientifique et les événements culturels. Son niveau de précision, comparable à celui de l'horlogerie du XIXe siècle, souligne l'ingéniosité remarquable de ses créateurs, probablement issus du monde hellénistique. Malgré des décennies d'étude, de nombreuses questions demeurent. Qui l'a construit, et pour qui ? S'agissait-il d'un chef-d'œuvre unique ou faisait-il partie d'une tradition plus large d'appareils mécaniques perdus dans l'histoire ? L'imagerie par rayons X et les techniques informatiques modernes ont révélé beaucoup sur son fonctionnement interne, pourtant l'étendue complète de ses capacités fait encore débat. Certains proposent qu'il était utilisé pour des prédictions astrologiques, tandis que d'autres y voient un outil pédagogique pour les astronomes. Le Mécanisme d'Anticythère témoigne de la curiosité et de l'innovation humaines, reliant les mondes antique et moderne. Il nous rappelle que même dans l'Antiquité, les gens cherchaient à comprendre le cosmos avec des outils qui rivalisent avec la complexité de la technologie actuelle. Son mystère persistant continue d'inspirer l'émerveillement et la recherche, en faisant l'un des artefacts les plus remarquables jamais mis au jour.\n@xai\n@HistoryInPics",
        "display_text_range": [
          0,
          2051
        ],
        "entities": {
          "hashtags": [],
          "urls": [],
          "user_mentions": [
            {
              "screen_name": "xai",
              "name": "xAI",
              "id": 1661523610111193000,
              "id_str": "1661523610111193088",
              "indices": [
                2032,
                2036
              ]
            },
            {
              "screen_name": "HistoryInPics",
              "name": "History Photographed",
              "id": 1582853809,
              "id_str": "1582853809",
              "indices": [
                2037,
                2051
              ]
            }
          ],
          "symbols": []
        }
      },
      ...
      "entities": {
        "hashtags": [],
        "urls": [
          {
            "url": "https://t.co/bzbEKj8cd8",
            "expanded_url": "https://twitter.com/i/web/status/1924465506158878979",
            "display_url": "twitter.com/i/web/status/1…",
            "indices": [
              117,
              140
            ]
          }
        ],
        "user_mentions": [],
        "symbols": []
      },
      ...
    }
  ]
}

Account Activity API Migration depuis l’Enterprise Legacy vers v2

Consultez notre guide de migration !

Foire aux questions

Quels sont les avantages de l’utilisation de l’Account Activity API ? L’Account Activity API utilise des webhooks, qui livrent les données en temps réel sans nécessiter de connexion ouverte (contrairement aux APIs de stream) ni d’interrogations fréquentes (contrairement aux APIs REST). Les avantages incluent :
  • Vitesse : Livre les données à la vitesse de X.
  • Simplicité : Fournit tous les événements de compte via une seule connexion webhook, notamment les Posts, @mentions, réponses, reposts, Tweets cités, likes, DMs, follows, blocks et mutes.
  • Échelle : Prend en charge toutes les activités des comptes gérés sans limites de taux ni plafonds d’événements (niveau Enterprise).
J’ai besoin d’environnements de développement, de staging et de production pour l’Account Activity API, est-ce possible ? Oui ! Vous pouvez enregistrer plusieurs URL de webhook et gérer les abonnements séparément via la V2 Webhooks API. Avez-vous des guides étape par étape pour configurer l’Account Activity API ? Oui ! Consultez le guide de prise en main des webhooks et l’application d’exemple Account Activity API. Quelle authentification dois-je utiliser avec l’Account Activity API ? Les exigences d’authentification sont précisées par endpoint. Consultez la section Authentification pour plus de détails. Vais-je recevoir des activités en double si je suis abonné à des utilisateurs qui interagissent entre eux ? Oui. Si votre App a des abonnements pour l’utilisateur A et l’utilisateur B, et que l’utilisateur A mentionne l’utilisateur B dans un Post, votre webhook reçoit deux événements (un par utilisateur). Utilisez le champ for_user_id pour identifier l’abonnement. Lorsque je crée un abonnement à mon webhook, puis-je remplacer la partie /all/ de l’endpoint par d’autres objets de données d’activité de compte pour limiter les activités livrées ? Non. Le produit /all/ est la seule option, et il livre tous les types d’événements pris en charge. Si j’ai accès à trois webhooks, puis-je utiliser trois webhooks pour chacune des apps que j’ai enregistrées pour un usage Enterprise ? La limite de webhook est définie au niveau du compte, et non par App. Par exemple, avec trois webhooks et deux Apps, vous pourriez utiliser deux webhooks pour une App et un pour l’autre, mais pas trois par App.

Index de référence de l’Account Activity API

ObjectifEndpoint v2
Abonne une application aux événements d’un comptePOST /2/account_activity/webhooks/:webhook_id/subscriptions/all
Renvoie le nombre d’abonnements actuellement actifsGET /2/account_activity/subscriptions/count
Vérifie si un webhook est abonné à un compteGET /2/account_activity/webhooks/:webhook_id/subscriptions/all
Renvoie la liste des abonnements actuellement actifsGET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
Désactive un abonnement avec l’authentification OAuth App-onlyDELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
Crée une tâche de relecturePOST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all
Pour les endpoints de gestion des webhooks (enregistrer, afficher, valider, supprimer), consultez la documentation de l’API Webhooks v2
I