Zum Hauptinhalt springen

Account Activity API v2

Die Account Activity API v2 ist jetzt unter Pro verfügbar!

Überblick

Die Account Activity API (AAA) ermöglicht den Empfang von Echtzeitereignissen zu X-Nutzerkonten über Webhooks. Wenn Sie bestimmte Nutzerkonten mit einem vorkonfigurierten Webhook verknüpfen, kann Ihre Anwendung über verschiedene Aktivitäten wie Posts, Direct Messages, Likes, Follows, Blocks und mehr benachrichtigt werden – von einem oder mehreren Ihrer eigenen oder abonnierten Konten über eine einzige Verbindung.
Diese API wird häufig verwendet, um Anwendungen zu entwickeln, die sofort auf Nutzeraktionen reagieren müssen oder einen stets aktuellen Zustand basierend auf der Nutzeraktivität beibehalten. Für jedes Nutzerabonnement erhalten Sie im Rahmen Ihrer Webhook-Registrierung alle nachfolgend aufgeführten zugehörigen Aktivitäten:

Aktivitätstypen

  • Posts (vom Nutzer)
  • Post-Löschungen (vom Nutzer)
  • @Erwähnungen (des Nutzers)
  • Antworten (an den oder vom Nutzer)
  • Reposts (vom Nutzer oder den Nutzer betreffend)
  • Zitat-Posts (vom Nutzer oder den Nutzer betreffend)
  • Reposts von Zitat-Posts (vom Nutzer oder den Nutzer betreffend)
  • Likes (vom Nutzer oder den Nutzer betreffend)
  • Follows (vom Nutzer oder den Nutzer betreffend)
  • Unfollows (vom Nutzer oder den Nutzer betreffend)
  • Blocks (vom Nutzer oder den Nutzer betreffend)
  • Unblocks (vom Nutzer oder den Nutzer betreffend)
  • Mutes (vom Nutzer oder den Nutzer betreffend)
  • Unmutes (vom Nutzer oder den Nutzer betreffend)
  • Direct Messages gesendet (vom Nutzer)
  • Direct Messages empfangen (vom Nutzer)
  • Tipp-Indikatoren (an den Nutzer)
  • Lesebestätigungen (an den Nutzer)
  • Widerrufe von Abonnements (vom Nutzer)
Hinweis: Wir liefern keine Home-Timeline-data über die Account Activity API. Verwenden Sie das endpoint User Posts Timeline by User ID, um diese data abzurufen.

Funktionsübersicht

StufePreisAnzahl eindeutiger AbonnementsAnzahl der Webhooks
Pro5.000 $ / Monat31
EnterpriseVertrieb kontaktieren5000+5+
Dieses Dokument beschreibt die Verwaltung von Benutzerabonnements, die mit Ihren Webhooks verknüpft sind, mithilfe der v2 Account Activity API-Endpunkte.

Abonnements verwalten

Die Account Activity API stellt webhookbasierte JSON-Nachrichten bereit, sobald Ereignisse mit X Konten verknüpft sind, die Ihren Dienst abonniert haben. X liefert diese Aktivitäten an Ihren registrierten Webhook. In den folgenden Schritten erfahren Sie, wie Sie Abonnements für Benutzerkonten einrichten und verwalten.

1. Erstellen Sie eine X App

Erstellen Sie eine X App mit einem genehmigten Developer-Konto über das Entwicklerportal. Wenn Sie die App im Namen Ihres Unternehmens erstellen, verwenden Sie ein Unternehmens-X-Konto.
  • Aktivieren Sie „Lesen, Schreiben und Zugriff auf Direct Messages“ auf der Registerkarte „Berechtigungen“ Ihrer App-Seite.
  • Notieren Sie sich auf der Registerkarte „Keys and Access Tokens“ den Consumer Key (API Key), den Consumer Token (API Secret) und das Bearer Token Ihrer App.
  • Generieren Sie das Access Token und das Access Token Secret Ihrer App. Diese werden benötigt, um Nutzerkonten zu abonnieren.
  • Lesen Sie Obtaining Access Tokens, wenn Sie mit X Sign-in und Nutzerkontexten nicht vertraut sind.
  • Notieren Sie sich die numerische id Ihrer App auf der Seite „Apps“ im Entwicklerportal. Diese wird benötigt, wenn Sie Zugriff auf die Account Activity API beantragen.

