メインコンテンツへスキップ

V2 Account Activity API

Account Activity API v2 は、現在は Pro でご利用いただけます。

概要

Account Activity API (AAA) は、webhook を介して X のユーザーアカウントに関連するイベントをリアルタイムで受信する手段を提供します。事前に設定した webhook に特定のユーザーアカウントを購読させることで、単一の接続で、所有または購読中の 1 つ以上のアカウントから、Posts、ダイレクトメッセージ、like、フォロー、ブロックなど、さまざまなアクティビティの通知をアプリケーションが受け取れます。
この API は、ユーザーの操作に即時に反応する必要があるアプリケーションや、ユーザーアクティビティに基づいて最新の状態を維持する必要があるアプリケーションの構築によく利用されます。webhook の登録ごとに、各ユーザー購読に対して以下の関連アクティビティをすべて受信します。

アクティビティの種類

  • Posts(ユーザーによる)
  • Post の delete(ユーザーによる)
  • @メンション(ユーザーに対する)
  • 返信(ユーザーから/ユーザーへの)
  • Reposts(ユーザーによる/ユーザーに対する)
  • 引用 Post(ユーザーによる/ユーザーに対する)
  • 引用 Post の Reposts(ユーザーによる/ユーザーに対する)
  • like(ユーザーによる/ユーザーに対する)
  • フォロー(ユーザーによる/ユーザーに対する)
  • フォロー解除(ユーザーによる/ユーザーに対する)
  • ブロック(ユーザーによる/ユーザーに対する)
  • ブロック解除(ユーザーによる/ユーザーに対する)
  • ミュート(ユーザーによる/ユーザーに対する)
  • ミュート解除(ユーザーによる/ユーザーに対する)
  • ダイレクトメッセージの送信(ユーザーによる)
  • ダイレクトメッセージの受信(ユーザーによる)
  • 入力中インジケーター(ユーザー宛て)
  • 既読通知(ユーザー宛て)
  • サブスクリプションの取り消し(ユーザーによる)
: Account Activity API 経由ではホームタイムラインのデータは配信しません。User ID での User Posts タイムライン endpoint を使用してこの data を取得してください。

機能概要

プラン料金固有サブスクリプション数webhook 数
Pro$5,000/月31
Enterprise営業にお問い合わせ5,000+5+
本ドキュメントでは、v2 の Account Activity API の endpoint を使用して、webhook に関連付けられたユーザーサブスクリプションの管理方法に焦点を当てます。

サブスクリプションの管理

Account Activity API は、あなたのサービスにサブスクライブしている X アカウントでイベントが発生するたびに、webhook を通じて JSON メッセージを送信します。X はこれらのアクティビティを登録済みの webhook に配信します。以下の手順では、ユーザーアカウントのサブスクリプションを設定および管理する方法を説明します。

1. X App を作成する

承認済みのデベロッパーアカウントで、developer portal から X App を作成します。会社を代表して作成する場合は、企業の X アカウントを使用してください。
  • 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 TokenAccess Token Secret を生成します。これらはユーザーアカウントを購読する際に必要です。
  • X へのサインインやユーザーコンテキストに不慣れな場合は、Obtaining Access Tokens を参照してください。
  • developer portal の “Apps” ページで、App の数値の id を控えておきます。これは Account Activity API のアクセス申請時に必要です。

2. Account Activity API へのアクセスを取得する

Account Activity API は Enterprise でのみ利用できます。Enterprise へのアクセス申請は、developer portal から行ってください。

3. Webhook を登録する

Account Activity イベントを受信するには、外部からアクセス可能な HTTPS URL を持つ webhook を登録する必要があります。webhook コンシューマー App の開発、webhook の登録、セキュリティの確保、Challenge-Response Checks (CRC) の処理に関する詳細は、v2 Webhooks API ドキュメントを参照してください。
  • webhook が、JSON でエンコードされたイベントペイロードを含む POST リクエストを処理できるように構成されていることを確認してください。
  • 購読の管理に必要となるため、webhook 登録のレスポンスから webhook_id を取得してください。

4. セットアップの検証

App と webhook が正しく設定されていることを確認するには:
  • ユーザーアカウントを 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)

有効な webhook_id を持つ登録済みの webhook がある場合、該当ユーザーのアカウントアクティビティを受け取るためのサブスクリプションを管理できます。サブスクリプションの追加、表示、削除には、以下の endpoint を使用します。 Endpoint: POST /2/account_activity/webhooks/:webhook_id/subscriptions/all
Description: 指定の webhook を介してイベントを受け取るよう、認証中のユーザーを登録します。
Authentication: OAuthUser(3-legged OAuth フローが必要。登録対象のユーザーを表します)。
  • Consumer Key: 例: xvz1evFS…
  • Access Token: 例: 370773112-GmHxMAgYyLbN…
