Claude Media
「Your account is on hold」の意味と対処 — Claude Code

「Your account is on hold」の意味と対処 — Claude Code

「Your account is on hold」はログインでなくアカウント自体の停止を示します。再ログインで直らない理由、確認先、作業継続の方法、-pのaccount_on_holdまで扱います。

Claude CodeでYour account is on hold and can't use Claude Code.と表示されたら、ログイン情報ではなく、ログインしているClaudeアカウントそのものに停止(hold)がかかっています。/loginをやり直しても消えません。まず表示されたURLで停止の詳細を確認し、異議申し立てが必要かを見ます。解決を待つあいだは、停止の影響を受けない別のアカウントか、別組織のAPIキーで作業を続ける道があります。

「Your account is on hold」はどんな状態か

Claude Codeのエラー一覧には、このメッセージが認証エラーの1つとして載っています。意味は、ログインの裏にあるClaudeアカウントが停止されているということです。

表示される文言は2種類あります。

Your account is on hold and can't use Claude Code. View details or appeal: https://claude.ai/restricted
Your account is on hold and can't sign in to Claude Code. View details or appeal: https://claude.ai/restricted

出る場面が違います。

  • can't use Claude Code: 保存済みのログインを更新しようとして、停止を知ったとき
  • can't sign in to Claude Code: ブラウザーで済ませたサインインの結果が、停止を報告したとき

どちらも末尾のURLは同じです。そこに、停止の詳細の確認と異議申し立て(appeal)の入口があります。

再ログインしても直らない理由

停止はログインではなくアカウントに付いています。同じアカウントで/loginを繰り返しても、メッセージは消えません。

ログインが古くなっただけなら、再ログインで戻ります。停止との切り分けが、最初の判断になります。

「Not logged in」や/statusの表示との切り分け

似た症状にNot logged in · Please run /loginがあります。こちらは、そのセッションで使える認証情報が1つも無い状態で、/loginで認証すれば解消します。環境変数を当てにしていたなら、ANTHROPIC_API_KEYがエクスポートされているかも確かめます。停止中のアカウントでは、認証情報はあっても更新の段階で止まるため、この表示とは出方が違います。

Not logged inは、同じ設定ディレクトリを使う別のウィンドウでclaude.aiにサインインすると、対話セッションがそのログインを自動で拾います。再起動は要りません。ただしv2.1.286より前のmacOSでは、サインイン後も表示が残ることがあり、その場合は表示が出ているセッションを再起動します。Claude Desktopアプリが動かすセッション(CodeタブやCowork)では、文言がAuthentication required · Sign in again to continueになり、サインインはアプリ側でやり直します。

ログインの状態そのものは/statusで事前に見られます。保存済みのclaude.aiログインが有効な認証方式のとき、Login行にExpired — log in againと出れば、失効の側です(v2.1.210以降)。ここにExpiredが出ていない、または再ログインしても同じ停止メッセージに戻るなら、アカウントの停止を疑います。

「Login expired」との見分け方

見た目が近いメッセージにLogin expired · Please run /loginがあります。違いは原因の場所です。

項目Your account is on holdLogin expired
原因Your account is on holdアカウント自体の停止Login expired保存済みログインの更新に失敗
/loginのやり直しYour account is on hold効かないLogin expired効く
次の一手Your account is on hold表示URLで詳細確認・異議申し立てLogin expired/loginで入り直す
-p・Agent SDKのコードYour account is on holdaccount_on_holdLogin expiredauthentication_failed

Login expiredは、OAuthサービスが保存済みの更新トークンを拒否し、Claude Codeが保存済みの認証情報を消した状態です。その後はモデルへのリクエストをローカルで止め、/loginだけが新しい認証情報を作れます。更新の失敗がアカウントの停止によるときは、Login expiredではなく今回のメッセージが出ます。

Login expiredの側は、複数のセッションがトークンを取り合う問題と絡むことも多いです。そちらはclaude -pがOAuth session expiredで失敗する原因と回避策や何度もログインを求められる原因にまとめています。

まず表示されたURLを開く

最初の一手は1つだけです。メッセージ内のhttps://claude.ai/restrictedを開き、停止の詳細を確認します。異議申し立てが必要なら、同じ画面から進めます。

Claude Code側から解除する手段は、エラー一覧に載っていません。設定やコマンドで外せる種類の問題ではないため、ここで試行錯誤を重ねると、時間だけが過ぎます。

停止の中身を確かめる — 個人のアカウントか、所属組織か

表示されるURLはclaude.ai/restrictedで、ヘルプセンターの「Safeguards warnings and appeals」には、制限されたアカウントの画面で何ができるかが載っています。Claude Codeのエラー一覧は停止の理由に触れていないので、中身はこの画面と記事で確かめます。

ヘルプセンターの記事に書かれている要点は次のとおりです。

  • アカウントが止まる理由として、Usage Policyの繰り返しの違反、未対応の地域からのアカウント作成、利用規約違反が挙げられている
  • 誤って停止された、または削除されたと考えるときは、claude.aiに停止中のアカウントでログインし、同じ画面の異議申し立てフォームから送る。フォームを開くにはログインが必要
  • Free、Pro、Maxのアカウントが禁止された場合でも、claude.aiにログインしてデータの書き出しとアカウントの削除ができる。書き出せる範囲は、違反の内容によって制限されることがある
  • 自分のアカウントは問題なく、所属する組織が異常な利用を理由に止められている場合は、ログイン時にその旨が示される。制限画面に保留中の組織が一覧され、対象の組織で「Request a review」を押すと再確認を依頼できる

