Twitter API の 429・403・401 エラー:原因と対処法
X (Twitter) API の 429 Too Many Requests、403 Forbidden、401 Unauthorized を解決します。公式 X API と TwexAPI それぞれでの意味、確認すべきヘッダー、リトライしてよいケースをまとめました。
結論: 429 はリクエストが多すぎるので待つ必要がある、403 は認証は通っているが権限がない、401 は認証情報がないか間違っている、という意味です。待てば直るのは 429 だけです。403 と 401 は、リクエスト・認証情報・アクセス権を変えない限り同じエラーが返り続けます。
| コード | 意味 | まず確認すること | リトライ |
|---|---|---|---|
| 429 Too Many Requests | レート制限、利用上限、またはアカウントの 1 日上限に到達 | x-rate-limit-reset または Retry-After ヘッダー |
✅ 指定時間を待ってから |
| 403 Forbidden | 認証済みだが、このエンドポイント・操作・アカウントへの権限がない | アプリのアクセス権、トークンの種類、権限、Credits、対象アカウント | ❌ 先に権限を直す |
| 401 Unauthorized | 認証情報がない、無効、期限切れ、または署名が不正 | Authorization ヘッダーと、使っているキーやトークン |
❌ 先に認証情報を直す |
API を直接呼んでいても、ツール上でエラーを見ていても対処は同じです。Request failed with status code 401 や status code 429 といったメッセージは HTTP クライアント(n8n や多くの Node.js ボットが使う axios など)が出すもので、中身は呼び出した API のステータスコードです。
まず、どの API が返したエラーかを確認する
同じコードでも、返した側によって原因が変わります。
- 公式 X API(
api.x.comまたはapi.twitter.com):アプリ、プロジェクト、OAuth、レート制限ウィンドウに関する X 開発者プラットフォームのルールに従います。 - TwexAPI(
api.twexapi.io):TwexAPI の API キー、Credits、書き込み操作で渡した X セッションに関するエラーです。一覧は TwexAPI エラーコードリファレンス を参照してください。 - x.com のサイトや X アプリ:閲覧中に出る “Rate limit exceeded” は X がアカウントに課している制限で、開発者向け API とは関係ありません。
Twitter API 429 Too Many Requests
公式 X API の場合
X はエンドポイントごとに、通常 15 分または 24 時間のウィンドウで、アプリ単位・ユーザー単位の制限をかけています。レスポンスには次の 3 つのヘッダーが付きます。
| ヘッダー | 意味 |
|---|---|
x-rate-limit-limit |
現在のウィンドウで許可されたリクエスト数 |
x-rate-limit-remaining |
現在のウィンドウの残りリクエスト数 |
x-rate-limit-reset |
ウィンドウがリセットされる Unix タイムスタンプ |
制限を超えると HTTP 429 が返ります。旧 v1.1 形式のボディではエラーコード 88 と Rate limit exceeded、新しい problem 形式では rate-limit-exceeded タイプになります。レート制限ではなく利用上限に達した場合は usage-capped です。
対処法:
x-rate-limit-resetまで待つ。 それより前にリトライしても429が返るだけです。x-rate-limit-remainingを監視する。 ゼロになってからではなく、その前にペースを落とします。- 1 日の上限を確認する。 投稿やいいねなど一部の書き込みエンドポイントには、アプリ単位・ユーザー単位の 24 時間上限があり、数分待ってもリセットされません。
- キャッシュしてリクエストを分散する。 同じプロフィールやツイートを何度も取得せず、すべてのジョブを毎時 0 分に一斉起動しないようにします。
従量課金の X API では、レート制限と課金は別物です。制限内のリクエストでも料金は発生するので、キャッシュは枠の節約にも費用の節約にもなります。
TwexAPI の場合
TwexAPI の 429 は、リクエストのスロットリングか、書き込み操作中に X アカウントの上限に達したこと(X コード 344 の投稿制限やコード 502 の 1 日の DM 上限など)を示します。Retry-After ヘッダーや retry_after フィールドがあればそれに従ってください。アカウントの 1 日上限は短いリトライでは解消せず、リセットまで待つ必要があります。バックオフとページングを壊さない復旧方法は レート制限 を参照してください。
ブラウザの x.com や X アプリの場合
X はアカウントごとに読み込める量を制限しています。スクロール中に “Rate limit exceeded” が出たら、少し待ってから再読み込みし、不要なタブや自動更新する拡張機能を閉じ、多人数で共有するネットワークや VPN の出口を避けてください。アカウントなしで公開プロフィールを見たいだけなら、無料の Twitter ビューアー も使えます。
Twitter API 403 Forbidden
403 は、X または TwexAPI が認証情報を認識したうえでリクエストを拒否したことを意味します。同じリクエストを繰り返しても同じ 403 が返ります。
公式 X API の場合
| 原因 | 典型的な症状 | 対処法 |
|---|---|---|
| アプリがプロジェクトに属していない、またはアクセス権がない | client-forbidden タイプ。古いレスポンスではコード 453(“You currently have access to a subset of…”) |
Project に紐づいたアプリのキーを使い、アカウントのアクセス範囲にそのエンドポイントが含まれているか確認します |
| トークンの種類が違う | アプリ専用(app-only)の Bearer Token で投稿・いいね・フォロー・DM をしている | ユーザーコンテキストのトークン(OAuth 1.0a の access token と secret、または OAuth 2.0 のユーザートークン)を使います |
| 権限やスコープが足りない | Read only のアプリで発行したユーザートークン、または tweet.write などのスコープがない OAuth 2.0 トークン |
アプリの権限を Read and write(DM が必要なら Direct Messages も)に変更し、access token と secret を再生成するか、ユーザーに再認可してもらいます |
| 保護された、または利用できないリソース | not-authorized-for-resource タイプ |
対象アカウントが非公開か、コンテンツが制限されています。ユーザーが閲覧できる対象をリクエストしてください |
| 重複や制限された操作 | 同じ文面の投稿、返信制限のあるツイート、いいね済みのツイート | 内容を変えるか、現在の状態を確認してからリトライします |
アプリの権限を変えても、発行済みのトークンは更新されません。Read and write に切り替えたら必ずユーザートークンを再生成してください。そうしないと投稿は 403 のままです。
TwexAPI の場合
TwexAPI の 403 は主に次のいずれかです。
- Credits 不足:Get Balance で残高を確認し、ダッシュボード でチャージしてください。
- 対象アカウントが非公開または凍結:承認されたフォロワー以外は投稿を読めません。公開アカウントを対象にしてください。
- アカウントや操作の制限:書き込みに使う X アカウントが凍結・ロックされている、ツイートが返信を制限している(X コード
433)、または X Premium が必要な操作です。
各メッセージと対処法は エラーコードリファレンス にまとめています。
Twitter API 401 Unauthorized
401 は、リクエストが本人確認に失敗したことを意味します。認証情報を直さない限り、何度リトライしても成功しません。
公式 X API の場合
- ヘッダーの形式が不正:アプリ専用リクエストは
Authorization: Bearer <token>の形でなければなりません。Bearerの付け忘れ、余分な引用符、環境変数末尾の改行はすべて401になります。 - 認証情報の再生成・失効:開発者ポータルでキーを再生成すると、古いキーは即座に無効になります。保存している箇所をすべて更新してください。
- 認証情報の組み合わせ違い:OAuth 1.0a には consumer key と secret に加えてユーザーの access token と secret が必要です。別アプリのキーを混ぜたり、トークンが必要な場所に API キーを入れたりすると
401になります。 - OAuth 1.0a の署名エラー:コード
32(Could not authenticate you)はたいてい署名の誤りです。パラメーターの URL エンコードと、サーバーの時刻が正確かを確認してください。タイムスタンプがずれると署名は無効になります。 - OAuth 2.0 ユーザートークンの期限切れ:ユーザーのアクセストークンには有効期限があります。
offline.accessスコープを要求し、リフレッシュトークンで新しいトークンを取得してください。
TwexAPI の場合
- API キーがない、または間違っている:ダッシュボード で取得したキーを
Authorization: Bearer YOUR_API_KEYで送ってください。詳しくは 認証 を参照してください。 - 書き込みエンドポイントでの X セッション期限切れ:投稿・いいね・DM で
Invalid auth_tokenや X コード32が返った場合、cookieで渡した X セッションの認証情報が期限切れです。それを更新すれば解決し、API キーには問題ありません。
成功しうるリクエストだけをリトライする
次の Python ヘルパーは 429 と一時的な 5xx だけをリトライし、それ以外のステータスはすぐに返します。Retry-After(TwexAPI や多くの HTTP API)と x-rate-limit-reset(公式 X API)の両方に対応しています。
import random
import time
import requests
def request_with_retry(method, url, max_attempts=5, **kwargs):
for attempt in range(max_attempts):
response = requests.request(method, url, timeout=30, **kwargs)
if response.status_code != 429 and response.status_code < 500:
return response # success, or a 4xx that waiting won't fix
wait = None
retry_after = response.headers.get("Retry-After", "")
reset_at = response.headers.get("x-rate-limit-reset", "")
if retry_after.isdigit():
wait = int(retry_after)
elif reset_at.isdigit():
wait = max(0, int(reset_at) - time.time()) + 1
if wait is None:
wait = min(300, 5 * 2 ** attempt) + random.uniform(0, 1)
time.sleep(wait)
return response
ページングしながら読み込む場合、429 の後は次のページではなく同じカーソルでリトライしてください。書き込み操作は、再送する前に投稿・いいね・DM がすでに反映されていないか確認します。タイムアウトは失敗の証明にはなりません。
公式の制限そのものが問題なら
読み取りで何度も 429 に当たる、あるいは従量課金の請求額が必要なデータ量以上に膨らむなら、従量課金のサードパーティ API と比べてみてください。TwexAPI の読み取りはツイート 1,000 件あたり約 0.05 ドルで、API キーだけで使え OAuth の設定は不要です。公式 X API は投稿の読み取り 1,000 件あたり 5 ドルです。TwexAPI と公式 X API の比較 と X API 料金計算ツール も参考にしてください。TwexAPI は X Corp. とは提携・承認関係にありません。
Twitter API 429・403・401 のよくある質問
Twitter API の 429 はどのくらいで解除されますか?
x-rate-limit-reset が示す時刻までで、通常は 15 分以内です。投稿など 24 時間の上限があるエンドポイントは、1 日のウィンドウがリセットされるまでブロックされます。TwexAPI では Retry-After または retry_after に従ってください。
X API でツイートを投稿すると 403 Forbidden になるのはなぜですか?
多くの場合、トークンに書き込み権限がありません。アプリ専用の Bearer Token を使っている、アプリが Read only になっている、または Read and write に変更する前に発行したユーザートークンを使っている、のいずれかです。書き込み権限を有効にし、ユーザートークンを再生成して、ユーザーコンテキストの認証で投稿してください。
n8n の “Request failed with status code 401” はどういう意味ですか?
その HTTP ノードの認証情報を X API または TwexAPI が拒否したという意味です。Authorization ヘッダーが Bearer と有効なキーまたはトークンになっているか、認証情報が再生成されていないか、書き込み操作でユーザーコンテキストの認証情報を使っているかを確認してください。TwexAPI での設定例は n8n ガイド にあります。
403 と 429 の違いは何ですか?
429 はリクエストが多すぎるので待つ必要があるという意味で、403 はそもそもそのリクエストが許可されていないという意味です。429 は待てば解決しますが、403 はアクセス権、権限、Credits、対象のいずれかを変える必要があります。
Twitter のエラーコード 88 とは何ですか?
X のエラーコード 88 は Rate limit exceeded を意味し、HTTP 429 とともに返されます。x-rate-limit-reset まで待ってから次のリクエストを送ってください。
Twitter のエラーコード 32 とは何ですか?
X のエラーコード 32 は Could not authenticate you を意味し、HTTP 401 とともに返されます。公式 API では OAuth 1.0a の署名やトークンの誤りが主な原因です。TwexAPI の書き込みエンドポイントでは、渡した X セッションの認証情報が期限切れであることを示します。
関連ページ
- Twitter API エラーコードリファレンス:TwexAPI の全ステータスと X エラーコード、その対処法
- レート制限:バックオフ、
Retry-After、ページングを壊さない復旧 - エラーハンドリング:MCP、SDK、書き込み操作の復旧
- 認証:API キーと X セッションの認証情報