Path Parameters:
ParameterDescription
webhook_idサブスクリプションに関連付ける webhook の id。
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"'
レスポンス:
  • 成功(200 OK):
  • JSON
{
  "data": {
    "subscribed": true
  }
}
  • 失敗(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:
ParameterDescription
webhook_id確認対象の webhook の id。
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"'
レスポンス:
  • 成功(200 OK):
  • JSON
{
  "data": {
    "subscribed": true // または false
  }
}
  • 失敗(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…
Path Parameters:
ParameterDescription
webhook_idサブスクリプションを含むwebhookのid。
user_id解除対象ユーザーの数値id。
Request:
bash
curl --request DELETE --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/:USER_ID/all' \
--header 'authorization: Bearer <BEARER_TOKEN>'
レスポンス:
  • 成功 (200 OK):
  • JSON
{
  "data": {
    "subscribed": false
  }
}
  • 失敗(400 Bad Request):
理由説明
SubscriptionNotFound指定された user_id のサブスクリプションが、指定の webhook_id に対して存在しません。
WebhookIdInvalid指定された webhook_id が見つからないか、App に関連付けられていません。
Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
Description: 指定した webhook に現在サブスクライブしているすべてのユーザーIDの一覧を取得します。
Authentication: OAuth2 App only Bearer Token。
Path Parameters:
ParameterDescription
webhook_idサブスクリプションを取得する対象の webhook の id。
Request:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all/list' \
--header 'authorization: Bearer <BEARER_TOKEN>'
レスポンス:
  • 成功 (200 OK):
  • JSON
{
  "data": {
    "application_id": "<あなたのapp id>",
    "webhook_id": "<webhook id>",
    "webhook_url": "<webhookのコールバックURL>",
    "subscriptions": [
      { "user_id": "<user_id_1>" },
      { "user_id": "<user_id_2>" }
    ]
  }
}
  • 失敗(400 Bad Request):
理由説明
WebhookIdInvalid指定された webhook_id が見つからないか、App に関連付けられていません。

Endpoint: GET /2/account_activity/subscriptions/count
Description: 認証中のアプリケーションについて、アクティブなサブスクリプションの合計数と、割り当てられた上限を返します。
Authentication: 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>'
レスポンス:
  • 成功 (200 OK):
  • JSON
{
  "data": {
    "account_name": "<あなたのアプリケーション名>",
    "provisioned_count": "<割り当てられたサブスクリプション上限>",
    "subscriptions_count_all": "<現在のアクティブなサブスクリプション数>",
    "subscriptions_count_direct_messages": "0" // DMのみのサブスクリプションはサポート終了
  }
}
AAAv2 は、指定した時間範囲の過去イベントを取得し、webhook に再配信するリプレイ機能を提供します。これは、ダウンタイムにより取り逃したイベントの復旧に有用です。 Endpoint: POST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all Description: リプレイジョブを開始します Authentication: OAuth2 App only Bearer Token Path Parameters:
ParameterDescription
webhook_idリプレイを開始する対象の webhook の id
Query Parameters:
ParameterDescription
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 分前より前である必要があります。
Responses: Success:
200

{
  "for_user_id": "<USER_ID>"
  "replay_event": {
    "job_id": <REPLAY_JOB_ID>",
    "created_at": "yyyy-mm-ddThh:mm:ss.000Z"
  }
}
Failures:
理由説明
QueryParamInvalidfrom_date が現在時刻から24時間以上前です。
QueryParamInvalidfrom_date が to_date よりも後の日時です。
QueryParamInvalidfrom_date が未来の日時です。
QueryParamInvalidto_date が未来の日時です。
QueryParamInvalidfrom_date または to_date の形式が正しくありません。
CrcValidationFailedCRC 検証中に webhook URL から不正な応答を受信しました。
ReplayConflictError指定された webhook には、すでにリプレイジョブが進行中です。
WebhookIdInvalid提供された webhook_id が無効か、App に関連付けられていません。

ジョブ完了メッセージ

リプレイジョブが正常に完了すると、X は次のジョブ完了イベントを送信します。このイベントを受信した時点で、ジョブの実行は完了しており、別のジョブを提出できます。
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Complete",
    "job_state_description": "ジョブが正常に完了しました",
    "job_id": "<JOB_ID>"
  }
}
ジョブが正常に完了しなかった場合は、Replay Job の再実行を促す次のメッセージを返します。このイベントを受信した時点で当該ジョブの実行は終了しており、別のジョブを提出できます。
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Incomplete",
    "job_state_description": "ジョブがすべてのイベントの配信に失敗しました。リプレイジョブを再試行してください",
    "job_id": "<JOB_ID>"
  }
}

