V2 Account Activity API
Account Activity API v2 は、現在は Pro でご利用いただけます。
概要
この API は、ユーザーの操作に即時に反応する必要があるアプリケーションや、ユーザーアクティビティに基づいて最新の状態を維持する必要があるアプリケーションの構築によく利用されます。webhook の登録ごとに、各ユーザー購読に対して以下の関連アクティビティをすべて受信します。
アクティビティの種類
- Posts(ユーザーによる)
- Post の delete(ユーザーによる)
- @メンション(ユーザーに対する)
- 返信(ユーザーから/ユーザーへの)
- Reposts(ユーザーによる/ユーザーに対する)
- 引用 Post(ユーザーによる/ユーザーに対する)
- 引用 Post の Reposts(ユーザーによる/ユーザーに対する)
- like(ユーザーによる/ユーザーに対する)
- フォロー(ユーザーによる/ユーザーに対する)
- フォロー解除(ユーザーによる/ユーザーに対する)
- ブロック(ユーザーによる/ユーザーに対する)
- ブロック解除(ユーザーによる/ユーザーに対する)
- ミュート(ユーザーによる/ユーザーに対する)
- ミュート解除(ユーザーによる/ユーザーに対する)
- ダイレクトメッセージの送信(ユーザーによる)
- ダイレクトメッセージの受信(ユーザーによる)
- 入力中インジケーター(ユーザー宛て)
- 既読通知(ユーザー宛て)
- サブスクリプションの取り消し(ユーザーによる)
機能概要
プラン | 料金 | 固有サブスクリプション数 | webhook 数 |
---|---|---|---|
Pro | $5,000/月 | 3 | 1 |
Enterprise | 営業にお問い合わせ | 5,000+ | 5+ |
サブスクリプションの管理
1. X App を作成する
- App ページの permissions タブで「Read, Write, and Access direct messages」を有効にします。
- “Keys and Access Tokens” タブで、App の Consumer Key (API Key)、Consumer Token (API Secret)、および Bearer Token を控えておきます。
- App の Access Token と Access Token Secret を生成します。これらはユーザーアカウントを購読する際に必要です。
- X へのサインインやユーザーコンテキストに不慣れな場合は、Obtaining Access Tokens を参照してください。
- developer portal の “Apps” ページで、App の数値の id を控えておきます。これは Account Activity API のアクセス申請時に必要です。
2. Account Activity API へのアクセスを取得する
3. Webhook を登録する
- webhook が、JSON でエンコードされたイベントペイロードを含む POST リクエストを処理できるように構成されていることを確認してください。
- 購読の管理に必要となるため、webhook 登録のレスポンスから webhook_id を取得してください。
4. セットアップの検証
- ユーザーアカウントを webhook に購読登録します(下記の「Adding a Subscription」を参照)。
- App が購読している X アカウントのいずれかが投稿した Post を「いいね」します。
- webhook の URL に対して、POST リクエストで favorite_events のペイロードが届くはずです。
- 注意: サブスクリプションを追加してからイベントの配信が開始されるまで、最大 10 秒かかる場合があります。
重要な注意事項
- 認証: ユーザーをサブスクライブする際は、そのユーザーのアカウントの consumer key、consumer secret、access token、access token secret を使用してください。
- ダイレクトメッセージ: 受信・送信されるすべてのダイレクトメッセージ(POST /2/dm_conversations/with/:participant_id/messages 経由で送信)は、webhook を通じて配信され、App がすべての DM アクティビティを把握できるようにします。
- イベントの重複:
- 2 人のサブスクライブ済みユーザーが同じ DM 会話にいる場合、webhook は重複したイベント(ユーザーごとに 1 件)を受け取ります。識別には for_user_id フィールドを使用してください。
- 複数の App が同じ webhook URL とユーザーを共有している場合、イベントは複数回(App ごとに 1 回)送信されます。
- App は、まれに発生する重複に対応するため、event ID を使用してイベントの重複排除を行ってください。
- コード例: webhook イベントを表示する Web アプリについては、Account Activity API Setup を参照してください。
サブスクライブ済みユーザーの管理(v2 API)
Description: 指定の webhook を介してイベントを受け取るよう、認証中のユーザーを登録します。
Authentication: OAuthUser(3-legged OAuth フローが必要。登録対象のユーザーを表します)。
- Consumer Key: 例: xvz1evFS…
- Access Token: 例: 370773112-GmHxMAgYyLbN…
Parameter | Description |
---|---|
webhook_id | サブスクリプションに関連付ける webhook の id。 |
bash
- 成功(200 OK):
- JSON
- 失敗(400 Bad Request):
理由 | 説明 |
---|---|
WebhookIdInvalid | 指定された webhook_id が見つからないか、App に関連付けられていません。 |
DuplicateSubscriptionFailed | このユーザーには、指定された webhook_id に対するサブスクリプションがすでに存在します。 |
SubscriptionLimitExceeded | アプリケーションは、すべての webhook を通じたサブスクリプション数の上限に達しています。 |
Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all
Description: 認証中のユーザーが指定された webhook にサブスクライブしているかどうかを確認します。
Authentication: OAuthUser(3-legged OAuth フローが必要)
Path Parameters:
Parameter | Description |
---|---|
webhook_id | 確認対象の webhook の id。 |
bash
- 成功(200 OK):
- JSON
- 失敗(400 Bad Request):
理由 | 説明 |
---|---|
WebhookIdInvalid | 指定された webhook_id が見つからないか、App に関連付けられていません。 |
Endpoint: DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
Description: 特定のユーザーIDのサブスクリプションを無効化し、webhookへのイベント配信を停止します。
Authentication: OAuth2 App only Bearer Token
- Bearer Token: 例: AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn…
Parameter | Description |
---|---|
webhook_id | サブスクリプションを含むwebhookのid。 |
user_id | 解除対象ユーザーの数値id。 |
bash
- 成功 (200 OK):
- JSON
- 失敗(400 Bad Request):
理由 | 説明 |
---|---|
SubscriptionNotFound | 指定された user_id のサブスクリプションが、指定の webhook_id に対して存在しません。 |
WebhookIdInvalid | 指定された webhook_id が見つからないか、App に関連付けられていません。 |
Description: 指定した webhook に現在サブスクライブしているすべてのユーザーIDの一覧を取得します。
Authentication: OAuth2 App only Bearer Token。
Path Parameters:
Parameter | Description |
---|---|
webhook_id | サブスクリプションを取得する対象の webhook の id。 |
bash
- 成功 (200 OK):
- JSON
- 失敗(400 Bad Request):
理由 | 説明 |
---|---|
WebhookIdInvalid | 指定された webhook_id が見つからないか、App に関連付けられていません。 |
Endpoint: GET /2/account_activity/subscriptions/count
Description: 認証中のアプリケーションについて、アクティブなサブスクリプションの合計数と、割り当てられた上限を返します。
Authentication: OAuth2 App only Bearer Token.
Request:
bash
- 成功 (200 OK):
- JSON
Parameter | Description |
---|---|
webhook_id | リプレイを開始する対象の webhook の id |
Parameter | Description |
---|---|
from_date | イベントの提供を開始する最古(開始)の UTC タイムスタンプ。‘yyyymmddhhmm’ 形式で指定します。タイムスタンプは分単位の粒度で、包含的です(例: 12:00 は 00 分を含む)。有効な時刻は過去 24 時間以内(UTC)で、現在時刻の 31 分前より新しくない必要があります。from_date と to_date は約 2 時間以内に収めることを推奨します。 |
to_date | イベントの提供を終了する最新(終了)の UTC タイムスタンプ。‘yyyymmddhhmm’ 形式で指定します。タイムスタンプは分単位の粒度で、排他的です(例: 12:30 はその時間の 30 分目を含まない)。有効な時刻は過去 24 時間以内(UTC)で、現在時刻の 10 分前より前である必要があります。 |
理由 | 説明 |
---|---|
QueryParamInvalid | from_date が現在時刻から24時間以上前です。 |
QueryParamInvalid | from_date が to_date よりも後の日時です。 |
QueryParamInvalid | from_date が未来の日時です。 |
QueryParamInvalid | to_date が未来の日時です。 |
QueryParamInvalid | from_date または to_date の形式が正しくありません。 |
CrcValidationFailed | CRC 検証中に webhook URL から不正な応答を受信しました。 |
ReplayConflictError | 指定された webhook には、すでにリプレイジョブが進行中です。 |
WebhookIdInvalid | 提供された webhook_id が無効か、App に関連付けられていません。 |
ジョブ完了メッセージ
アカウントアクティビティのデータオブジェクト構造
オブジェクト | 詳細 |
---|---|
for_user_id | イベントが関連するユーザーのサブスクリプションを識別します。 |
is_blocked_by | (条件付き)Post のメンションイベントで、メンションしたユーザーが購読中のユーザーにブロックされている場合にのみ表示されます。 |
source | アクティビティを実行しているユーザー(例:フォロー、ブロック、ミュートを行うユーザー)。 |
target | アクティビティの対象となるユーザー(例:フォロー、ブロック、ミュートされるユーザー)。 |
利用可能なアクティビティ
メッセージタイプ | 詳細 |
---|---|
tweet_create_events | Posts、リツイート、返信、@メンション、Quote Tweets、または Retweet of Quote Tweets のPostステータス。 |
favorite_events | ユーザーと対象を含むlikeイベント。 |
follow_events | ユーザーと対象を含むフォローイベント。 |
unfollow_events | ユーザーと対象を含むフォロー解除イベント。 |
block_events | ユーザーと対象を含むブロックイベント。 |
unblock_events | ユーザーと対象を含むブロック解除イベント。 |
mute_events | ユーザーと対象を含むミュートイベント。 |
unmute_events | ユーザーと対象を含むミュート解除イベント。 |
user_event | ユーザーがAppの認可を解除した際の取り消しイベント(サブスクリプションは自動削除)。 |
direct_message_events | 送受信メッセージのDMステータス。 |
direct_message_indicate_typing_events | ユーザーと対象を含むDMの入力中イベント。 |
direct_message_mark_read_events | ユーザーと対象を含むDMの既読イベント。 |
tweet_delete_events | コンプライアンス対応のための削除済みPostsの通知。 |
spaces_events | 現在は未対応。近日対応予定。 |
ペイロードの例
tweet_create_events(Posts、リツイート、返信、引用ツイート)
tweet_create_events(@メンション)
favorite_events
follow_events
unfollow_events
block_events
unblock_events
mute_events
unmute_events
user_event
direct_message_events
direct_message_indicate_typing_events
direct_message_mark_read_events
tweet_delete_events
長文のPostsへの対応
- full_text: 280文字の上限を超える分も含めた、Post の全文。
- entities: フルテキスト内に出現するエンティティ(例: ハッシュタグ、URL、ユーザーのメンション、シンボル)。280文字目以降のものも含む。
- display_text_range: フルテキストを考慮した表示文字範囲。
Account Activity API レガシー Enterprise から v2 への移行
よくある質問
- 速度: X のスピードで data を配信します。
- シンプルさ: 単一の webhook 接続で、Posts、@mentions、Replies、Reposts、Quote Tweets、Likes、DMs、Follows、Blocks、Mutes を含む、すべてのアカウントイベントを提供します。
- スケール: レートリミットやイベント上限なしで、管理対象アカウントのすべてのアクティビティをサポートします(Enterprise ティア)。
Account Activity API リファレンス索引
目的 | v2 endpoint |
---|---|
アプリケーションをアカウントのイベントに登録する | POST /2/account_activity/webhooks/:webhook_id/subscriptions/all |
現在アクティブなサブスクリプション数を返す | GET /2/account_activity/subscriptions/count |
webhook がアカウントに対してサブスクライブ済みかを確認する | GET /2/account_activity/webhooks/:webhook_id/subscriptions/all |
現在アクティブなサブスクリプションの一覧を返す | GET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list |
App-only OAuth を使用してサブスクリプションを無効化する | DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all |
リプレイジョブを作成する | POST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all |