2. Zugriff auf die Account Activity API erhalten

Die Account Activity API ist nur im Enterprise-Tarif verfügbar. Beantragen Sie Enterprise-Zugriff über das Entwicklerportal.

3. Registrieren Sie einen Webhook

Um Account-Activity-Ereignisse zu empfangen, müssen Sie einen Webhook mit einer öffentlich erreichbaren HTTPS-URL registrieren. Details zur Entwicklung einer Webhook-Consumer-App, zur Registrierung und Absicherung des Webhooks sowie zur Handhabung von Challenge-Response-Checks (CRC) finden Sie in der v2 Webhooks API-Dokumentation.
  • Stellen Sie sicher, dass Ihr Webhook so konfiguriert ist, dass er POST-Anfragen mit JSON-codierten Ereignis-Payloads verarbeitet.
  • Notieren Sie die webhook_id aus der Antwort auf die Webhook-Registrierung; sie wird für die Verwaltung von Abonnements benötigt.

4. Einrichtung überprüfen

Um zu verifizieren, dass Ihre App und Ihr Webhook korrekt konfiguriert sind:
  • Abonnieren Sie mit einem Benutzerkonto Ihren Webhook (siehe „Hinzufügen eines Abonnements“ unten).
  • Markieren Sie einen Post als Favorit, der von einem der X‑Konten veröffentlicht wurde, die Ihre App abonniert hat.
  • Sie sollten eine favorite_events-Payload per POST-Anfrage an Ihre Webhook-URL erhalten.
  • Hinweis: Es kann bis zu 10 Sekunden dauern, bis nach dem Hinzufügen eines Abonnements Ereignisse zugestellt werden.

Wichtige Hinweise

  • Authentifizierung: Beim Abonnieren von Nutzern verwenden Sie den Consumer Key, das Consumer Secret, den Access Token und das Access Token Secret für das Konto des Nutzers.
  • Direct Messages: Alle eingehenden und ausgehenden Direct Messages (gesendet via POST /2/dm_conversations/with/:participant_id/messages) werden über Webhooks zugestellt, damit Ihre App über alle DM-Aktivitäten auf dem Laufenden bleibt.
  • Duplizierte Ereignisse:
    • Befinden sich zwei abonnierte Nutzer in derselben DM-Unterhaltung, erhält Ihr Webhook doppelte Ereignisse (je eines pro Nutzer). Verwenden Sie das Feld for_user_id, um sie zu unterscheiden.
    • Wenn mehrere Apps dieselbe Webhook-URL und denselben Nutzer verwenden, werden Ereignisse mehrfach gesendet (einmal pro App).
    • Ihre App sollte Ereignisse anhand der event ID deduplizieren, um gelegentliche Duplikate zu verarbeiten.
  • Beispielcode: Siehe das Account Activity API Setup für eine Web-App, die Webhook-Ereignisse anzeigt.

Verwalten abonnierter Nutzer (v2 API)

Sobald Sie einen registrierten Webhook mit einer gültigen webhook_id haben, können Sie Nutzerabonnements verwalten, um deren Kontoaktivitäten zu erhalten. Verwenden Sie die folgenden Endpoints, um Abonnements hinzuzufügen, anzuzeigen oder zu entfernen. Endpoint: POST /2/account_activity/webhooks/:webhook_id/subscriptions/all
Beschreibung: Abonniert den authentifizierten Benutzer, um Ereignisse über den angegebenen Webhook zu empfangen.
Authentifizierung: OAuthUser (3-legged OAuth-Flow erforderlich, steht für den Benutzer, der abonniert wird).
  • Consumer Key: z. B. xvz1evFS…
  • Access Token: z. B. 370773112-GmHxMAgYyLbN…