アカウントアクティビティのデータオブジェクト構造

オブジェクト詳細
for_user_idイベントが関連するユーザーのサブスクリプションを識別します。
is_blocked_by(条件付き)Post のメンションイベントで、メンションしたユーザーが購読中のユーザーにブロックされている場合にのみ表示されます。
sourceアクティビティを実行しているユーザー(例:フォロー、ブロック、ミュートを行うユーザー)。
targetアクティビティの対象となるユーザー(例:フォロー、ブロック、ミュートされるユーザー)。

利用可能なアクティビティ

メッセージタイプ詳細
tweet_create_eventsPosts、リツイート、返信、@メンション、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現在は未対応。近日対応予定。

ペイロードの例

以下は、各 Account Activity イベントのペイロード例です。

tweet_create_events(Posts、リツイート、返信、引用ツイート)

{
  "for_user_id": "2244994945",
  "tweet_create_events": [
    {
      <Tweet オブジェクト>
    }
  ]
}

tweet_create_events(@メンション)

{
  "for_user_id": "2244994945",
  "user_has_blocked": "false",
  "tweet_create_events": [
    {
      <Tweet オブジェクト>
    }
  ]
}

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オブジェクト>
    },
    "user": {
      <ユーザーオブジェクト>
    }
  }]
}

follow_events

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "follow",
    "created_timestamp": "1517588749178",
    "target": {
      <ユーザーオブジェクト>
    },
    "source": {
      <ユーザーオブジェクト>
    }
  }]
}

unfollow_events

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "unfollow",
    "created_timestamp": "1517588749178",
    "target": {
      <ユーザーオブジェクト>
    },
    "source": {
      <ユーザーオブジェクト>
    }
  }]
}

block_events

{
  "for_user_id": "2244994945",
  "block_events": [{
    "type": "block",
    "created_timestamp": "1518127020304",
    "source": {
      <ユーザーオブジェクト>
    },
    "target": {
      <ユーザーオブジェクト>
    }
  }]
}

unblock_events

{
  "for_user_id": "2244994945",
  "block_events": [{
    "type": "unblock",
    "created_timestamp": "1518127020304",
    "source": {
      <ユーザーオブジェクト>
    },
    "target": {
      <ユーザーオブジェクト>
    }
  }]
}

mute_events

{
  "for_user_id": "2244994945",
  "mute_events": [
    {
      "type": "mute",
      "created_timestamp": "1518127020304",
      "source": {
        <ユーザーオブジェクト>
      },
      "target": {
        <ユーザーオブジェクト>
      }
    }
  ]
}

unmute_events

{
  "for_user_id": "2244994945",
  "mute_events": [
    {
      "type": "unmute",
      "created_timestamp": "1518127020304",
      "source": {
        <ユーザーオブジェクト>
      },
      "target": {
        <ユーザーオブジェクト>
      }
    }
  ]
}

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": "Hello World!",
        "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 opinions-are-my-own",
      "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 意見は私個人のものです",
      "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": "日中は@Xでデータ、夕暮れにデザイン",
      "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": "もう一つの顔 - X PE 意見は個人のものです",
      "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"
    }
  ]
}

長文のPostsへの対応

V2 Account Activity API は、280文字を超える「longform」のPostsをサポートしました。longform のPostが tweet_create_events のペイロードに含まれる場合、text フィールドには先頭の140文字(またはそれ以下)が入り、truncated フィールドは true に設定されます。Post の全文は extended_tweet オブジェクトで提供され、その中には次の項目が含まれます:
  • full_text: 280文字の上限を超える分も含めた、Post の全文。
  • entities: フルテキスト内に出現するエンティティ(例: ハッシュタグ、URL、ユーザーのメンション、シンボル)。280文字目以降のものも含む。
  • display_text_range: フルテキストを考慮した表示文字範囲。
