X API 403 Forbidden:原因と対処法
公式 X API の403 Forbidden は、キーは有効でも X がこのリクエストを拒否していることを示します。原因はボディに書かれていて、従量課金に移行していないアプリから、2026年4月20日に廃止されたいいねやフォローまでさまざまです。
結論: レスポンスボディ全体を記録して、文言を照合してください。client-not-enrolled ならアプリを従量課金に移行する必要があります。Read-only のアプリやアプリ専用トークンでは投稿できません。フォロー、いいね、引用投稿には、いまは Enterprise 契約が必要です。公開投稿とプロフィールをこうした403なしで読み取るなら、Sorsa API をお使いください。API キー1つで、ツイート1,000件あたり$0.014からです。100回分の無料リクエストも付きます。
- エンドポイント
POST /tweet-info-bulk- 1ページの件数
- 1リクエストあたりツイート100件
- 料金
- 1,000件あたり$0.014から
#公式 X API の403 Forbidden とは
403は、X は誰からのリクエストかを把握したうえで、なおこの操作は行わないと言っている状態です。X のレスポンスコードのリファレンス(新しいタブで開きます)は、認証は有効だが、そのリソースや操作の権限がない状態と定義しています。401は別のケースで、認証情報そのものがないか、誤っています。
403の原因はどれも同じステータスを返すので、ステータスだけでは何もわかりません。手がかりはボディにあります。X は Problem Details の JSON で、title、detail、type を付けて返し、登録(enrollment)のエラーには reason が加わります。レスポンス全体を記録して、フィールドを自分で読んでください。
時間を節約できる習慣が2つあります。403のたびに、ボディと x-transaction-id レスポンスヘッダーを記録してください。開発者フォーラムで X のスタッフが案件を見るとき、最初に求めるのがこの2つです。そして、再試行しないでください。403は、アプリ、トークン、投稿、アカウントのどれかが変わらないかぎり、同じ結果が返ります。再試行すべきは429と5xxのエラーで、Twitter API エラーコードのガイドでコード別に解説しています。
#エラー文言から403を見つける
403のボディの文言を、下の表と照合してください。各行に原因と最初の対処法が書いてあります。ほとんどの行は書き込みによるもので、読み取りが失敗するのは、登録、スコープ、非公開アカウント、古い v1.1 の呼び出しの場合です。
| 403のボディにある文言 | 出る場所 | 原因 | 最初の対処法 |
|---|---|---|---|
"reason": "client-not-enrolled"、title は "Client Forbidden" | すべての v2 呼び出し | 廃止された Free パッケージにあるアプリ(単独のアプリ、または Project の外) | アプリを従量課金に移行し、新しいキーを作る |
| "Authenticating with OAuth 2.0 Application-Only is forbidden for this endpoint" | 投稿、/2/users/me、ブックマーク、DM | アプリ専用のベアラートークン | ユーザーコンテキストのトークンを使う |
"detail": "Forbidden" だけ | GET /2/users/me | tweet.read と users.read がないトークン | 両方のスコープを追加して、再認可する |
いいね、フォロー、quote_tweet_id への403 | /2/users/{id}/likes、/following、引用投稿 | 2026年4月20日にセルフサービスから削除 | Enterprise 契約のみ |
| "Reply to this conversation is not allowed because you have not been mentioned..." | リプライ | 2026年2月23日からの、呼びかけに応じたリプライのルール | メンションまたは引用されたときだけ返信する |
| $キャッシュタグが2つ以上ある投稿への403 | POST /2/tweets | セルフサービスは1投稿につきキャッシュタグ1つまで | キャッシュタグを1つにする |
| "This user is not allowed to post a video longer than N minutes." | 動画付きの投稿 | 投稿するアカウントの動画の長さの上限 | 動画を短くする |
| "You are not permitted to perform this action." | POST /2/tweets | X がこの投稿を拒否した。上記のルール、投稿の制限、スパムチェックのいずれか | 内容を確認し、頻度を落とす |
| "Your account is not permitted to access this feature." | POST /2/tweets | 投稿するアカウントへの書き込み制限 | 再試行をやめ、x.com でアカウントを確認する |
type が not-authorized-for-resource | 投稿やユーザーの読み取り | 非公開または保護されたコンテンツ | 対処不可。承認済みのフォロワーだけが読める |
dm- で始まる type、または "This operation is not permitted." | ダイレクトメッセージ | 受信者の設定か、安全性のチェック | type を読む。対処不要なことも多い |
| コード453、"You currently have access to a subset of X API V2 endpoints..." | v1.1 のエンドポイント | v1.1 はアクセス範囲外 | v2 のエンドポイントを呼ぶ |
"reason": "client-not-enrolled"、title は "Client Forbidden"- 出る場所
- すべての v2 呼び出し
- 原因
- 廃止された Free パッケージにあるアプリ(単独のアプリ、または Project の外)
- 最初の対処法
- アプリを従量課金に移行し、新しいキーを作る
"Authenticating with OAuth 2.0 Application-Only is forbidden for this endpoint"
- 出る場所
- 投稿、
/2/users/me、ブックマーク、DM - 原因
- アプリ専用のベアラートークン
- 最初の対処法
- ユーザーコンテキストのトークンを使う
"detail": "Forbidden"だけ- 出る場所
GET /2/users/me- 原因
tweet.readとusers.readがないトークン- 最初の対処法
- 両方のスコープを追加して、再認可する
いいね、フォロー、
quote_tweet_idへの403- 出る場所
/2/users/{id}/likes、/following、引用投稿- 原因
- 2026年4月20日にセルフサービスから削除
- 最初の対処法
- Enterprise 契約のみ
"Reply to this conversation is not allowed because you have not been mentioned..."
- 出る場所
- リプライ
- 原因
- 2026年2月23日からの、呼びかけに応じたリプライのルール
- 最初の対処法
- メンションまたは引用されたときだけ返信する
$キャッシュタグが2つ以上ある投稿への403
- 出る場所
POST /2/tweets- 原因
- セルフサービスは1投稿につきキャッシュタグ1つまで
- 最初の対処法
- キャッシュタグを1つにする
"This user is not allowed to post a video longer than N minutes."
- 出る場所
- 動画付きの投稿
- 原因
- 投稿するアカウントの動画の長さの上限
- 最初の対処法
- 動画を短くする
"You are not permitted to perform this action."
- 出る場所
POST /2/tweets- 原因
- X がこの投稿を拒否した。上記のルール、投稿の制限、スパムチェックのいずれか
- 最初の対処法
- 内容を確認し、頻度を落とす
"Your account is not permitted to access this feature."
- 出る場所
POST /2/tweets- 原因
- 投稿するアカウントへの書き込み制限
- 最初の対処法
- 再試行をやめ、x.com でアカウントを確認する
type が
not-authorized-for-resource- 出る場所
- 投稿やユーザーの読み取り
- 原因
- 非公開または保護されたコンテンツ
- 最初の対処法
- 対処不可。承認済みのフォロワーだけが読める
dm-で始まる type、または "This operation is not permitted."- 出る場所
- ダイレクトメッセージ
- 原因
- 受信者の設定か、安全性のチェック
- 最初の対処法
- type を読む。対処不要なことも多い
コード453、"You currently have access to a subset of X API V2 endpoints..."
- 出る場所
- v1.1 のエンドポイント
- 原因
- v1.1 はアクセス範囲外
- 最初の対処法
- v2 のエンドポイントを呼ぶ
#client-not-enrolled:アプリを従量課金に移行する
client-not-enrolled は、キーの背後にあるアプリが、そのエンドポイントに必要なアクセスに登録されていないことを意味し、読み取りも書き込みも、すべての v2 呼び出しが失敗します。2026年の原因は、ほとんどの場合、旧 Free パッケージに残されたアプリで、単独のアプリとして表示されるか、Project の外にあります。
{
"detail": "When authenticating requests to the X API v2 endpoints, ...",
"reason": "client-not-enrolled",
"required_enrollment": "Appropriate Level of API Access",
"title": "Client Forbidden",
"type": "https://api.x.com/2/problems/client-forbidden"
}
detail は Project について述べていますが、2026年の原因について X のスタッフの説明は明快です。Free プランは廃止されており、そこに残ったアプリは、従量課金に移るまでこのエラーが出ます。単独アプリが動かなくなった件のフォーラムスレッド(新しいタブで開きます)がその例です。同じ回答には、サインイン用のエンドポイントは従量課金でも無料のままだとも書かれています。
ボディに reason フィールドがなければ、問題は登録ではありません。投稿の普通の403は別のエラーだと、X のスタッフははっきり述べています。Project を移したり、キーを作り直したりしても解決しません。
-
Developer Console を開く。 console.x.com にサインインして、コードで使っているキーのアプリを探します。
-
パッケージを確認する。 従量課金と Production 環境が必要です。単独のアプリや、旧 Free、Basic、Pro の Project にあるアプリは失敗します。
-
従量課金に移行する。 支払い方法とクレジットを追加します。読み取りは項目ごとの課金で、投稿は1件$0.005、ユーザーは1件$0.010です。詳しくは、内訳をまとめた X API 料金をご覧ください。
-
新しいキーとトークンを作る。 ベアラートークンとアクセストークンを再生成してデプロイします。古いものは、古い登録のままです。
-
コンソールで移行できなければフォーラムで質問する。 数値の App ID、エンドポイント、ボディ全体を投稿してください。X のスタッフが、動かなくなったアプリを手動で移行した例があります。
#いいね、フォロー、引用投稿:セルフサービスから削除
2026年4月20日から、公式 X API は、どのセルフサービスのアプリに対しても、いいね、フォロー、引用投稿を行わなくなりました。そのため、アプリをどう設定してもこれらの呼び出しは403を返します。X の料金更新(新しいタブで開きます)には、POST と DELETE /2/users/{id}/likes、POST と DELETE /2/users/{id}/following、quote_tweet_id 付きで送られる投稿が挙げられており、投稿作成のリファレンス(新しいタブで開きます)にも、引用投稿には Enterprise プランが必要と書かれています。
セルフサービスとは、従量課金と、旧 Free、Basic、Pro のプランを指します。いいねとフォローは、すでに2025年8月22日に Free プランから外れていたので、それ以前に作ったボットは、1年以上前から失敗していたかもしれません。
設定でこれらを元に戻す方法はありません。新しいトークンも、like.write や follows.write のスコープも、クレジットの追加も、何も変えません。いまも書き込めるのは、月約$42,000からの Enterprise 契約だけです。各403がいつ登場したかは、次のタイムラインでわかります。
自分のコードが行う操作を選ぶと、セルフサービスのアクセスで今も許可されているか、返る403、対処法がわかります。
お使いのコードは、公式X APIで何をしますか?
-
ポスト、プロフィールの読み取り、または検索
従量課金で利用可能
- 費用
- 1ポスト$0.005、1ユーザー$0.010、ポスト読み取りは月3Mまで
- 403エラー
client-not-enrolledアプリが従量課金に移行していない場合;not-authorized-for-resource保護アカウントの場合- 対処
- console.x.comでアプリを従量課金に移行し、新しいキーを作成してください。Sorsa APIなら、アプリなしで、APIキー1つで同じ公開データを読み取れます。
-
自分のブックマーク、いいね、フォロワーの読み取り
利用可能、ユーザートークンのみ
- 費用
- 2026年4月20日以降、Owned Readsとして1件$0.001
- 403エラー
- アプリ専用のBearerトークンで「Unsupported Authentication」
- 対処
- ユーザーコンテキストのトークン(OAuth 1.0a、またはPKCE付きOAuth 2.0)で呼び出してください。
-
ポストの投稿
従量課金で利用可能
- 費用
- 1ポスト$0.015、URL付きは$0.20
- 403エラー
- 「You are not permitted to perform this action.」、または読み取り専用のアプリ
- 対処
- アプリをRead and writeに設定し、新しいアクセストークンを作成して、ユーザートークンで投稿してください。
-
ポストへの返信
呼び出された場合のみ
- 開始日
- 2026年2月23日、セルフサービスのみ
- 403エラー
- "Reply to this conversation is not allowed because you have not been mentioned or otherwise engaged by the author"
- 対処
- 自分のアカウントを@メンションしているポスト、またはそのポストを引用しているポストにだけ返信してください。
-
ポストの引用
セルフサービスから削除
- 開始日
- 2026年4月20日:
quote_tweet_idEnterpriseが必要 - 403エラー
- 次を含むすべてのポスト
quote_tweet_id - 対処
- 代わりにそのポストへのリンクを投稿するか、Enterprise契約に移行してください。
-
いいね、いいね解除
セルフサービスから削除
- 開始日
- 2026年4月20日、Freeティアからは2025年8月22日に削除
- 403エラー
POSTとDELETE /2/users/{id}/likes- 対処
- セルフサービスでは利用できません。APIでいいねできるのは、Enterprise契約のみです。
-
フォロー、フォロー解除
セルフサービスから削除
- 開始日
- 2026年4月20日、Freeティアからは2025年8月22日に削除
- 403エラー
POSTとDELETE /2/users/{id}/following- 対処
- セルフサービスでは利用できません。APIでフォローできるのは、Enterprise契約のみです。
-
キャッシュタグ($)付きのポスト
1ポストに1つ
- ルール
- セルフサービスのポストに含められるキャッシュタグは最大1つ
- 403エラー
- 2つ目のキャッシュタグを含むポスト:
$TICKER - 対処
- キャッシュタグは1つだけ残し、ほかのティッカーは$を付けずに書いてください。
-
長い動画の投稿
アカウントによって上限あり
- ルール
- 既定では20分、X Premiumでは125分(2026年9月1日に文書化)
- 403エラー
- "This user is not allowed to post a video longer than N minutes."
- 対処
- 動画を短くしてください。APIの予算を増やしても上限は上がりません。
-
ダイレクトメッセージの送信
受信者ごとに拒否される
- 開始日
- 2026年10月26日: 拒否ごとに専用のtypeが付く
- 403エラー
dm-recipient-not-accepting,dm-sender-not-verifiedおよびその他のdm-で始まるtype、または「This operation is not permitted.」- 対処
- typeを読んでください。拒否の多くは受信者の設定によるもので、コードでは解決できません。
-
v1.1エンドポイントの呼び出し
ほぼ閉鎖
- ルール
- セルフサービスで使えるのは、v2と、メディアアップロードなど一部のv1.1エンドポイントです
- 403エラー
- コード453: 「You currently have access to a subset of X API V2 endpoints and limited v1.1 endpoints only」
- 対処
- v2エンドポイントを呼び出してください。tweepyでは
tweepy.Clientを使います。使わないもの:tweepy.API.
セルフサービスとは、従量課金と、従来のFree、Basic、Proプランを指します。Xの変更履歴とドキュメントより、2026年11月2日に確認。
2026年11月時点で、公式X APIのセルフサービスで許可されている内容を、操作ごとにまとめています。
引用投稿には単純な回避策があります。quote_tweet_id の代わりに、投稿へのリンクを投稿するのです。X は URL を含む投稿に$0.20を課金し、通常の投稿は$0.015です。
#POST /2/tweets への403:トークン、リプライ、アカウント
従量課金では投稿が1件$0.015で利用できるので、POST /2/tweets への403は、トークン、投稿の内容、その背後のアカウントのどれかが原因です。この順番で確認してください。
Read-only のアプリ、またはアプリ専用トークン
投稿には、ユーザーコンテキストのトークンが必要です。アプリのコンシューマーキーにアカウントのアクセストークンとシークレットを組み合わせた OAuth 1.0a か、PKCE フローで取得した tweet.write スコープ付きの OAuth 2.0 トークンです。アプリ専用のベアラートークンでは、次の答えが返ります。
{
"title": "Unsupported Authentication",
"detail": "Authenticating with OAuth 2.0 Application-Only is forbidden ...",
"status": 403
}
新しいアプリは Read 権限で始まります。アプリのユーザー認証の設定を Read and write に切り替え、新しいアクセストークンとシークレットを作ってください。変更前に発行したトークンは、Read のままです。
「Reply to this conversation is not allowed」
2026年2月23日から、セルフサービスのアプリがリプライできるのは、元の投稿者が、返信するアカウントをメンションするか、そのアカウントの投稿を引用して呼びかけた場合だけになりました。X の変更履歴(新しいタブで開きます)によります。それ以外のリプライは、x.com では同じリプライが通っても、403と "Reply to this conversation is not allowed because you have not been mentioned or otherwise engaged by the author"(メンションも、投稿者からのその他の関与もされていないため、この会話への返信は許可されません)が返ります。リプライするボットは、メンションを起点に作ってください。自分のアカウントをメンションした投稿を読み取り、それに答えます。呼びかけに応じたリプライは X の料金も安く、$0.015に対して$0.010です。
キャッシュタグは1投稿に1つ、動画の長さ
セルフサービスの投稿に付けられる $キャッシュタグは1つで、2つ目を付けると X が投稿を拒否します。フォーラムのある事例では、余分なキャッシュタグを消しただけで解決しました。動画の上限は、API の利用額ではなく、投稿するアカウントで決まります。既定では20分、X Premium では125分です。それより長い動画には、"This user is not allowed to post a video longer than 20 minutes."(このユーザーは20分を超える動画を投稿できません)が返ります。
「You are not permitted to perform this action」
この about:blank の403は、1件の投稿に対する X の包括的な拒否です。まず上のルールを順に確認してください。呼びかけのないリプライ、2つ目のキャッシュタグ、引用投稿です。どれにも当てはまらなければ、アカウントが投稿の制限かスパムチェックに引っかかっています。頻度を落とし、同じ文面の投稿をやめて、x.com で手動で1件投稿してみてください。
「Your account is not permitted to access this feature」
この文言が指しているのは、アプリではなく投稿するアカウントです。2026年9月のフォーラムの事例では、自動投稿をまとめて行った直後に始まり、読み取りは動き続けていて、X のスタッフは、権限やクレジットの不足ではなく、アカウント単位の書き込み制限だと説明しました。自動化を止め、アカウントが x.com で投稿できるか確認し、API だけが失敗するなら、開発者フォーラムに x-transaction-id を投稿してください。
#読み取りへの403:スコープ、非公開アカウント、v1.1
読み取りが403を返すのは、アプリ、トークン、対象アカウントのどれかに問題がある場合で、本当にアクセスできないのは非公開アカウントだけです。client-not-enrolled は読み取りもブロックします。そのほかの読み取りの原因は次のとおりです。
GET /2/users/meが "Forbidden" だけを返す。 ユーザートークンにtweet.readとusers.readがありません。両方を認可 URL に追加し、ユーザーにもう一度認可してもらってください。既存のトークンは古いスコープのままです。- 自分のブックマーク、いいね、フォロワー。 これらの Owned Reads(自分のアカウントデータの読み取り)は1項目あたり$0.001で、ユーザーコンテキストのトークンが必要です。アプリ専用のトークンでは "Unsupported Authentication" が返ります。
- 非公開の投稿とアカウント。 type が
not-authorized-for-resourceで返ります。X のリファレンスは、非公開または保護されたコンテンツへのアクセス権がない状態と説明しています。一括取得では、同じ type が、読み取れる投稿と並んで、200のレスポンスのerrorsの中に入って届きます。 - v1.1 のエンドポイント。 セルフサービスのアクセスは、v2 と、メディアのアップロードなど一部の v1.1 エンドポイントを対象とし、残りはコード453を返します。tweepy では、
update_statusなどtweepy.APIの呼び出しは v1.1 に、tweepy.Clientの呼び出しは v2 に届きます。
非公開アカウントを除けば、これらの原因はどれもデータそのものとは関係ありません。アプリ、パッケージ、トークンに由来します。公開データを別の経路で読み取れば、これらを避けられるのはそのためです。
#tweepy と Node.js で403のボディ全体を出力する
ライブラリは既定でボディを隠します。tweepy は tweepy.errors.Forbidden: 403 Forbidden を、twitter-api-v2 は "Request failed with code 403" を投げます。どちらもレスポンスを保持しているので、推測する前に出力してください。
import tweepy
client = tweepy.Client(
consumer_key="API_KEY", consumer_secret="API_SECRET",
access_token="ACCESS_TOKEN", access_token_secret="ACCESS_SECRET",
)
try:
client.create_tweet(text="Testing the posting path")
except tweepy.errors.Forbidden as e:
print(e.api_messages) # X's detail text
print(e.response.headers.get("x-transaction-id"))
print(e.response.text) # the whole body: reason, type, title
そのうえで、文言を上の表と照合します。403を再試行するループは、時間を浪費するだけです。再試行するのは429と5xxのレスポンスで、バックオフを入れます。403は、原因を直してから、もう一度リクエストを送ってください。
知っておきたいこと
X の
detailは誤解を招くことがあります。client-not-enrolledの文言は、アプリがすでに Project の中にあって、本当の対処が従量課金への移行である場合でも、Project を求めます。また、"You are not permitted to perform this action" は、複数の異なる拒否をまとめた文言です。信頼する順番は、まずreasonとtype、次に自分が送ったリクエストです。
#403なしで公開 X データを読む:Sorsa API を使う
読み取りの403の大半は、公式 X API のセットアップから生じます。アプリ、そのパッケージ、トークン、そのスコープです。公開された投稿、プロフィール、フォロワー、検索結果を、このセットアップなしで読み取るなら、Twitter(X)API 兼スクレイピングツールである Sorsa API をお使いください。ApiKey ヘッダーに入れる API キー1つで、開発者アプリも、登録も、OAuth も不要です。そのため、上の読み取りの原因は1つも起こりません。
公開データを読む人にとって、双方で何が得られるかは次のとおりです。
| 読み取りで重要なこと | Sorsa API | 公式 X API |
|---|---|---|
| セットアップ | API キー1つ | 開発者アプリ、従量課金パッケージ、OAuth トークン |
| 投稿1,000件あたりの料金 | $0.014から | $5.00 |
| 速度 | 全プランで毎秒20リクエスト | エンドポイントごとに15分ウィンドウ |
| 月間の上限 | プランの範囲(最大10Mリクエスト)。追加リクエストも利用可 | 投稿の読み取り300万件。その後は Enterprise |
| X アカウント | 一切関わらない | アカウントに紐づくトークン |
セットアップ
- Sorsa API
- API キー1つ
- 公式 X API
- 開発者アプリ、従量課金パッケージ、OAuth トークン
投稿1,000件あたりの料金
- Sorsa API
- $0.014から
- 公式 X API
- $5.00
速度
- Sorsa API
- 全プランで毎秒20リクエスト
- 公式 X API
- エンドポイントごとに15分ウィンドウ
月間の上限
- Sorsa API
- プランの範囲(最大10Mリクエスト)。追加リクエストも利用可
- 公式 X API
- 投稿の読み取り300万件。その後は Enterprise
X アカウント
- Sorsa API
- 一切関わらない
- 公式 X API
- アカウントに紐づくトークン
-
キーを取得する。 サインアップして、ダッシュボードからキーをコピーします。100回分の無料リクエストが付き、カードは不要です。
-
ID で投稿を読み取る。
POST /tweet-info-bulk(新しいタブで開きます) は、1リクエストで最大100件の投稿 ID またはリンクを受け取り、各投稿を投稿者のプロフィール全体付きで返します。Terminal curl -X POST "https://api.sorsa.io/v3/tweet-info-bulk" \ -H "ApiKey: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"tweet_links": ["1853412966240727289", "1853398071322091822"]}'Response200 OK { "tweets": [ { "id": "1853412966240727289", "full_text": "Shipped the new export page today.", "created_at": "2026-10-30T14:02:11Z", "lang": "en", "likes_count": 184, "retweet_count": 22, "reply_count": 17, "quote_count": 3, "view_count": 9120, "is_reply": false, "user": { "id": "1592041833471827968", "username": "lena_ships_daily", "display_name": "Lena Ships", "followers_count": 4210, "verified": false, "protected": false } } ] } -
タイムラインを読む代わりに検索する。
POST /search-tweets(新しいタブで開きます) は X の検索コマンドを受け付け、1ページあたり約20件の投稿を返します。next_cursorが空になるまでページをたどります。Python import requests URL = "https://api.sorsa.io/v3/search-tweets" HEADERS = {"ApiKey": "YOUR_API_KEY"} body = {"query": "from:lena_ships_daily", "order": "latest"} posts = [] while True: r = requests.post(URL, headers=HEADERS, json=body, timeout=30) r.raise_for_status() # 403: missing key or no requests left data = r.json() posts += data.get("tweets", []) if not data.get("next_cursor"): break body["next_cursor"] = data["next_cursor"] print(len(posts), "posts") -
自分の残量を確認する。
GET /key-usage-info(新しいタブで開きます) は、キーの残りリクエスト数を表示し、そのリクエスト数には数えられません。
Sorsa API にも、短いエラーの一覧があります。ApiKey ヘッダーがない("missing key in request header")場合と、キーのリクエストを使い切った場合は403、キーが誤っている場合は401を返します。失敗したリクエストに課金されることはありません。
403がなくなれば、あとは料金で決まります。
公式 X API
$5,000
投稿100万件の場合
1件あたり$0.005
Sorsa API
$14から
投稿100万件の場合
1,000件あたり$0.014から
Sorsa API が読み取るのは公開データだけで、投稿、いいね、フォローはしないので、X アカウントが危険にさらされることはありません。投稿もするなら、書き込みには公式 X API のユーザーコンテキストのトークンを残し、読み取りはすべて Sorsa API で行ってください。この構成は、開発者アカウントなしで Twitter API を使うのガイドで手順を説明しています。
#書き込みは直し、読み取りは移す
公式 X API の403は、原因がボディに書かれています。X が今も販売している操作については、登録、トークン、投稿の内容を直してください。2026年4月20日にセルフサービスから外れたいいね、フォロー、引用投稿は、再試行をやめてください。公開投稿とプロフィールの読み取りには、Sorsa API をお使いください。API キー1つ、アプリの設定は不要で、ツイート1,000件あたり$0.014からです。最初の1万件のツイートは、すべてのアカウントに付く100回分の無料リクエストで足ります。
#よくある質問
公式 X API の401と403の違いは何ですか?
401は、X が認証情報を受け付けなかったことを意味します。キーがない、入力ミス、失効、署名の誤りです。403は、X が認証情報を受け付けたうえで、アプリの登録、トークンの権限、投稿の内容、アカウントのいずれかが理由で、リクエストを拒否したことを意味します。キーを再生成すると多くの401は直りますが、403はほとんど直りません。
公式 X API の403は再試行すべきですか?
いいえ。403は、アプリのパッケージ、トークン、投稿、アカウントの状態のどれかが変わらないかぎり繰り返されます。再試行するのは429と5xxのレスポンスだけで、バックオフを入れます。403では、ボディと x-transaction-id ヘッダーを記録し、文言を照合し、原因を直してから、リクエストを1回だけ送ってください。
2026年の公式 X API は無料ですか?
いいえ。Free プランは2026年2月6日に新規アプリの受け付けを終了し、X のスタッフはいま廃止と呼んでいます。従量課金では読み取りのたびに課金され、投稿は1件$0.005、ユーザーは1件$0.010です。無料のままなのはサインイン用のエンドポイントだけです。残っているものは、Twitter API は無料かの回答にまとめました。
403エラーなしで X データを読むには、どの API を使えばよいですか?
403エラーなしで公開 X データを読むには、Sorsa API をお使いください。API キー1つで、開発者アプリも、登録も、OAuth も不要です。そのため、読み取りの403の大半の原因となるセットアップが存在しません。バッチリクエストで100件の投稿を1,000件あたり$0.014から返し、全プランで毎秒20リクエスト、100回分の無料リクエストから始められます。
Sorsa API は403を返しますか?
返します。2つのケースがあります。ApiKey ヘッダーがない場合は、"missing key in request header" のメッセージとともに403を返し、キーのリクエストを使い切った場合も403です。キーが誤っている場合は代わりに401です。アップグレードか追加リクエストでアクセスはすぐに戻り、失敗したリクエストに課金されることはありません。
#検証の方法
2026年11月2日に、docs.x.com の X のレスポンスコードのリファレンス、料金ページ、投稿作成のリファレンス、変更履歴と、ここに引用したすべてのエラー文言について、上にリンクした開発者フォーラムのスレッドでの X のスタッフの回答を読みました。Sorsa API のリクエストは公開中の API リファレンスに従っています。表示したレスポンスは、その形式に沿った例で、データは架空のものです。
出典
- X API: Response codes and errors(新しいタブで開きます)
- X API: Pay-per-usage pricing(新しいタブで開きます)
- X API: Changelog(新しいタブで開きます)
- X API: Create post reference(新しいタブで開きます)
- X API: Manage posts(新しいタブで開きます)
- X Developer Community: pricing update effective April 20, 2026(新しいタブで開きます)
- X Developer Community: Free tier stuck as a standalone app(新しいタブで開きます)
- X Developer Community: POST /2/tweets 403 on pay-per-use(新しいタブで開きます)
- X Developer Community: "Your account is not permitted to access this feature"(新しいタブで開きます)
- X Developer Community: 403 when replying via the API(新しいタブで開きます)
- Sorsa API reference