TwexAPI で X の Cashtag 投稿を検索する方法
Cashtag は、市場に関する会話を検索しやすいラベルに変えます。ユーザーが $TSLA、$NVDA、$BTC について投稿したとき、POST https://api.twexapi.io/twitter/cashtags を使うと関連する X 投稿を取得し、監視ワークフローに組み込めます。
この記事の目的は明確です。投稿を取得し、必要なフィールドを正規化し、レビューキューに送ります。このエンドポイントが提供するのはソーシャル上の文脈であり、それ単体を投資助言や売買シグナルとして扱うべきではありません。
このエンドポイントが向いている場面
Search Cashtags は、1 つ以上の市場シンボルについて、現在どのような投稿が出ているかを追いたいときに使えます。主な用途は次の通りです。
- 特定 ticker の議論を動かしている投稿を追跡する。
- センチメント分析やトピック分析のため、言語別のサンプルを集める。
- 高エンゲージメント投稿を抽出し、人が確認する。
- あるシンボルへの注目が急に増えたとき、社内アラートを出す。
金融領域では境界を明確にしておく必要があります。Cashtag の活発さは「何が話題か」を示しますが、その情報が正確か、重要か、すでに価格に織り込まれているかまでは示しません。
リクエストモデル
POST /twitter/cashtags に JSON body を送り、Authorization: Bearer <token> で認証します。
| フィールド | 型 | 説明 |
|---|---|---|
cashtags | 文字列配列 | 検索するシンボル。$ は付けても付けなくても構いません。例:["AAPL", "TSLA"]。 |
startTime / endTime | string または null | 検索範囲を指定する UNIX タイムスタンプ文字列。 |
sortBy | "Latest" または "Top" | 監視には Latest、高エンゲージメント投稿の確認には Top が向いています。 |
maxItems | integer | 返却数。1 から 1000。 |
mininumLikes / mininumRetweets / mininumReplies | integer | エンゲージメントのフィルタ。ドキュメント通り、mininum という綴りで送ります。 |
blueVerified / verified | boolean | 認証アカウントで絞り込む任意フィルタ。 |
language | string | en、ja、zh などの言語コード。 |
onlyImage / onlyVideo / onlyQuote / onlyReply | boolean | 投稿タイプの任意フィルタ。広いサンプルが欲しい場合は未指定にします。 |
基本リクエスト
次の例は、3 つのシンボルに言及する英語投稿を新着順で取得します。
1curl --request POST \
2 --url https://api.twexapi.io/twitter/cashtags \
3 --header 'Authorization: Bearer <token>' \
4 --header 'Content-Type: application/json' \
5 --data '{
6 "cashtags": ["TSLA", "NVDA", "BTC"],
7 "startTime": "1775726400",
8 "endTime": "1775727300",
9 "sortBy": "Latest",
10 "maxItems": 50,
11 "language": "en",
12 "mininumLikes": 5
13 }'成功レスポンスには code、msg、data が含まれます。data の各要素は tweet オブジェクトで、よく使うフィールドは tweet_id、text、full_text、created_at、created_at_datetime、favorite_count、retweet_count、reply_count、quote_count、cashtags、hashtags、media、ユーザー情報などです。
1{
2 "code": 200,
3 "msg": "success",
4 "data": [
5 {
6 "tweet_id": "1803006263529541838",
7 "text": "Example post mentioning $TSLA",
8 "created_at_datetime": "2024-06-17T03:51:48.000Z",
9 "favorite_count": 123,
10 "retweet_count": 45,
11 "reply_count": 8,
12 "cashtags": ["$TSLA"]
13 }
14 ]
15}Python クライアント
まずは API 呼び出しを小さく明確にします。このクライアントは raw な data 配列を返し、保存・並び替え・レビューはアプリ側で行います。
1import os
2from typing import Any
3
4import requests
5
6API_URL = "https://api.twexapi.io/twitter/cashtags"
7TOKEN = os.environ["TWEXAPI_BEARER_TOKEN"]
8
9def search_cashtags(
10 cashtags: list[str],
11 *,
12 start_time: str | None = None,
13 end_time: str | None = None,
14 sort_by: str = "Latest",
15 max_items: int = 50,
16 language: str | None = "en",
17 min_likes: int = 0,
18) -> list[dict[str, Any]]:
19 payload: dict[str, Any] = {
20 "cashtags": cashtags,
21 "sortBy": sort_by,
22 "maxItems": max_items,
23 "mininumLikes": min_likes,
24 }
25
26 if start_time:
27 payload["startTime"] = start_time
28 if end_time:
29 payload["endTime"] = end_time
30 if language:
31 payload["language"] = language
32
33 response = requests.post(
34 API_URL,
35 headers={
36 "Authorization": f"Bearer {TOKEN}",
37 "Content-Type": "application/json",
38 },
39 json=payload,
40 timeout=30,
41 )
42 response.raise_for_status()
43 return response.json().get("data", [])
44
45if __name__ == "__main__":
46 tweets = search_cashtags(["TSLA", "NVDA", "BTC"], max_items=25, min_likes=5)
47 for tweet in tweets[:5]:
48 text = tweet.get("full_text") or tweet.get("text") or ""
49 print(tweet.get("tweet_id"), tweet.get("cashtags"), text[:140])レビューキューを作る
最初の実用版として価値が高いのは、センチメントダッシュボードよりも、分析担当者が次に見るべき投稿を示すクリーンなレビューキューです。
1def review_row(tweet: dict[str, Any]) -> dict[str, Any]:
2 favorite_count = tweet.get("favorite_count") or 0
3 retweet_count = tweet.get("retweet_count") or 0
4 reply_count = tweet.get("reply_count") or 0
5 quote_count = tweet.get("quote_count") or 0
6 engagement = favorite_count + retweet_count + reply_count + quote_count
7
8 return {
9 "tweet_id": tweet.get("tweet_id"),
10 "created_at": tweet.get("created_at_datetime") or tweet.get("created_at"),
11 "cashtags": ", ".join(tweet.get("cashtags") or []),
12 "language": tweet.get("lang"),
13 "engagement": engagement,
14 "text": tweet.get("full_text") or tweet.get("text") or "",
15 "url": f"https://x.com/i/status/{tweet.get('tweet_id')}",
16 }
17
18tweets = search_cashtags(["TSLA", "NVDA"], sort_by="Latest", max_items=100)
19rows = sorted((review_row(tweet) for tweet in tweets), key=lambda row: row["engagement"], reverse=True)
20
21for row in rows[:10]:
22 print(row["engagement"], row["cashtags"], row["url"])この rows をデータベース、スプレッドシート、社内レビュー画面に保存できます。tweet_id を一意キーとして保存しておくと、定期実行時の重複を防げます。
監視パターン
実用的な監視ループは、次の 5 つで構成できます。
- 追跡したいシンボルに対して
sortBy: "Latest"で検索する。 - 新しい投稿を
tweet_idと raw response payload で保存する。 - 返信、リポスト、いいね、引用、投稿時刻から簡単なレビュー優先度を計算する。
- 優先度が高い行だけを人や下流分析へ渡す。
- 価格データ、ニュース検証、コンプライアンス確認は別システムで扱う。
この設計にすると、ノイズの多いソーシャル投稿を過度に精密なシグナルとして扱う失敗を避けられます。API は会話を返し、ワークフローが注目すべき内容を決めます。
よくある落とし穴
- エンゲージメントフィルタは
mininumLikes、mininumRetweets、mininumRepliesというドキュメント上の名前を使います。 startTimeとendTimeは通常の日付文字列ではなく、UNIX タイムスタンプ文字列で送ります。- 結果をかなり狭めたい場合を除き、
onlyImage、onlyVideo、onlyQuote、onlyReplyを同時にtrueにしないでください。 - フィルタ調整中は小さい
maxItemsから始め、有用な結果になってから増やします。 - Cashtag 投稿はソーシャルデータです。冗談、スパム、噂、組織的な投稿が混ざる可能性があります。
まとめ
POST /twitter/cashtags は、株式や暗号資産のシンボルに関する X 投稿を集めるための集中したエンドポイントです。安定した流れは、正しい cashtag を検索し、時間と言語で絞り込み、レスポンスを正規化し、tweet_id で重複排除し、投稿をレビューへ回すことです。
金融調査の代わりではなく、会話を監視するために使うのが適切です。