invalid_api_key(401)の原因と直し方:Incorrect API key provided

この記事の要点
invalid_api_keyは、送ったAPIキーをOpenAIが認証できないときのHTTP 401です。メッセージはIncorrect API key providedで始まります。- Anthropicでは401の
authentication_errorで、メッセージはinvalid x-api-keyです。 - 原因の多くは、キーの余分な空白や改行、環境変数の読み込み漏れ、別のサービスのキーの取り違えです。
- まず
curlでキーだけを確かめると、キーの問題かコードの問題かを切り分けられます。
コードを変えていないのに急に401が出た場合は、キーの失効も疑います。
invalid_api_key のエラー本文
実際に無効なキーでOpenAI APIを呼ぶと、HTTP 401で次の本文が返ります(2026年11月10日に確認)。キーは途中が伏せられて表示されます。
{
"error": {
"message": "Incorrect API key provided: sk-doc-c****************-000. You can find your API key at https://platform.openai.com/account/api-keys.",
"type": "invalid_request_error",
"param": null,
"code": "invalid_api_key"
}
}
ヘッダー自体がない場合は、同じ401でも You didn't provide an API key. から始まるメッセージになり、code は null です。
Anthropicの authentication_error
Anthropic APIに無効なキーを送ると、HTTP 401で次の本文が返ります(同日に確認。request_id は一例です)。
{
"type": "error",
"error": {
"type": "authentication_error",
"message": "invalid x-api-key"
},
"request_id": "req_011CgvQYVzMW2xSesgpXWSRA"
}
Anthropicのドキュメントでは、キーの形式の誤り、失効、期限切れなどが原因に挙げられています。
よくある原因
OpenAIのエラーコードのガイドと、現場で起きやすいものを合わせると、次のとおりです。
| 原因 | 確かめ方 |
|---|---|
| キーの前後の空白や改行 | 長さを確かめる、コード側で strip() する |
| 環境変数が読み込まれていない | 同じシェルで長さを表示する |
| 削除または無効にしたキーが残っている | 新しいキーを作って差し替える |
| 別の組織やプロジェクトのキー | キーの発行元を確かめる |
| OpenAIのキーを別のサービスへ送っている | base_url とキーの組み合わせを確かめる |
| ヘッダーの種類の違い | Authorization か x-api-key かを確かめる |
curlで切り分ける
キーそのものを画面に出さず、長さと末尾の改行を確かめます。
echo "${#FASTMETAL_API_KEY}"
printf '%s' "$FASTMETAL_API_KEY" | tail -c 1 | od -c
次にモデル一覧を取得します。200 が返ればキーは有効で、問題はコードの側にあります。
curl -s -o /dev/null -w "%{http_code}\n" \
https://api.fastmetal.ai/v1/models \
-H "Authorization: Bearer $FASTMETAL_API_KEY"
Pythonでは、読み込んだ時点で空白を落としておきます。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["FASTMETAL_API_KEY"].strip(),
base_url="https://api.fastmetal.ai/v1",
)
print(len(client.models.list().data))
FastMetalのAPIキーの設定
FastMetalのAPIキーは sk- で始まり、作成時に一度だけ表示されます。ヘッダーは Authorization: Bearer です。キーをなくしたら、新しいキーを作り直します。
Claude Codeで使うときは、環境変数の名前に注意します。ANTHROPIC_API_KEY は x-api-key ヘッダーとして送られ、FastMetalでは拒否されます。ANTHROPIC_AUTH_TOKEN を使います。
export ANTHROPIC_AUTH_TOKEN="$FASTMETAL_API_KEY"
export ANTHROPIC_BASE_URL="https://api.fastmetal.ai"
ANTHROPIC_BASE_URL に /v1 は付けません。付けると /v1/v1/messages になり、404になります。詳しくはClaude Codeのガイドにあります。
FastMetalは、OpenAI互換とAnthropic互換のAPIを1つのキーで使える日本のAIゲートウェイです。料金は料金ページで確認できます。
よくある質問
作ったばかりのキーで401になります
コピーのときに端が欠けていないか、前後に空白が入っていないかを確かめます。環境変数を変えた後は、シェルやサーバーの再起動も必要です。
invalid_request_error なのに401なのはなぜですか
OpenAIの本文では type が invalid_request_error のまま、code が invalid_api_key になります。判定には code かHTTPステータスを使います。
APIキーをコードに書いても大丈夫ですか
避けます。環境変数やシークレットの管理機能から読み込み、リポジトリには入れません。漏れた可能性があるキーは、すぐに無効にして作り直します。
OpenAIのキーをFastMetalで使えますか
使えません。FastMetalで発行したキーを使い、base_url を https://api.fastmetal.ai/v1 に変えます。
まとめ
401が出たら、キーの空白と環境変数、接続先との組み合わせの順に確かめます。curl でモデル一覧を取得すれば、キーの問題かどうかはすぐに分かります。
FastMetalのキーは、無料でアカウントを作成すると発行できます。