| この記事の要点 |
|
X API とは(2026-10 時点の全体像)
X API は、X(旧 Twitter)の投稿・ユーザー・ダイレクトメッセージ・リスト・Spaces・トレンドなどをプログラムから扱うための公式 API です。2026-10 時点で新規開発の対象になるのは X API v2 で、エンドポイントは https://api.x.com/2/... の形をしています。
| バージョン・区分 | 公式ドキュメント上の位置付け(2026-10 時点) |
|---|---|
| X API v2 | 現行版(Current)。新機能はすべてここに追加される。新規プロジェクトは v2 を使うよう案内されている |
| v1.1(Standard) | レガシー(Legacy)。サポートは限定的で更新も最小限。将来的に廃止する意向が示されている |
| Enterprise | 大量データ向けの個別契約。専任サポート付き |
開発者登録とアプリ作成は Developer Console(console.x.com)で行います。X アカウントでサインインし、Developer Agreement に同意してアプリを作ると、API Key、Bearer Token などの認証情報が発行されます。発行手順の詳細は配下の登録ガイドで扱うので、本記事では料金体系と、それに伴って何が変わったかを中心に整理します。
料金体系はどう変わったか(経緯)
以前の X API は Free / Basic / Pro / Enterprise という月額の段階制(ティア)で、プランによって使えるエンドポイントや月間の上限が決まっていました。これが 2025 年秋から段階的に、使った分だけ払う方式へ切り替わっています。公式の変更履歴(changelog)で確認できる主な出来事は次のとおりです。
| 日付 | 出来事 |
|---|---|
| 2025-08-22 | 不正なエンゲージメント対策として、Free ティアから「いいね」と「フォロー」の作成エンドポイントを削除 |
| 2025-10-20 | クレジット制の従量課金を限定的なクローズドパイロットとして発表 |
| 2026-02-06 | 従量課金(Pay-Per-Use)を正式開始。新しい Developer Console(console.x.com)、公式 SDK「XDK」(Python / TypeScript)、ローカル検証用の Playground、AI 向けの MCP サーバーを同時に公開 |
| 2026-02-23 | LLM 生成のスパム対策。セルフサーブ(Enterprise 以外)では、API からの返信は元の投稿者に @メンションされた・引用された場合(summoned)に限定 |
| 2026-04-20 | 自分のデータの読み取り(Owned Reads)を 0.001 ドルに値下げ。投稿作成を 0.015 ドル、URL を含む投稿を 0.20 ドルに改定。API 経由のフォロー・いいね・引用投稿はセルフサーブの全ティアから削除 |
| 2026-10-02 | 従量課金アカウント向けの無料クレジット特典(カード登録で 20 ドル、初回自動チャージに最大 50 ドル)を開始 |
2026-02-06 の発表では、公益目的のアプリ(Public Utility Apps)は引き続き無料で拡張アクセスを受けられること、直近に利用のあった旧 Free ティア(Legacy Free tier)のユーザーには 1 回限りの 10 ドル分のバウチャーが配られることが告知されています。
従量課金(Pay-Per-Use)の仕組み
2026-10 時点の公式料金ページは「サブスクリプションは無く、使った分だけ払う」と明記しています。要点は次のとおりです。
- 前払いクレジット制: Developer Console で先にクレジットを購入し、API を呼ぶたびにリアルタイムで差し引かれる
- エンドポイントごとに単価が違う: 読み取りは「返ってきたリソース 1 件ごと」、書き込み・操作は「リクエスト 1 回ごと」に課金
- 契約・最低利用額なし: いつでも始めていつでも止められる
- 重複排除: 同じリソース(同じ投稿など)を UTC の同じ日のうちに何度取得しても課金は 1 回。UTC 0 時にリセットされる。ただし公式は「ソフトな保証」としており、障害時などは重複排除されない場合がある
- 月 300 万件の上限: 従量課金で読み取れる投稿は 1 請求サイクルあたり 300 万件まで
残高と支出のコントロール
| 機能 | 内容 |
|---|---|
| クレジット残高 | Developer Console に表示。残高がわずかにマイナスになることがあり、その場合は不足分を補充するまでリクエストがブロックされる |
| 自動チャージ(Auto-recharge) | 残高が設定した閾値を下回ったら、設定額を自動で追加購入する。チャージは 5 分に 1 回まで。残高が 0 以下のときは動かないので、手動で補充すると再開する |
| 支出上限(Spending limit) | 1 請求サイクルあたりの上限額を設定でき、到達すると次のサイクルまでリクエストがブロックされる。開発・テスト中の想定外の請求を防ぐ用途で推奨されている |
| 使用量 API | GET /2/usage/tweets で日ごとの投稿消費量を取得でき、予算管理やアラートに使える |
短時間に大量のリクエストを送る使い方では、自動チャージを有効にしていても 5 分の間隔より先に残高を使い切り、「クレジット不足」のエラーになることがあります。公式は、1 回のチャージ額をピーク時 5 分間の消費より十分大きくするよう案内しています。
単価一覧(2026-10 時点)
以下は公式料金ページに掲載されている単価です(米ドル)。公式は「価格は変更される場合がある」としており、最新の単価は Developer Console と developer.x.com の料金ページで確認するよう案内しています。
読み取り(返ってきたリソース 1 件ごと)
| リソース | 単価 |
|---|---|
| Posts: Read(投稿) | 0.005 ドル |
| User: Read(ユーザー) | 0.010 ドル |
| DM Event: Read(DM イベント) | 0.010 ドル |
| Following/Followers: Read(フォロー・フォロワー) | 0.010 ドル |
| List / Space / Community / Note: Read | 各 0.005 ドル |
| Like / Mute / Block: Read | 各 0.001 ドル |
| Profile Update: Read | 0.005 ドル |
書き込み・操作(リクエスト 1 回ごと)
| 操作 | 単価 |
|---|---|
| Post: Create(投稿作成) | 0.015 ドル |
| Post: Create(URL を含む投稿) | 0.200 ドル |
| Post: Create(summoned の返信) | 0.010 ドル |
| DM Interaction: Create / User Interaction: Create | 各 0.015 ドル |
| Interaction: Delete | 0.010 ドル |
| Content: Manage / List: Manage / Bookmark / Media Metadata | 各 0.005 ドル |
| List: Create / Privacy: Update | 各 0.010 ドル |
| Counts: Recent / Counts: All(投稿数の集計) | 0.005 ドル / 0.010 ドル |
| Trends | 0.010 ドル |
自分のデータは安い: Owned Reads
アプリの所有者が、認証済みの自分自身のデータを読む場合は Owned Reads として 1 件 0.001 ドル(1,000 件で 1 ドル)になります。対象は、パスの {id} が認証ユーザー本人で、そのユーザーがアプリの所有者である次のようなエンドポイントです。
GET /2/users/{id}/tweets(自分の投稿)、/mentions(自分へのメンション)、/liked_tweets/bookmarks、/followers、/following、/blocking、/muting/owned_lists、/followed_lists、/list_memberships、/pinned_lists
自分のアカウントの分析ダッシュボードや管理ツールのように、扱うのが自分のデータだけなら費用を大きく抑えられます。
費用の目安(単価からの試算)
上の単価から単純計算した目安です。重複排除や単価改定で実際の請求は変わるので、正確な額は Developer Console の使用量表示で確認してください。
| 使い方 | 計算 | 目安 |
|---|---|---|
| URL なしの投稿を月 300 回 | 300 回 × 0.015 ドル | 4.5 ドル |
| URL 入りの投稿を月 300 回 | 300 回 × 0.20 ドル | 60 ドル |
| 検索で他人の投稿を月 1 万件取得 | 10,000 件 × 0.005 ドル | 50 ドル |
| 自分の投稿を月 1 万件取得(Owned Reads) | 10,000 件 × 0.001 ドル | 10 ドル |
見落としやすいのが URL 入り投稿の単価です。通常の投稿の 10 倍以上になるため、ブログ更新の通知ボットのようにリンクを毎回付ける用途では、試算を URL 入りの単価で行う必要があります。
無料で使えるか(旧 Free プランと無料クレジット)
2026-10 時点の公式料金ページに無料プランは掲載されておらず、新規の開発者が月額 0 円で使い続ける方法は案内されていません。代わりに次の無料クレジットがあります。
| 特典 | 内容 | 主な条件 |
|---|---|---|
| カード登録 | 1 回限り 20 ドル | アカウントで最初のカードで、過去に支払いが無いこと。クレジット・デビットカードのみ(プリペイドは対象外) |
| 初回自動チャージの同額付与 | 初回チャージ額と同額、上限 50 ドル | 過去に自動チャージが成功したことが無いこと。設定しただけでは付与されず、初回の自動チャージが実際に成功した時点で付与 |
| xAI API クレジット還元 | X API クレジット購入額に応じて 0〜20% | 請求サイクル内の累計購入額が 200 ドル以上で 10%、500 ドル以上で 15%、1,000 ドル以上で 20%。xAI のチームと開発者アカウントの連携が必要 |
カード登録と自動チャージの特典は 2026-10-02 に展開が始まったもので、両方満たすと合計 70 ドルです。この無料クレジットは付与から 3 か月で失効し、購入したクレジットより先に消費されます。現金価値は無く、払い戻しや譲渡もできません。また、展開中のため、アカウントによってはまだ付与されない場合があると公式は注記しています。
旧 Basic / Pro を契約している場合
2026-02-06 の公式変更履歴では、従量課金の開始時点で「Basic と Pro は引き続き提供され、既存の契約者は従量課金に切り替えられる(opt in)」と説明されていました。一方、2026-10 時点の公式料金ページと API の紹介ページは従量課金だけを掲載し、サブスクリプションは無いと明記しています。
旧プランの契約者が従量課金へ移行する時期や移行後の初期設定は、公式ドキュメント上では確認できません。旧プランを契約している場合は、Developer Console の請求画面と開発者フォーラム(devcommunity.x.com)の告知で自分のアカウントの扱いを確認してください。なお、旧ティアの名残として、Developer Agreement の自己利用条項には「Pay-Per-Use、Basic、Pro は趣味・商用の試作・初期開発・限られた利用者向けのアプリ用で、それを超える場合は Enterprise が必要」という趣旨の記載があります。
従量課金と Enterprise の違い
| 項目 | 従量課金(Pay-Per-Use) | Enterprise |
|---|---|---|
| 料金 | クレジット制・使った分だけ | 個別契約 |
| 投稿読み取りの月間上限 | 300 万件 | 個別設定・上限なしも可 |
| Volume streams(Firehose 等) | なし | あり |
| Likes streams | なし | あり |
| エンゲージメント指標(Engagement metrics) | なし | あり |
引用投稿の作成(quote_tweet_id) | 不可 | 可 |
| レート制限 | 標準 | 個別・引き上げ可 |
| サポート | コミュニティフォーラム | 専任のアカウントマネージャー |
| 契約期間 | なし | 契約ベース |
公式ドキュメントでは、行政機関での利用は Enterprise が必要とされています。
主要エンドポイントと課金の考え方
旧ティア時代は「このエンドポイントは Basic 以上」のようにプランで使える範囲が決まっていましたが、従量課金では公式の一覧にあるエンドポイントは原則すべて利用でき、Enterprise 専用のものだけが別扱いです。代わりに、何件のリソースが返ったか・何回操作したかで費用が決まります。
| エンドポイント | 用途 | 課金の考え方・注意点 |
|---|---|---|
POST /2/tweets | 投稿作成 | 1 回 0.015 ドル(URL 入りは 0.20 ドル)。返信は summoned の場合に限られ、引用投稿は Enterprise のみ |
GET /2/tweets/search/recent | 直近 7 日間の投稿検索 | 返ってきた投稿 1 件ごとに Posts: Read。クエリは 512 文字まで |
GET /2/tweets/search/all | 全期間検索(2006 年まで遡れる) | 返ってきた投稿 1 件ごとに Posts: Read。クエリは 1,024 文字まで |
GET /2/tweets/counts/recent ・ /counts/all | 条件に合う投稿数の集計 | リクエスト 1 回ごとに 0.005 ドル / 0.010 ドル |
GET /2/users/:id | ユーザー情報 | 返ってきたユーザー 1 件ごとに User: Read |
GET /2/users/:id/tweets | ユーザーの投稿タイムライン | Posts: Read。本人のデータなら Owned Reads(0.001 ドル) |
GET /2/spaces | Spaces 情報 | Space: Read |
GET /2/tweets/search/stream | フィルタ付きストリーム | 配信された投稿が使用量に計上される。ルールは最大 1,000 件、接続は 1 本 |
2026-04-20 以降、API 経由のフォロー・いいね・引用投稿の作成はセルフサーブの全ティアから外されています。ボットで「自動フォロー」「自動いいね」をする設計は、従量課金では成り立たない点に注意してください。
認証方式の選び方
Developer Console でアプリを作ると、用途に応じて次の認証情報が発行されます。認証情報は一度しか表示されないので、その場でパスワードマネージャーなどに保存します。紛失した場合は再発行が必要で、古いものは無効になります。
| 認証情報 | 用途 |
|---|---|
| Bearer Token | App-only 認証。公開データの読み取り(検索、ユーザー検索など) |
| Client ID / Client Secret | OAuth 2.0 のユーザーコンテキスト。他のユーザーに代わって投稿・DM などを行う。必要な権限だけをスコープで要求でき、公式はこちらを推奨 |
| API Key / Secret | アプリの識別。トークン生成や OAuth 1.0a の署名に使う |
| Access Token / Secret | アプリ所有者自身のアカウントとして操作する(OAuth 1.0a)。テストや個人のボット向け |
2026-09-21 には、保存済みの OAuth 1.0a ユーザートークンを、ユーザーに再認可させずに OAuth 2.0 のアクセストークンとリフレッシュトークンに交換する仕組み(POST /2/oauth2/token のトークン交換)が追加されました。OAuth 1.0a で運用中のアプリを OAuth 2.0 に寄せる際に使えます。
最初のリクエストを送る
2026-02 から公式 SDK の XDK(Python / TypeScript)が提供されています。次は公式ドキュメントのクイックスタートと同じ、Bearer Token で直近の投稿を検索する Python の例です。
pip install xdk
from xdk import Client
client = Client(bearer_token="YOUR_BEARER_TOKEN")
for page in client.posts.search_recent(query="api", max_results=10):
if page.data and len(page.data) > 0:
print(page.data[0].text)
break
TypeScript 版は npm install @xdevplatform/xdk で導入します。コミュニティ製ライブラリでは、Python の Tweepy、Node.js の node-twitter-api-v2 なども公式ページで v2 対応ライブラリとして紹介されています。
従量課金では検索 1 回でも返ってきた件数分のクレジットを消費します。開発中は max_results を小さくするか、実際の API を呼ばずに v2 エンドポイントを模擬する公式のローカルサーバー X API Playground を使うと、クレジットを使わずに動作確認できます。使用量は次のように確認できます。
curl "https://api.x.com/2/usage/tweets" \
-H "Authorization: Bearer $BEARER_TOKEN"
レート制限と課金は別物
レート制限は「一定時間に何回呼べるか」、課金は「何件取得したか」で、公式も両者は別だと説明しています。制限内でも費用はかかり、逆に制限に達しても追加費用はかかりません。制限の窓は多くが 15 分または 24 時間で、ユーザートークンで呼べばユーザー単位、Bearer Token で呼べばアプリ単位で数えられます。
| エンドポイント | アプリ単位 | ユーザー単位 |
|---|---|---|
GET /2/tweets/search/recent | 450 回 / 15 分 | 300 回 / 15 分 |
GET /2/tweets/search/all | 1 回 / 秒、300 回 / 15 分 | 1 回 / 秒 |
POST /2/tweets | 10,000 回 / 24 時間 | 100 回 / 15 分 |
GET /2/users/:id | 300 回 / 15 分 | 900 回 / 15 分 |
残りの回数はレスポンスヘッダーで確認できます。上限を超えると HTTP 429 が返るので、x-rate-limit-reset(Unix 時刻)まで待ってから再試行します。
x-rate-limit-limit: 900
x-rate-limit-remaining: 847
x-rate-limit-reset: 1705420800
import time
import requests
def get_with_rate_limit(url, headers):
while True:
res = requests.get(url, headers=headers)
if res.status_code != 429:
return res
reset = int(res.headers.get("x-rate-limit-reset", 0))
wait = max(reset - time.time(), 60)
time.sleep(wait)
従量課金では、同じ投稿を同じ UTC 日のうちに取り直しても追加課金はされませんが、レート制限の回数は消費します。取得結果は手元にキャッシュし、リアルタイム性が必要ならポーリングではなくフィルタ付きストリームを使うのが公式の推奨です。
v1.1 から v2 への移行
v1.1 はレガシー扱いで、新機能は v2 にしか追加されません。公式のエンドポイント対応表から、よく使うものを抜き出すと次のとおりです。
| v1.1 | v2 |
|---|---|
POST statuses/update ・ POST statuses/destroy/:id | Manage Posts(POST /2/tweets ・ DELETE /2/tweets/:id) |
GET statuses/show ・ GET statuses/lookup | Posts lookup(GET /2/tweets) |
GET statuses/user_timeline ・ mentions_timeline ・ home_timeline | Timelines(ユーザー投稿・メンション・逆時系列ホーム) |
GET search/tweets | Recent search / Full-archive search |
GET statuses/filter | Filtered stream |
v2 ではレスポンスの構造も変わり、必要なフィールドを tweet.fields などで指定し、関連オブジェクトを expansions で展開して includes に受け取る形になっています。v1.1 のパーサーはそのままでは使えないので、公式のデータ形式移行ガイドを参照してください。
よくある質問
Q: 個人のボットで投稿だけしたい。いくらかかる?
A: 2026-10 時点の単価では、URL なしの投稿が 1 回 0.015 ドル、URL 入りが 1 回 0.20 ドルです。月額の固定費はありません。新規アカウントなら無料クレジット(最大 70 ドル、3 か月で失効)もあります。
Q: 以前のように無料プランで投稿できる?
A: 公式の料金ページに無料プランは無く、クレジットを購入して使う形です。公益目的のアプリ(Public Utility Apps)は無料の拡張アクセスを受けられると告知されています。
Q: 想定外の高額請求が心配
A: Developer Console で請求サイクルごとの支出上限を設定できます。上限に達するとリクエストが止まるので、開発・テスト中は必ず設定しておくのが安全です。前払い制なので、自動チャージを使わなければ購入した額以上は消費されません(残高がわずかにマイナスになる場合はあります)。
Q: 大量のデータを分析したい
A: 従量課金は投稿の読み取りが月 300 万件までです。それを超える量や、Firehose・Likes streams・エンゲージメント指標が必要な場合は Enterprise の問い合わせフォームから相談します。
Q: ボットから返信やいいねができなくなった
A: 2026-02-23 から、セルフサーブでの API 返信は元の投稿者に @メンションまたは引用された場合に限られました。いいね・フォロー・引用投稿の作成も 2026-04-20 にセルフサーブから外されています。エラーの見分け方は配下のエラー一覧の記事を参照してください。
関連
- Twitter (X) プラットフォーム完全ガイド 2026 (API / Premium / 競合)
- OAuth 2.0 認可フロー完全ガイド(Authorization Code / PKCE / Refresh
- Twitter (X) API「Bad Authentication data」原因と対処|OAuth 認証エラー
- REST API 設計完全ガイド(HTTP メソッド / リソース指向 / HATEOAS / OpenAPI / GraphQL 比較)
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38