Base URLとは?APIのURL構造と401・404エラーの切り分け方
Base URLは、APIサーバーまたはAPIゲートウェイの基点となるアドレスです。クライアントはそこへ特定のendpointを追加し、最終的なリクエストURLを作ります。本記事ではBase URL、endpoint、完全なURLの違いを整理し、OpenAI-compatibleクライアントとClaude Codeで使うBetterTokenのアドレスを示したうえで、401、404、405、model not found、HTML応答、timeout、古い設定が残る問題を順番に切り分けます。
目次
API Keyを作成済みなのに、クライアントが401、404、405、model not foundを返す、ログインページが開く、またはJSONではなくHTMLが返る場合、Key・モデル・アドレスを一度に変更しないでください。まずBase URLとは何かを明確にし、プロトコル → 基点アドレス → APIバージョン → endpoint → 認証 → モデルの順で確認します。
Base URLは、APIサーバーまたはAPIゲートウェイの基点となるアドレスです。 クライアントライブラリ、SDK、CLIが特定のリソースを示すパス、つまりendpointを追加し、完全なリクエストURLを作ります。
以下ではBetterTokenを例にしますが、同じ考え方は他のAPIゲートウェイ、自前のプロキシ、OpenAI-compatibleまたはAnthropic-compatibleなサービスにも使えます。
APIにおけるBase URLとは
最も簡単な式は次のとおりです。
完全なリクエストURL = Base URL + Endpoint Path
OpenAI-compatibleなリクエストの例です。
Base URL: https://www.bettertoken.ai/v1
Endpoint: /responses
完全なURL: https://www.bettertoken.ai/v1/responses
もう一つの代表的なendpointが/chat/completionsです。
Base URL: https://www.bettertoken.ai/v1
Endpoint: /chat/completions
完全なURL: https://www.bettertoken.ai/v1/chat/completions
実際のアプリでは、クライアントが二つの部分の間にあるスラッシュを調整することが一般的です。重要なのは文字列を手作業でどう結合するかではなく、クライアントが後から追加するパスをBase URL欄へ先に書いていないかです。
API URLを構成する要素
https://www.bettertoken.ai/v1/responsesを分解します。
| 要素 | 例 | 役割 |
|---|---|---|
| スキーム | https:// | 接続方法を指定する |
| ホスト | bettertoken.ai | APIサービスのドメインを示す |
| ベースパス | /v1 | APIバージョンや共通入口を示す |
| endpoint | /responses | 特定のリソースや処理を指定する |
Base URLがスキームとドメインだけのサービスもあれば、/v1のようなベースパスを含むサービスもあります。「常に/v1を付ける」という共通ルールはありません。利用中のサービスとクライアントの最新ドキュメントを確認してください。
Base URLではないもの
| 混同しやすいもの | Base URLとの違い |
|---|---|
| Webサイトのトップページ | HTMLを返すことがある。API Base URLはプログラムからのリクエスト用 |
| 完全なリクエストURL | /responses、/chat/completions、/v1/messagesなどのendpointを含む |
| API Key | Keyは認証用。Base URLは送信先を決める |
| Model ID | 呼び出すモデルを選ぶが、プロトコルや経路は選ばない |
| MCPサーバーのアドレス | MCPはツールやデータを接続するもので、モデルAPIのBase URLではない |
ブラウザーで開けることは、正しいBase URLである証明にはなりません。有効なAPIルートでも読みやすいページを表示しないことがあります。逆に、正常に表示されるログインページはAPIではなくWebサイト側のルートかもしれません。
モデル名ではなく、クライアントのプロトコルで選ぶ
同じモデルゲートウェイがOpenAI-compatibleとAnthropic-compatibleの両方の入口を提供する場合があります。GPT、Claude、Kimi、GLMのどれを使うかより、クライアントがどのプロトコルを期待しているかが重要です。
現在のBetterTokenドキュメントでは、次のように使い分けます。
| クライアントまたは用途 | 一般的なプロトコル | 入力するBase URL | クライアントが追加するパス |
|---|---|---|---|
| Codex | OpenAI Responses | https://www.bettertoken.ai/v1 | /responses |
| Cursor、Cline、OpenCodeなど | OpenAI-compatible | https://www.bettertoken.ai/v1 | /chat/completionsなど、クライアントが選ぶendpoint |
| Claude Code | Anthropic-compatible | https://bettertoken.ai | /v1/messages |
| 自分で書くHTTPリクエスト | リクエスト形式による | 使用するプロトコルのアドレス | コード内でendpointを明示する |
詳しくはOpenAI-compatible APIとAnthropic-compatible APIの違いを参照してください。Claudeモデルを使うからという理由だけで、すべてのツールにAnthropic用アドレスを設定してはいけません。GPTモデルを使う場合も、クライアントが要求するプロトコルを無視できません。
Base URLを確認する5つの手順
一度に一つの設定だけを変更し、変更のたびに同じ短いリクエストを送ります。これで原因となったレイヤーを特定できます。
1. クライアントが要求するプロトコルを確認する
ツール内のproviderまたはAPI typeを確認します。
- CodexはOpenAI Responsesを使います。
- Cursor、Cline、OpenCodeなどは通常OpenAI-compatible providerを使います。
- Claude CodeはAnthropic-compatibleなMessagesプロトコルを使います。
- 自作スクリプトでは、コードに実装したリクエスト形式がプロトコルを決めます。
プロトコルが合っていない場合、モデルを変えても直りません。リクエストフィールド、認証方式、endpointが異なるためです。
2. 完全なendpointではなく、基点アドレスだけを入力する
base_url、Base URL、API base、endpoint baseという欄は、通常、共通のルートアドレスを求めています。
正しい例:
https://www.bettertoken.ai/v1
よくある誤り:
https://www.bettertoken.ai/v1/responses
https://www.bettertoken.ai/v1/chat/completions
クライアントが/responsesを自動追加する場合、最初の誤りは次のURLになります。
https://www.bettertoken.ai/v1/responses/responses
Claude CodeのANTHROPIC_BASE_URLにもhttps://www.bettertoken.ai/v1/messagesを入れないでください。Claude Code自身が/v1/messagesを追加します。
3. /v1が一度だけ現れることを確認する
OpenAI-compatibleクライアント向けのBetterToken Base URLには、すでに/v1が含まれています。SDKにapi_version、path_prefixなどの別設定があっても、ドキュメントに明記されていない限り、二つ目の/v1を追加しないでください。
ログに次のURLがあれば、ほぼ確実に結合ミスです。
https://www.bettertoken.ai/v1/v1/responses
反対に、OpenAI-compatibleなリクエストに/v1がまったくない場合、404、JSONではなくHTML、ログインページへのリダイレクトが起こることがあります。
4. 最小のリクエストでendpointを試す
streaming、tools、MCP、長いコンテキストを無効にし、同じクライアントから短い一文だけを送ります。最初から実際のリポジトリで書き込み可能なタスクを実行しないでください。
Codexを起動します。
codex
次のように入力します。
短い一文だけで答えてください:接続は成功しています。
Claude Codeを起動します。
claude
次のように入力します。
短い一文だけで答えてください:接続は成功しています。
生のHTTPリクエストを使う場合は、SetupまたはModel Plazaで現在利用可能なModel IDを指定します。現行のCodexガイドではgpt-6-astraが例として使われていますが、実際にKeyから利用できるモデルはDashboardで確認してください。最小テストが成功してからstreaming、tools、長いタスクを戻します。
5. クライアントを完全に再起動する
多くのCLI、デスクトップアプリ、エディター拡張は、起動時にだけ環境変数や設定ファイルを読み込みます。ファイルを保存しても、実行中のプロセスが新しい値を読み込んだとは限りません。
変更後は次の手順を実行します。
- CLI、デスクトップアプリ、エディターウィンドウを閉じる。
- 関連するバックグラウンドプロセスも終了したことを確認する。
- 新しいターミナルを開くか、アプリを再起動する。
- 同じ短いテストを繰り返す。
そうしないと、画面上では新しい設定を見ながら、実際には古いBase URLを試すことになります。
よくあるエラーの読み方
| 症状 | 最初に確認すること | 次の対応 |
|---|---|---|
404 Not Found | /v1の重複、endpointの重複、プロトコル不一致 | ログの実リクエストURLとドキュメントを比較する |
| HTMLやログインページ | APIではなくWebルートへ送っていないか | ホスト、/v1、endpointを確認する |
401 | API Key、認証変数、実際に使われている設定 | Key前後の空白を除き、再起動する |
403 | Keyに対象モデルや経路の権限があるか | SetupまたはDashboardで利用可否を確認する |
405 Method Not Allowed | HTTP methodとendpoint | POSTなど、要求されるmethodを確認する |
model not found | Model IDより先にBase URLとプロトコル | 経路ミスをモデル変更で隠さない |
| timeout、stream切断 | streamingなしの短いリクエスト | 成功するならstreamingとtimeoutを別々に確認する |
| 編集しても変化しない | 設定ファイルの場所、環境変数の上書き、プロセス | 完全終了して再起動する |
401だからURLが正しいとは限らず、404だからモデルが存在しないとも限りません。ステータスコードは、届いたリクエストにサーバーがどう応答したかを示すだけです。
CodexとClaude Codeの簡易設定確認
Codex
Codex設定のうちアドレスに関係する部分は次のようになります。
model_provider = "bettertoken"
model = "gpt-6-astra"
cli_auth_credentials_store = "file"
[model_providers.bettertoken]
name = "BetterToken"
base_url = "https://www.bettertoken.ai/v1"
wire_api = "responses"
requires_openai_auth = true
API Keyは同じCodex設定ディレクトリのauth.jsonに保存します。全項目と認証ルールはCodex設定ガイドを参照してください。Codexが/responsesを追加するため、base_urlには含めません。
Claude Code
アドレスと認証に関する変数は次のとおりです。
{
"env": {
"ANTHROPIC_BASE_URL": "https://bettertoken.ai",
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY"
}
}
この断片はアドレスと認証変数だけを示しています。推奨される完全な設定はClaude Codeガイドを確認してください。ANTHROPIC_BASE_URLに/v1や/messagesを追加しないでください。
よくある4つのURL結合ミス
誤り: https://www.bettertoken.ai/v1/v1/responses
原因: Base URLとクライアントの両方が/v1を追加した
誤り: https://www.bettertoken.ai/v1/responses/responses
原因: 完全なendpointをBase URLとして入力した
誤り: Claude Code Base URL = https://www.bettertoken.ai/v1/messages
原因: Claude Codeが/v1/messagesを再度追加する
誤り: OpenAI-compatibleクライアントでhttps://bettertoken.aiを使う
原因: この入口に必要な/v1ベースパスがない
Key、モデル、高度なパラメーターを変える前に、まず結合を直してください。
避けるべき切り分け方
- Base URL、API Key、Model IDを同時に変えない。
- 同じBase URLをすべてのツールへコピーしない。
- モデル名だけでプロトコルを判断しない。
- 古いスクリーンショットや記事のアドレスを、最新ドキュメントの確認なしに使わない。
- 初回接続テストに書き込み権限のある実プロジェクトを使わない。
- 完全なAPI Keyをissue、チャット、スクリーンショットへ載せない。
- 基本リクエストが成功する前にstreaming、tools、MCP、timeoutを調整しない。
よくある質問
Base URLとは何ですか?
APIサーバーまたはゲートウェイの基点アドレスです。クライアントが/responses、/chat/completions、/v1/messagesなどのendpointを追加します。
Base URLとendpointの違いは何ですか?
Base URLは複数のリクエストが共有するルートです。endpointは特定のリソースや処理へのパスです。組み合わせると完全なリクエストURLになります。
Base URLが間違っていると404になるのはなぜですか?
/v1の重複、endpointの重複、必要なベースパスの欠落、OpenAI-compatibleクライアントとAnthropic-compatibleアドレスの不一致が主な原因です。
BetterTokenのBase URLにはすべて/v1が必要ですか?
いいえ。Codex、Cursor、ClineなどのOpenAI-compatibleクライアントは通常https://www.bettertoken.ai/v1を使います。Claude Codeはhttps://bettertoken.aiを使い、/v1/messagesを自動追加します。
Base URLを変更しても反映されないのはなぜですか?
実行中のプロセスが古い環境変数や設定を保持している可能性があります。クライアントとバックグラウンドプロセスを完全終了し、新しいターミナルまたは再起動したアプリで試してください。
Base URLとMCPは同じですか?
いいえ。Base URLとAPI Keyはモデルリクエストの経路と認証を設定します。MCPは外部ツール、ファイル、データベース、その他のコンテキストを接続します。詳しくはMCPとAPI Key/Base URLの違いを参照してください。
次のステップ
BetterTokenドキュメントを開き、実際に使うツールのページから現在のBase URLだけをコピーします。自分のAPI Keyでstreamingとtoolsを無効にした短いリクエストを送り、Dashboardで時刻、ステータス、モデル、token使用量を確認してください。
基本リクエストが成功した後、モデル切り替え、長いコンテキスト、tools、MCP、streamingを一つずつ戻します。「アドレスは正しいか」と「高度な機能は動くか」を分けて検証すると、原因を早く特定できます。