Account Activity API v2 は現在、プロ で利用可能です。
Account Activity API (AAA) は、webhook を介して X のユーザーアカウントに関するリアルタイムのイベントを受信する手段を提供します。事前に設定した webhook に特定のユーザーアカウントを登録(サブスクライブ)すると、単一の接続で、あなたが所有または登録している 1 つ以上のアカウントから、Post、ダイレクトメッセージ、いいね、フォロー、ブロックなどの各種アクティビティの通知をアプリケーションが受け取れます。
この API は、ユーザーの操作に即時に反応する必要があるアプリケーションや、ユーザーアクティビティに基づいて最新状態を維持するアプリケーションの構築によく利用されます。webhook 登録ごとに、各ユーザーのサブスクリプションに対して以下の関連アクティビティをすべて受信します。
- 投稿(ユーザーによる)
- 投稿の削除(ユーザーによる)
- @メンション(ユーザーへの)
- 返信(ユーザーから/ユーザーへの)
- リポスト(ユーザーによる/ユーザーへの)
- 引用投稿(ユーザーによる/ユーザーへの)
- 引用投稿のリポスト(ユーザーによる/ユーザーへの)
- いいね(ユーザーによる/ユーザーへの)
- フォロー(ユーザーによる/ユーザーへの)
- フォロー解除(ユーザーによる/ユーザーへの)
- ブロック(ユーザーによる/ユーザーへの)
- ブロック解除(ユーザーによる/ユーザーへの)
- ミュート(ユーザーによる/ユーザーへの)
- ミュート解除(ユーザーによる/ユーザーへの)
- ダイレクトメッセージの送信(ユーザーによる)
- ダイレクトメッセージの受信(ユーザーによる)
- 入力中の表示(ユーザーへの)
- 既読通知(ユーザーへの)
- サブスクリプションの取り消し(ユーザーによる)
注記: Account Activity API ではホームタイムラインの data は配信しません。該当の data を取得するには、User ID ベースの User Posts タイムラインのエンドポイントを使用してください。
| ティア | 料金 | 一意のサブスクリプション数 | Webhook 数 |
|---|
| プロ | 月額 $5000 | 3 | 1 |
| エンタープライズ | 営業に連絡 | 5000+ | 5+ |
本書では、v2 Account Activity API のエンドポイントを用いて、Webhook に関連付けられたユーザーサブスクリプションの管理方法に焦点を当てます。
Account Activity API は、あなたのサービスにサブスクライブしている X アカウントでイベントが発生するたびに、webhook ベースの JSON メッセージを送信します。X は登録済みの webhook にそのアクティビティを配信します。以下の手順では、ユーザーアカウントのサブスクリプションの設定と管理方法を説明します。
現在、Account Activity API v2 は User Auth 2.0 をサポートしていません。対応中であり、OAuth 2.0 がサポートされ次第、ドキュメントを更新します。
承認済みの開発者アカウントを使用して、開発者ポータルで X のアプリを作成します。会社を代表してアプリを作成する場合は、企業の X アカウントを使用してください。
- アプリのページの権限タブで「Read, Write, and Access direct messages」を有効にします。
- 「Keys and Access Tokens」タブで、アプリの Consumer Key (API Key)、Consumer Token (API Secret)、および Bearer Token を控えてください。
- アプリの Access Token と Access Token Secret を生成します。これらはユーザーアカウントを購読する際に必要です。
- X のサインインやユーザーコンテキストに不慣れな場合は、Obtaining Access Tokens を確認してください。
- 開発者ポータルの「Apps」ページに表示されるアプリの数値 id を控えてください。これは Account Activity API のアクセス申請時に必要です。
2. Account Activity API へのアクセスを取得
Account Activity API はエンタープライズ層でのみ利用できます。エンタープライズアクセスの申請は開発者ポータルから行ってください。
Account Activity イベントを受信するには、公開アクセス可能な HTTPS URL を持つ webhook を登録する必要があります。Webhook コンシューマーアプリの開発、webhook の登録、セキュリティ対策、Challenge-Response Checks (CRC) の処理に関する詳細は、V2 Webhooks API ドキュメントを参照してください。
- Webhook が、JSON でエンコードされたイベントペイロードを含む POST リクエストを処理できるように設定されていることを確認してください。
- サブスクリプションを管理するために必要となるため、webhook 登録のレスポンスから webhook_id を取得してください。
アプリと webhook が正しく構成されていることを確認するには:
- ユーザーアカウントを webhook にサブスクライブします(下記の「Adding a Subscription」を参照)。
- アプリがサブスクライブしている 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 で送信されたものを含む)は、DMアクティビティをアプリで把握できるよう、webhook を介して配信されます。
- イベントの重複:
- 2人のサブスクライブ済みユーザーが同じDM会話にいる場合、webhook は重複したイベントを受信します(ユーザーごとに1件)。識別には for_user_id フィールドを使用してください。
- 複数のアプリが同じ webhook URL とユーザーを共有している場合、イベントは複数回(アプリごとに1回)送信されます。
- 発生しうる重複に対応するため、アプリ側でイベントIDに基づく重複排除を行ってください。
- サンプルコード: webhook イベントを表示する Web アプリについては、Account Activity API Setup を参照してください。
有効な webhook_id を持つ登録済みの webhook がある場合は、ユーザーの購読を管理して、そのアカウントのアクティビティを受信できます。以下のエンドポイントを使用して、購読の追加、表示、または削除を行ってください。
エンドポイント: POST /2/account_activity/webhooks/:webhook_id/subscriptions/all
説明: 指定した webhook を通じてイベントを受け取るよう、認証中のユーザーをサブスクライブします。
認証: OAuthUser(対象ユーザーを表す 3 段階の OAuth フローが必要)。
- Consumer Key: 例: xvz1evFS…
- Access Token: 例: 370773112-GmHxMAgYyLbN…
パスパラメータ:
| パラメータ | 説明 |
|---|
| webhook_id | サブスクリプションに関連付ける webhook の id。 |
リクエスト:
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"'
レスポンス:
{
"data": {
"subscribed": true
}
}
| 理由 | 説明 |
|---|
| WebhookIdInvalid | 提供された webhook_id が見つからない、またはアプリに関連付けられていません。 |
| DuplicateSubscriptionFailed | このユーザーのサブスクリプションは、指定された webhook_id に対してすでに存在します。 |
| SubscriptionLimitExceeded | アプリケーションは、すべての webhook におけるサブスクリプションの上限に達しています。 |
エンドポイント: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all
説明: 認証ユーザーが指定の webhook に登録しているかを確認します。
認証: OAuthUser(3-legged OAuth フローが必要)。
パスパラメータ:
| パラメータ | 説明 |
|---|
| webhook_id | 確認対象の webhook の id。 |
リクエスト:
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"'
レスポンス:
{
"data": {
"subscribed": true // または false
}
}
| 理由 | 説明 |
|---|
| WebhookIdInvalid | 指定された webhook_id が見つからないか、アプリに関連付けられていません。 |
エンドポイント: DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
説明: 特定のユーザーIDのサブスクリプションを無効化し、webhook へのイベント配信を停止します。
認証: OAuth2 アプリ専用 Bearer トークン。
- Bearer トークン: 例: AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn…
パスパラメータ:
| パラメータ | 説明 |
|---|
| webhook_id | サブスクリプションを含む webhook の ID。 |
| user_id | サブスクリプションを解除する対象ユーザーの数値ID。 |
リクエスト:
bash
curl --request DELETE --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/:USER_ID/all' \
--header 'authorization: Bearer <BEARER_TOKEN>'
レスポンス:
{
"data": {
"subscribed": false
}
}
| 理由 | 説明 |
|---|
| SubscriptionNotFound | 指定された user_id に対するサブスクリプションは、指定の webhook_id には存在しません。 |
| WebhookIdInvalid | 提供された webhook_id が見つからないか、アプリに関連付けられていません。 |
エンドポイント: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
説明: 指定したウェブフックに現在登録されているすべてのユーザーIDの一覧を取得します。
認証: OAuth2 アプリ専用ベアラートークン
パスパラメータ:
| パラメータ | 説明 |
|---|
| webhook_id | サブスクリプションを一覧表示する対象のウェブフックのid。 |
リクエスト:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all/list' \
--header 'authorization: Bearer <BEARER_TOKEN>'
レスポンス:
{
"data": {
"application_id": "<あなたのアプリのid>",
"webhook_id": "<webhookのid>",
"webhook_url": "<webhookのコールバックURL>",
"subscriptions": [
{ "user_id": "<user_id_1>" },
{ "user_id": "<user_id_2>" }
]
}
}
| 理由 | 説明 |
|---|
| WebhookIdInvalid | 指定された webhook_id が見つからないか、アプリに関連付けられていません。 |
エンドポイント: GET /2/account_activity/subscriptions/count
説明: 認証中のアプリに対し、アクティブなサブスクリプションの総数と割り当て上限を返します。
認証: OAuth2 App Only ベアラートークン。
リクエスト:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/subscriptions/count' \
--header 'authorization: Bearer <BEARER_TOKEN>'
レスポンス:
{
"data": {
"account_name": "<アプリ名>",
"provisioned_count": "<割り当て済みのサブスクリプション上限>",
"subscriptions_count_all": "<現在の有効なサブスクリプション数>",
"subscriptions_count_direct_messages": "0" // DM のみのサブスクリプションはサポート対象外になりました
}
}
AAAv2 には、指定した時間範囲の過去のイベントを取得し、webhook に再配信できるリプレイ機能があります。これは、ダウンタイムにより取り逃したイベントの復旧に役立ちます。
エンドポイント: POST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all
説明: リプレイジョブを開始します
認証: OAuth2 App Only Bearer Token
パスパラメータ:
| パラメータ | 説明 |
|---|
| webhook_id | リプレイを開始する webhook の id |
クエリパラメータ:
| パラメータ | 説明 |
|---|
| 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 分以上前である必要があります。 |
レスポンス:
成功:
200
{
"for_user_id": "<USER_ID>"
"replay_event": {
"job_id": <REPLAY_JOB_ID>",
"created_at: "yyyy-mm-ddThh:mm:ss.000Z"
}
}
失敗:
| 理由 | 説明 |
|---|
| 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 が無効であるか、アプリに関連付けられていません。 |
リプレイジョブが正常に完了すると、X は次のジョブ完了イベントを送信します。このイベントを受信した時点で、そのジョブの実行は終了しており、別のジョブを提出できます。
{
"replay_job_status": {
"webhook_id": "<WEBHOOK_ID>",
"job_state": "完了",
"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_events | Post、リツイート、返信、@メンション、引用Tweet、または引用Tweetのリツイートに関するPostのステータス。 |
| favorite_events | ユーザーと対象を伴う「いいね」イベント。 |
| follow_events | ユーザーと対象を伴うフォローイベント。 |
| unfollow_events | ユーザーと対象を伴うフォロー解除イベント。 |
| block_events | ユーザーと対象を伴うブロックイベント。 |
| unblock_events | ユーザーと対象を伴うブロック解除イベント。 |
| mute_events | ユーザーと対象を伴うミュートイベント。 |
| unmute_events | ユーザーと対象を伴うミュート解除イベント。 |
| user_event | ユーザーがアプリの認可を取り消した際の失効イベント(サブスクリプションは自動的に削除)。 |
| direct_message_events | 送受信メッセージのDMステータス。 |
| direct_message_indicate_typing_events | ユーザーと対象を伴うDMの入力中イベント。 |
| direct_message_mark_read_events | ユーザーと対象を伴うDMの既読イベント。 |
| tweet_delete_events | コンプライアンス目的のPost削除通知。 |
| spaces_events | 現在は未対応。近日対応予定。 |
以下は各 Account Activity イベントのペイロード例です。
{
"for_user_id": "2244994945",
"tweet_create_events": [
{
<Tweet オブジェクト>
}
]
}
{
"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 Object>
},
"user": {
<User Object>
}
}]
}
follow_events
{
"for_user_id": "2244994945",
"follow_events": [{
"type": "follow",
"created_timestamp": "1517588749178",
"target": {
<User Object>
},
"source": {
<User Object>
}
}]
}
unfollow_events
{
"for_user_id": "2244994945",
"follow_events": [{
"type": "フォロー解除",
"created_timestamp": "1517588749178",
"target": {
<User Object>
},
"source": {
<User Object>
}
}]
}
block_events
{
"for_user_id": "2244994945",
"block_events": [{
"type": "block",
"created_timestamp": "1518127020304",
"source": {
<User Object>
},
"target": {
<User Object>
}
}]
}
unblock_events
{
"for_user_id": "2244994945",
"block_events": [{
"type": "unblock",
"created_timestamp": "1518127020304",
"source": {
<User Object>
},
"target": {
<User Object>
}
}]
}
mute_events
{
"for_user_id": "2244994945",
"mute_events": [
{
"type": "mute",
"created_timestamp": "1518127020304",
"source": {
<User Object>
},
"target": {
<User Object>
}
}
]
}
unmute_events
{
"for_user_id": "2244994945",
"mute_events": [
{
"type": "unmute",
"created_timestamp": "1518127020304",
"source": {
<User Object>
},
"target": {
<User Object>
}
}
]
}
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 opinions-are-my-own",
"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"
}
}
}
{
"for_user_id": "930524282358325248",
"tweet_delete_events": [
{
"status": {
"id": "1045405559317569537",
"user_id": "930524282358325248"
},
"timestamp_ms": "1432228155593"
}
]
}
V2 Account Activity API は現在、280文字を超えるlongformの Post をサポートしています。longform の Post が tweet_create_events のペイロードに含まれる場合、text フィールドには先頭の140文字(またはそれ以下)が入り、truncated フィールドは true に設定されます。全文は extended_tweet オブジェクトで提供され、次を含みます:
- full_text: 280文字の上限を超える部分も含む、Post の完全なテキスト。
- entities: フルテキストに含まれるエンティティ(例: ハッシュタグ、URL、ユーザーのメンション、シンボル)。280文字以降のものも含む。
- display_text_range: フルテキストを考慮した表示対象の文字範囲。
これにより、テキスト後半に現れるメンションやその他のエンティティも含め、アプリケーションは longform の Post の内容全体を処理できます。以下は、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": "写真で見る歴史",
"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:レガシーエンタープライズから v2 への移行
移行ガイドをご覧ください。
Account Activity API を使用する利点は何ですか?
Account Activity API は webhook を使用し、オープンな接続(ストリーミング API とは異なる)や頻繁なポーリング(REST API とは異なる)を必要とせずに、データをリアルタイムで配信します。主な利点は次のとおりです。
- 速度: X のスピードでデータを配信します。
- シンプルさ: 単一の webhook 接続で、Posts、@mentions、Replies、Reposts、Quote Tweets、Likes、DMs、Follows、Blocks、Mutes を含むすべてのアカウントイベントを受け取れます。
- スケール: レート制限やイベント上限なしで、管理対象アカウントのすべてのアクティビティをサポートします(エンタープライズ階層)。
Account Activity API 用に開発・ステージング・本番の各環境が必要です。これは可能ですか?
はい。複数の webhook URL を登録し、V2 Webhooks API でサブスクリプションを個別に管理できます。
Account Activity API のセットアップ方法について、ステップバイステップのガイドはありますか?
はい。Getting Started with Webhooks ガイド と Account Activity API サンプルアプリケーション を参照してください。
Account Activity API ではどの認証を使用する必要がありますか?
認証要件はエンドポイントごとに定義されています。詳細は Authentication セクション を参照してください。
相互にやり取りしているユーザーにサブスクライブしている場合、重複するアクティビティを受け取りますか?
はい。アプリがユーザー A とユーザー B を購読していて、ユーザー A が Post でユーザー B に言及した場合、webhook には 2 件のイベント(各ユーザーにつき 1 件)が届きます。サブスクリプションを識別するには for_user_id フィールドを使用してください。
自分の webhook にサブスクリプションを作成する際、配信されるアクティビティを制限するために、エンドポイントの /all/ 部分を他のアカウントアクティビティのデータオブジェクトに置き換えることはできますか?
いいえ。/all/ プロダクトのみが利用可能で、サポートされているすべてのイベントタイプを配信します。
3 つの webhook へのアクセス権がある場合、エンタープライズ用に登録した各アプリで 3 つの webhook を使用できますか?
webhook の上限はアカウント単位で設定されており、アプリ単位ではありません。たとえば、webhook が 3 つ、アプリが 2 つある場合、1 つのアプリに 2 つ、もう 1 つのアプリに 1 つを割り当てることはできますが、各アプリで 3 つずつ使用することはできません。
Account Activity API リファレンス索引
| 目的 | V2 エンドポイント |
|---|
| アプリをアカウントのイベントにサブスクライブします | 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 管理エンドポイント(登録、参照、検証、削除)については、V2 Webhooks API ドキュメントを参照してください