Pfadparameter:
ParameterBeschreibung
webhook_idDie id des Webhooks, mit dem das Abonnement verknüpft wird.
Anfrage:
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"'
Antworten:
  • Erfolg (200 OK):
  • JSON
{
  "data": {
    "subscribed": true
  }
}
  • Fehler (400 Bad Request):
ReasonDescription
WebhookIdInvalidDie angegebene webhook_id wurde nicht gefunden oder ist der App nicht zugeordnet.
DuplicateSubscriptionFailedFür diesen Benutzer besteht bereits ein Abonnement für die angegebene webhook_id.
SubscriptionLimitExceededDie Anwendung hat ihr Abonnementlimit für alle Webhooks erreicht.

Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all
Beschreibung: Prüft, ob der authentifizierte Benutzer beim angegebenen Webhook abonniert ist.
Authentifizierung: OAuthUser (3-legged OAuth-Flow erforderlich).
Pfadparameter:
ParameterBeschreibung
webhook_idDie ID des zu prüfenden Webhooks.
Anfrage:
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"'
Antworten:
  • Erfolg (200 OK):
  • JSON
{
  "data": {
    "subscribed": true // oder false
  }
}
  • Fehler (400 Bad Request):
GrundBeschreibung
WebhookIdInvalidDie angegebene webhook_id wurde nicht gefunden oder ist der App nicht zugeordnet.

Endpoint: DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
Beschreibung: Deaktiviert das Abonnement für eine bestimmte Benutzer-ID und beendet die Ereigniszustellung an den Webhook.
Authentifizierung: OAuth2 App only Bearer Token.
  • Bearer Token: z. B. AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn…
Pfadparameter:
ParameterBeschreibung
webhook_idDie ID des Webhooks, der das Abonnement enthält.
user_idDie numerische ID des Benutzers, der abgemeldet werden soll.
Anfrage:
bash
curl --request DELETE --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/:USER_ID/all' \
--header 'authorization: Bearer <BEARER_TOKEN>'
Antworten:
  • Erfolg (200 OK):
  • JSON
{
  "data": {
    "subscribed": false
  }
}
  • Fehler (400 Bad Request):
GrundBeschreibung
SubscriptionNotFoundEs existiert kein Abonnement für die angegebene user_id auf der angegebenen webhook_id.
WebhookIdInvalidDie angegebene webhook_id wurde nicht gefunden oder ist nicht mit der App verknüpft.
Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
Description: Ruft eine Liste aller Benutzer-IDs ab, die derzeit auf den angegebenen Webhook abonniert sind.
Authentication: OAuth2 App only Bearer Token.
Path Parameters:
ParameterBeschreibung
webhook_idDie id des Webhooks, für den Subscriptions aufgelistet werden sollen.
Request:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all/list' \
--header 'authorization: Bearer <BEARER_TOKEN>'
Antworten:
  • Erfolg (200 OK):
  • JSON
{
  "data": {
    "application_id": "<Ihre App-ID>",
    "webhook_id": "<Webhook-ID>",
    "webhook_url": "<die Callback-URL des Webhooks>",
    "subscriptions": [
      { "user_id": "<user_id_1>" },
      { "user_id": "<user_id_2>" }
    ]
  }
}
  • Fehler (400 Bad Request):
GrundBeschreibung
WebhookIdInvalidDie angegebene webhook_id wurde nicht gefunden oder ist nicht der App zugeordnet.