これにより、アプリケーションはテキスト後半に現れるメンションやその他のエンティティを含め、longform のPostsの内容全体を処理できます。以下は、longform のPostに対する tweet_create_events ペイロードの例です:
{
  "for_user_id": "1603419180975409153",
  "tweet_create_events": [
    {
      "created_at": "Mon May 19 14:01:46 +0000 2025",
      "id": 1924465506158879000,
      "id_str": "1924465506158878979",
      "text": "アンティキティラ機構:古代の創意工夫への窓 1901年にローマ船の残骸から発見された… https://t.co/bzbEKj8cd8",
      "display_text_range": [
        0,
        140
      ],
      ...
      "user": {
        ...
      },
      ...
      "extended_tweet": {
        "full_text": "アンティキティラ機構:古代の創意工夫への窓 1901年にギリシャのアンティキティラ島沖のローマ船の残骸から発見されたアンティキティラ機構は、世界初のアナログコンピュータとしてしばしば称賛されています。紀元前100年頃に遡るこの精巧な青銅製装置は、その洗練された設計と謎めいた目的で歴史家、考古学者、科学者を魅了してきました。この機構は複雑な歯車システムで構成されており、その時代にとって驚くほど高度な計算を実行するよう精密に作られています。その発見は、古代世界の技術的能力に関する長年の仮定に挑戦しました。アンティキティラ機構の主要な機能は天文学的なものであったと思われます。太陽、月、そしておそらく惑星の位置を予測し、月食や日食を追跡し、オリンピック競技会の日程さえ計算することができました。古代ギリシャ語の碑文と組み合わされた装置の文字盤と指針は、それが科学的探究と文化的行事の両方のための道具であったことを示唆しています。19世紀の時計製造技術に匹敵するその精度レベルは、おそらくヘレニズム世界出身の製作者たちの卓越した創意工夫を物語っています。数十年にわたる研究にもかかわらず、多くの疑問が残っています。誰が、誰のために作ったのでしょうか?それは単独の傑作だったのか、それとも歴史に失われた機械装置のより広い伝統の一部だったのでしょうか?X線撮影と現代の計算技術により、その内部構造について多くのことが明らかになりましたが、その能力の全容はまだ議論されています。占星術的予測に使用されたと提案する者もいれば、天文学者のための教育ツールと見る者もいます。アンティキティラ機構は人間の好奇心と革新の証として立ち、古代と現代の世界を橋渡ししています。それは古代においてさえ、人々が今日の技術の複雑さに匹敵する道具で宇宙を理解しようと努めていたことを思い起こさせます。その永続的な謎は畏敬の念と調査を刺激し続け、これまでに発掘された最も注目すべき遺物の一つとなっています。\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 レガシー Enterprise から v2 への移行

移行ガイドをご覧ください。

よくある質問

Account Activity API を使用する利点は何ですか? Account Activity API は webhook を使用し、オープンな接続(streaming API とは異なる)や頻繁なポーリング(REST API とは異なる)を必要とせずに、リアルタイムで data を配信します。利点は次のとおりです:
  • 速度: X のスピードで data を配信します。
  • シンプルさ: 単一の webhook 接続で、Posts、@mentions、Replies、Reposts、Quote Tweets、Likes、DMs、Follows、Blocks、Mutes を含む、すべてのアカウントイベントを提供します。
  • スケール: レートリミットやイベント上限なしで、管理対象アカウントのすべてのアクティビティをサポートします(Enterprise ティア)。
Account Activity API 用に開発・ステージング・本番の各環境が必要です。これは可能ですか? はい!複数の webhook URL を登録し、V2 Webhooks API を通じてサブスクリプションを個別に管理できます。 Account Activity API のセットアップ方法について、ステップバイステップのガイドはありますか? はい!Getting Started with Webhooks ガイドAccount Activity API Sample Application を参照してください。 Account Activity API ではどの認証を使用する必要がありますか? 認証要件は endpoint ごとに定義されています。詳細は Authentication セクション を確認してください。 相互にやり取りしているユーザーにサブスクライブしている場合、アクティビティが重複して届きますか? はい。App がユーザー A とユーザー B に対するサブスクリプションを持ち、ユーザー A が Post でユーザー B に言及した場合、webhook には 2 件のイベント(各ユーザーにつき 1 件)が届きます。サブスクリプションを識別するには for_user_id フィールドを使用してください。 webhook へのサブスクリプションを作成する際、配信されるアクティビティを制限するために endpoint の /all/ 部分を他のアカウントアクティビティのデータオブジェクトに置き換えることはできますか? いいえ。/all/ プロダクトのみが選択可能で、サポートされているすべてのイベント type を配信します。 3 つの webhook へのアクセス権がある場合、Enterprise 用に登録した各 App に 3 つずつ webhook を使用できますか? webhook の上限は App 単位ではなくアカウント単位で設定されています。たとえば、3 つの webhook と 2 つの App がある場合、1 つの App に 2 つ、もう一方に 1 つを割り当てることはできますが、App ごとに 3 つずつはできません。

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
webhook 管理 endpoint(登録、表示、検証、削除)については、v2 Webhooks API ドキュメントを参照してください
I