本文へスキップ

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 が加わります。レスポンス全体を記録して、フィールドを自分で読んでください。

Anatomy of an official X API 403 response: status line, x-transaction-id header, detail, reason and type HTTP/1.1 403 Forbidden x-transaction-id: 7f3a91c2e05b44d1 { "title": "Client Forbidden", "detail": "When authenticating requests to the X API v2 endpoints, you must use keys and tokens from a developer App that is attached to a Project. You can create a ..." "reason": "client-not-enrolled", "required_enrollment": "...", "type": ".../problems/client-forbidden" } 1 ステータス403 理解したうえで拒否。 2 x-transaction-id Xの担当者が求めるID。 403を報告するとき。 3 detail Xの言葉。実際は従量課金へ アプリを移すのが修正でも 「Project」と出ることがある。 4 reasonとtype コードで照合できる 形式の原因。ログに残す。
ステータスは「拒否」としか言いません。理由は reason、type、detail が示します。x-transaction-id と合わせて、すべて記録してください。

時間を節約できる習慣が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/metweet.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つ以上ある投稿への403POST /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/tweetsX がこの投稿を拒否した。上記のルール、投稿の制限、スパムチェックのいずれか内容を確認し、頻度を落とす
"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 の外にあります。

403 body
{
  "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 を移したり、キーを作り直したりしても解決しません。

  1. Developer Console を開く。 console.x.com にサインインして、コードで使っているキーのアプリを探します。

  2. パッケージを確認する。 従量課金と Production 環境が必要です。単独のアプリや、旧 Free、Basic、Pro の Project にあるアプリは失敗します。

  3. 従量課金に移行する。 支払い方法とクレジットを追加します。読み取りは項目ごとの課金で、投稿は1件$0.005、ユーザーは1件$0.010です。詳しくは、内訳をまとめた X API 料金をご覧ください。

  4. 新しいキーとトークンを作る。 ベアラートークンとアクセストークンを再生成してデプロイします。古いものは、古い登録のままです。

  5. コンソールで移行できなければフォーラムで質問する。 数値の 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がいつ登場したかは、次のタイムラインでわかります。

Six official X API changes from August 2025 to October 2026 that created new 403 errors 2025年8月22日 いいねとフォローが Freeティアから除外 2026年2月23日 返信は投稿者が あなたを呼んだ場合のみ 2026年9月1日 動画の長さは 投稿アカウントで上限 2026年2月6日 従量課金が開始。Freeは 新規アプリの受付を終了 2026年4月20日 フォロー、いいね、引用投稿が 全セルフサービスから除外 2026年10月26日 DMの拒否が 独自の種類に
14か月間の6つの変更が、いま開発者が遭遇する403のほとんどを生みました。2026年4月20日には、3つの操作が完全に削除されました。

自分のコードが行う操作を選ぶと、セルフサービスのアクセスで今も許可されているか、返る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_id Enterpriseが必要
    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 トークンです。アプリ専用のベアラートークンでは、次の答えが返ります。

403 body
{
  "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 は 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
    アカウントに紐づくトークン
  1. キーを取得する。 サインアップして、ダッシュボードからキーをコピーします。100回分の無料リクエストが付き、カードは不要です。

  2. 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
          }
        }
      ]
    }
    
  3. タイムラインを読む代わりに検索する。 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")
    
  4. 自分の残量を確認する。 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 リファレンスに従っています。表示したレスポンスは、その形式に沿った例で、データは架空のものです。

Sorsa APIチーム 読み取り専用のX(Twitter)APIとスクレイピングツール、Sorsa APIを開発・運営しています。2022年から本番稼働し(旧TweetScout API)、累計60億リクエスト以上を処理しています。 Sorsa APIについて

変更点
  • 初公開。