Endpoint: GET /2/account_activity/subscriptions/count
Beschreibung: Gibt die Gesamtzahl aktiver Abonnements sowie das bereitgestellte Limit für die authentifizierende App zurück.
Authentifizierung: OAuth2 App only Bearer Token.
Request:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/subscriptions/count' \
--header 'authorization: Bearer <BEARER_TOKEN>'
Antworten:
  • Erfolg (200 OK):
  • JSON
{
  "data": {
    "account_name": "<Name Ihrer Anwendung>",
    "provisioned_count": "<zugewiesenes Abonnement-Limit>",
    "subscriptions_count_all": "<aktuelle Anzahl aktiver Abonnements>",
    "subscriptions_count_direct_messages": "0" // DM-spezifische Abonnements werden nicht mehr unterstützt
  }
}
AAAv2 bietet Replay-Funktionen, mit denen Sie vergangene Ereignisse für einen angegebenen Zeitraum abrufen und an Ihren Webhook erneut zustellen können. Dies ist nützlich, um verpasste Ereignisse aufgrund von Ausfallzeiten nachzuholen. Endpoint: POST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all Beschreibung: Startet einen Replay-Job Authentifizierung: OAuth2 App only Bearer Token Pfadparameter:
ParameterBeschreibung
webhook_idDie id des Webhook, für den das Replay gestartet werden soll
Abfrageparameter:
ParameterBeschreibung
from_dateDer älteste (Start-)UTC-Zeitstempel, ab dem die Ereignisse bereitgestellt werden; muss im Format ‚yyyymmddhhmm‘ vorliegen. Der Zeitstempel hat Minutengenauigkeit und ist inklusiv (d. h. 12:00 umfasst die Minute 00). Gültige Zeiten müssen innerhalb der letzten 24 Stunden (UTC) liegen und dürfen nicht jünger als 31 Minuten vor dem aktuellen Zeitpunkt sein. Es wird empfohlen, dass from_date und to_date innerhalb von ca. 2 Stunden liegen.
to_dateDer jüngste (End-)UTC-Zeitstempel, bis zu dem die Ereignisse bereitgestellt werden; muss im Format ‚yyyymmddhhmm‘ vorliegen. Der Zeitstempel hat Minutengenauigkeit und ist exklusiv (d. h. 12:30 umfasst nicht die 30. Minute der Stunde). Gültige Zeiten müssen innerhalb der letzten 24 Stunden (UTC) liegen und höchstens 10 Minuten vor dem aktuellen Zeitpunkt liegen.
Antworten: Erfolg:
200

{
  "for_user_id": "<USER_ID>"
  "replay_event": {
    "job_id": <REPLAY_JOB_ID>",
    "created_at: "yyyy-mm-ddThh:mm:ss.000Z"
  }
}
Fehler:
GrundBeschreibung
QueryParamInvalidfrom_date liegt mehr als 24 Stunden vor der aktuellen Zeit.
QueryParamInvalidfrom_date ist später als to_date.
QueryParamInvalidfrom_date liegt in der Zukunft.
QueryParamInvalidto_date liegt in der Zukunft.
QueryParamInvalidfrom_date oder to_date hat nicht das richtige Format.
CrcValidationFailedWährend der CRC-Validierung wurde eine falsche Antwort von der Webhook-URL empfangen.
ReplayConflictErrorFür den angegebenen Webhook ist bereits ein Wiederholungsjob aktiv.
WebhookIdInvalidDie angegebene webhook_id ist ungültig oder der App nicht zugeordnet.

Meldungen zum Abschluss eines Jobs

Sobald Ihr Replay-Job erfolgreich abgeschlossen wurde, sendet X das folgende Ereignis zum Abschluss des Jobs. Sobald Sie dieses Ereignis erhalten, ist der Job beendet und ein weiterer kann eingereicht werden.
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Complete",
    "job_state_description": "Auftrag erfolgreich abgeschlossen",
    "job_id": "<JOB_ID>"
  }
}
Falls Ihr Job nicht erfolgreich abgeschlossen wird, geben wir die folgende Nachricht zurück, die Sie auffordert, Ihren Replay-Job erneut zu starten. Sobald Sie dieses Ereignis erhalten, ist der Job beendet und Sie können einen weiteren einreichen.
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Incomplete",
    "job_state_description": "Job konnte nicht alle Events ausliefern, bitte versuchen Sie Ihren Replay-Job erneut",
    "job_id": "<JOB_ID>"
  }
}

Struktur des Account-Aktivitätsdatenobjekts