TeamやEnterpriseで会社のアカウントを使っているなら、止まっているのが自分のアカウントか組織かをまず見分けます。組織側が保留なら、異議の窓口は個人の申し立てフォームではなく組織の項目です。なお、これらはclaude.ai側の説明で、Your account is on holdの背後にある停止がどの種類かは、Claude Codeのメッセージからは分かりません。URLを開いた先の画面で決まります。

解決を待つあいだに作業を続ける方法

停止の影響を受けない別のClaudeアカウントや、別組織のAPIキーがあれば、停止の解決を待たずに作業を続けられます。エラー一覧は「停止の影響を受けないAPIキー」とだけ書いており、保留中の組織に紐づくキーが使えるかには触れていません。止まっている組織とは別のキーを選ぶと確実です。方法は次の2つです。

  1. 別のアカウントで/loginを実行する
  2. APIキーをANTHROPIC_API_KEYに設定する

APIキーで続けるときの例です。

export ANTHROPIC_API_KEY="sk-ant-..."
claude

APIキーを使う前に、次の点を押さえておくと迷いません。

  • 対話モードでは、キーを使うかどうかを最初に1回だけ聞かれ、答えは記憶されます。後から変えるときは/configの「Use custom API key」を使います。このトグルはANTHROPIC_API_KEYが設定されている間だけ表示されます
  • -p(非対話モード)では、キーがあれば常にそのキーが使われます
  • 認証情報が複数あるときの優先順位は、クラウドプロバイダーの認証情報、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_API_KEY、apiKeyHelper、CLAUDE_CODE_OAUTH_TOKEN、/loginによるサブスクリプションの順です
  • どの方式が有効かは/statusで確かめられます

キーが無効化された組織や期限切れの組織のものだと、認証エラーが続きます。その場合の見方はClaude Code「Invalid API key」エラーの原因と対処法が参考になります。ANTHROPIC_API_KEYとANTHROPIC_AUTH_TOKENの役割の違いはANTHROPIC_AUTH_TOKENとAPIキーの違いで扱っています。

-p・Agent SDKではaccount_on_holdで判定する

非対話モード(-p)とAgent SDKでは、構造化エラーコードがaccount_on_holdになります。CIやスクリプトから呼ぶ場合は、画面の文言を文字列で拾うよりも、このコードで分岐するほうが安定します。

Login expiredの側はauthentication_failedで、Failed to authenticate: OAuth session expired and could not be refreshedと出ます。2つのコードは別物なので、再ログインを促す処理をauthentication_failedにだけ付けておくと、停止中のアカウントで無駄な再ログインを促さずに済みます。

StopFailureフックで通知する

ターンがAPIエラーで終わったとき、StopFailureフックが走ります。入力JSONのerrorフィールドにaccount_on_holdが入るので、matcherで絞れます。次の設定は、停止のときだけ通知を出す形の一例です。

{
  "hooks": {
    "StopFailure": [
      {
        "matcher": "account_on_hold",
        "hooks": [
          {
            "type": "command",
            "command": "echo 'account on hold: https://claude.ai/restricted を確認' >&2"
          }
        ]
      }
    ]
  }
}

StopFailureは通知とログのためのフックで、決定を返す仕組みはありません。フックの出力や終了コードも、terminalSequenceを除いて無視されます。ここで停止を解除したり、別の認証に切り替えたりはできません。通知を飛ばすところまでが役割です。StopFailureの12種類のエラー値とmatcherの書き方はStopFailureフックの記事に表があります。

v2.1.235より前の挙動

v2.1.235より前のClaude Codeは、停止中のアカウントをLogin expired · Please run /loginとして報告していました。この表示の復旧手順は/loginなので、停止を解除できません。

古いバージョンを使っていてLogin expiredが続くときは、次の順に切り分けます。

  1. claude --versionでバージョンを確認する
  2. v2.1.235より前なら、更新してから同じ操作を試す
  3. 更新後にYour account is on holdへ変わったら、停止が原因だったと分かる
  4. 変わらなければ、通常のログイン失効として/loginを試す

更新で表示が切り替わったときは、Claude Code側の症状が変わっただけで、停止が新しく始まったわけではありません。

つまずきやすい点

別アカウントに切り替えても同じ表示が出る

環境変数のANTHROPIC_API_KEYやCLAUDE_CODE_OAUTH_TOKENが残っていると、/loginの結果より優先されることがあります。/statusで実際に使われている方式を見て、不要な変数をunsetします。

ログイン画面が新規登録に飛ぶ症状と混同する

ログインで新規登録画面に飛ばされる不具合は、アカウントの停止とは別の話です。Claudeログインで新規登録画面に飛ばされる不具合では、停止との見分け方も触れています。

まとめ

Your account is on holdは、再ログインで直す種類のエラーではありません。表示されたURLで停止の詳細を確認し、必要なら異議申し立てを進めるのが筋です。作業は、影響を受けない別アカウントの/loginか、別組織のANTHROPIC_API_KEYで続ける道があります。-pやAgent SDKではaccount_on_holdで分岐でき、v2.1.235より前ではLogin expiredとして見えていた点だけ覚えておけば、切り分けに迷いません。

この記事を共有:XはてブLinkedIn