ObjektDetails
for_user_idIdentifiziert das Benutzerabonnement, dem das Ereignis zugeordnet ist.
is_blocked_by(Bedingt) Wird nur bei Post-Erwähnungen angezeigt, wenn der erwähnende Benutzer vom abonnierten Benutzer blockiert wird.
sourceDer Benutzer, der die Aktivität ausführt (z. B. folgt, blockiert oder stummschaltet).
targetDer Benutzer, auf den sich die Aktivität bezieht (z. B. der Benutzer, dem gefolgt, der blockiert oder stummgeschaltet wird).

Verfügbare Aktivitäten

NachrichtentypDetails
tweet_create_eventsPost-Status für Posts, Retweets, Antworten, @Mentions, Quote Tweets oder Retweets von Quote Tweets.
favorite_eventslike-Ereignis mit Nutzer und Ziel.
follow_eventsFollow-Ereignis mit Nutzer und Ziel.
unfollow_eventsUnfollow-Ereignis mit Nutzer und Ziel.
block_eventsBlock-Ereignis mit Nutzer und Ziel.
unblock_eventsUnblock-Ereignis mit Nutzer und Ziel.
mute_eventsMute-Ereignis mit Nutzer und Ziel.
unmute_eventsUnmute-Ereignis mit Nutzer und Ziel.
user_eventWiderrufsereignisse, wenn ein Nutzer die App-Autorisierung entfernt (Abonnement wird automatisch gelöscht).
direct_message_eventsDM-Status für gesendete oder empfangene Nachrichten.
direct_message_indicate_typing_eventsDM-Tipp-Ereignis mit Nutzer und Ziel.
direct_message_mark_read_eventsDM-Gelesen-Ereignis mit Nutzer und Ziel.
tweet_delete_eventsHinweis auf gelöschte Posts für Compliance-Zwecke.
spaces_eventsDerzeit nicht unterstützt. In Kürze verfügbar.

Beispielpayloads

Nachfolgend finden Sie Beispiel-Payloads für jedes Account Activity-Ereignis.

tweet_create_events (Posts, Retweets, Antworten, QuoteTweets)

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

tweet_create_events (@Mentions)

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

favorite_events

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

follow_events

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "follow",
    "created_timestamp": "1517588749178",
    "target": {
      <User-Objekt>
    },
    "source": {
      <User-Objekt>
    }
  }]
}

unfollow_events

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "unfollow",
    "created_timestamp": "1517588749178",
    "target": {
      <User-Objekt>
    },
    "source": {
      <User-Objekt>
    }
  }]
}

block_events

{
  "for_user_id": "2244994945",
  "block_events": [{
    "type": "block",
    "created_timestamp": "1518127020304",
    "source": {
      <User-Objekt>
    },
    "target": {
      <User-Objekt>
    }
  }]
}

unblock_events

{
  "for_user_id": "2244994945",
  "block_events": [{
    "type": "unblock",
    "created_timestamp": "1518127020304",
    "source": {
      <User-Objekt>
    },
    "target": {
      <User-Objekt>
    }
  }]
}

mute_events

{
  "for_user_id": "2244994945",
  "mute_events": [
    {
      "type": "mute",
      "created_timestamp": "1518127020304",
      "source": {
        <User-Objekt>
      },
      "target": {
        <User-Objekt>
      }
    }
  ]
}

unmute_events

{
  "for_user_id": "2244994945",
  "mute_events": [
    {
      "type": "unmute",
      "created_timestamp": "1518127020304",
      "source": {
        <User-Objekt>
      },
      "target": {
        <User-Objekt>
      }
    }
  ]
}

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": "Hallo Welt!",
        "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 Meinungen sind meine eigenen",
      "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 Meinungen sind meine eigenen",
      "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": "tagsüber Daten @X, abends Design",
      "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, Meinungen sind meine eigenen",
      "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"
    }
  ]
}

Unterstützung für Longform-Posts

Die v2 Account Activity API unterstützt jetzt Longform-Posts, also Posts mit mehr als 280 Zeichen. Wenn ein Longform-Post in einer tweet_create_events-Payload enthalten ist, enthält das Feld text die ersten 140 Zeichen (oder weniger) und das Feld truncated ist auf true gesetzt. Der vollständige Post-Inhalt wird im Objekt extended_tweet bereitgestellt, das Folgendes enthält:
  • full_text: Der vollständige Text des Posts, einschließlich aller Zeichen über die 280-Zeichen-Grenze hinaus.
  • entities: Alle Entitäten (z. B. Hashtags, URLs, Benutzererwähnungen, Symbole), die im vollständigen Text erscheinen, einschließlich derjenigen nach dem 280. Zeichen.
  • display_text_range: Der Bereich der anzuzeigenden Zeichen unter Berücksichtigung des vollständigen Textes.
Dies stellt sicher, dass Anwendungen den gesamten Inhalt von Longform-Posts verarbeiten können, einschließlich Erwähnungen oder anderer Entitäten, die später im Text erscheinen. Unten finden Sie ein Beispiel für eine tweet_create_events-Payload für einen Longform-Post:
{
  "for_user_id": "1603419180975409153",
  "tweet_create_events": [
    {
      "created_at": "Mon May 19 14:01:46 +0000 2025",
      "id": 1924465506158879000,
      "id_str": "1924465506158878979",
      "text": "Der Antikythera-Mechanismus: Ein Fenster zur antiken Genialität Entdeckt 1901 in den Trümmern eines römischen Schiffes vor… https://t.co/bzbEKj8cd8",
      "display_text_range": [
        0,
        140
      ],
      ...
      "user": {
        ...
      },
      ...
      "extended_tweet": {
        "full_text": "Der Antikythera-Mechanismus: Ein Fenster zur antiken Genialität Entdeckt 1901 in den Trümmern eines römischen Schiffes vor der griechischen Insel Antikythera wird der Antikythera-Mechanismus oft als der erste Analogcomputer der Welt gepriesen. Dieses komplexe Bronzegerät aus der Zeit um 100 v. Chr. hat Historiker, Archäologen und Wissenschaftler mit seinem ausgeklügelten Design und seinem geheimnisvollen Zweck fasziniert. Der Mechanismus besteht aus einem komplexen System von Zahnrädern, die sorgfältig gefertigt wurden, um Berechnungen durchzuführen, die für seine Zeit erstaunlich fortschrittlich sind. Seine Entdeckung stellte lang gehegte Annahmen über die technologischen Fähigkeiten der antiken Welt infrage. Die Hauptfunktion des Antikythera-Mechanismus scheint astronomischer Natur gewesen zu sein. Er konnte die Positionen von Sonne, Mond und möglicherweise Planeten vorhersagen, Mond- und Sonnenfinsternisse verfolgen und sogar die Daten der Olympischen Spiele berechnen. Die Zifferblätter und Zeiger des Geräts, zusammen mit Inschriften in altgriechischer Sprache, deuten darauf hin, dass es ein Werkzeug sowohl für wissenschaftliche Forschung als auch für kulturelle Ereignisse war. Seine Präzision, vergleichbar mit der Uhrmacherkunst des 19. Jahrhunderts, unterstreicht die bemerkenswerte Genialität seiner Schöpfer, wahrscheinlich aus der hellenistischen Welt. Trotz jahrzehntelanger Forschung bleiben viele Fragen offen. Wer hat ihn gebaut und für wen? War es ein einzigartiges Meisterwerk oder Teil einer breiteren Tradition mechanischer Geräte, die der Geschichte verloren gingen? Röntgenbildgebung und moderne Computertechniken haben viel über seine inneren Abläufe enthüllt, dennoch wird der volle Umfang seiner Fähigkeiten noch immer diskutiert. Einige schlagen vor, dass er für astrologische Vorhersagen verwendet wurde, während andere ihn als Lehrmittel für Astronomen sehen. Der Antikythera-Mechanismus steht als Zeugnis menschlicher Neugier und Innovation und verbindet die antike und moderne Welt. Er erinnert uns daran, dass selbst in der Antike Menschen den Kosmos mit Werkzeugen zu verstehen suchten, die der Komplexität heutiger Technologie ebenbürtig sind. Sein anhaltendes Geheimnis inspiriert weiterhin Ehrfurcht und Forschung und macht ihn zu einem der bemerkenswertesten jemals ausgegrabenen Artefakte.\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 von Legacy Enterprise auf v2

Siehe unseren Migrationsleitfaden!

Häufig gestellte Fragen

Was sind die Vorteile der Account Activity API? Die Account Activity API verwendet Webhooks und liefert Daten in Echtzeit, ohne dass eine offene Verbindung erforderlich ist (im Gegensatz zu Streaming-APIs) oder häufiges Polling (im Gegensatz zu REST-APIs). Zu den Vorteilen zählen:
  • Geschwindigkeit: Liefert Daten mit der Geschwindigkeit von X.
  • Einfachheit: Stellt alle Kontoereignisse über eine einzelne Webhook-Verbindung bereit, einschließlich Posts, @Mentions, Antworten, Reposts, Quote Tweets, Likes, DMs, Follows, Blocks und Mutes.
  • Skalierung: Unterstützt alle Aktivitäten für verwaltete Konten ohne Rate Limits oder Ereignisobergrenzen (Enterprise-Tarif).
Ich benötige Entwicklungs-, Staging- und Produktionsumgebungen für die Account Activity API. Ist das möglich? Ja! Sie können mehrere Webhook-URLs registrieren und Abonnements separat über die V2 Webhooks API verwalten. Gibt es Schritt-für-Schritt-Anleitungen für die Einrichtung der Account Activity API? Ja! Siehe den Leitfaden zum Einstieg mit Webhooks und die Account Activity API Sample Application. Welche Authentifizierung muss ich mit der Account Activity API verwenden? Die Authentifizierungsanforderungen sind pro endpoint festgelegt. Details finden Sie im Abschnitt zur Authentifizierung. Erhalte ich doppelte Aktivitäten, wenn ich Nutzer abonniert habe, die miteinander interagieren? Ja. Wenn Ihre App Abonnements für Nutzer A und Nutzer B hat und Nutzer A Nutzer B in einem Post erwähnt, erhält Ihr Webhook zwei Ereignisse (eines pro Nutzer). Verwenden Sie das Feld for_user_id, um das Abonnement zu identifizieren. Wenn ich ein Abonnement für meinen Webhook erstelle, kann ich den /all/ Teil des endpoint durch andere Objekte der Kontenaktivität ersetzen, um die gelieferten Aktivitäten einzuschränken? Nein. Das Produkt /all/ ist die einzige Option und liefert alle unterstützten Ereignistypen. Wenn ich Zugriff auf drei Webhooks habe, kann ich drei Webhooks für jede der Apps verwenden, die ich für die Enterprise-Nutzung registriert habe? Das Webhook-Limit ist auf Kontoebene festgelegt, nicht pro App. Beispiel: Bei drei Webhooks und zwei Apps könnten Sie zwei Webhooks für eine App und einen für die andere verwenden, aber nicht drei pro App.

Account Activity API Referenzindex

ZweckV2-Endpoint
Abonniert die Kontoereignisse für eine AppPOST /2/account_activity/webhooks/:webhook_id/subscriptions/all
Gibt die Anzahl der aktuell aktiven Abonnements zurückGET /2/account_activity/subscriptions/count
Prüft, ob ein Webhook für ein Konto abonniert istGET /2/account_activity/webhooks/:webhook_id/subscriptions/all
Gibt eine Liste der aktuell aktiven Abonnements zurückGET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
Deaktiviert ein Abonnement mit App-only OAuthDELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
Erstellt einen Replay-JobPOST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all
Weitere Endpoints zur Webhook-Verwaltung (Registrieren, Anzeigen, Validieren, Löschen) finden Sie in der V2 Webhooks API-Dokumentation
I