OpenRouterは、各社のLLMを1つのAPIキーとOpenAI互換のAPIで呼べるサービスです。モデルの切り替えは model の文字列を書き換えるだけで済み、落ちたときに別のモデルへ逃がす指定もできます。本記事では、公開されているドキュメントの原稿(GitHubの OpenRouterTeam/docs)から料金と制限の数字を読み、OpenAIのPython SDKが送る中身を手元の受け口で確かめました。LLM全体の地図は LLMとは?仕組み・主要モデル比較・ローカル実行・量子化を一気にまとめる2026年版 にあります。
WHAT IT REPLACES何を代替するか
各社のAPIを1つのキーと1つの書き方にまとめる
各社のAPIを直接
社ごとに契約とSDK
- キーと請求が社ごとに分かれる
- 書き方が社ごとに違う
- 落ちたら自分で切り替える
OpenRouter
OpenAI互換の1つのAPI
- キーと請求は1つクレジットを前払い
- model を書き換えるだけprovider/model の形
- 落ちたら次へmodels 配列で順に試す
30秒でわかる(2026年10月18日時点)
- ・正体:各社のモデルを1つのキーで呼ぶ有料のAPIサービス。OSSではない(公式SDKはApache-2.0)
- ・料金:トークン単価は提供元と同じで上乗せなし。手数料はクレジットの購入時に5.5%(カード・最低0.80ドル)
- ・無料モデル:
:freeは毎分20回・1日50回まで。10ドル以上買ったことがあれば1日1,000回 - ・呼び方:OpenAI SDKの
base_urlを替えるだけ。独自の指定はextra_bodyに入れる
OpenRouterとは|何ができるサービスか
OpenRouterは、モデルを提供する各社(プロバイダ)の前に立つ中継のAPIです。利用者はOpenRouterにだけキーとクレジットを持ち、anthropic/...・openai/...・meta-llama/... のように「作者/モデル名」でモデルを指定します。ドキュメントは「400以上のモデルとプロバイダ」を扱うとしています。
できることは次の4つです。
・1つの書き方:OpenAIのChat Completionsと同じ形で、どのモデルにも送れる
・切り替えと逃がし先:model に加えて models の配列を渡すと、1つ目が落ちたときに順に試す
・同じモデルの提供元の選択:同じモデルを複数の会社が出しているとき、価格や速さで選ぶ
・別名:~openai/gpt-sol-latest のような ~作者/系列-latest の形は、その系列の最新のモデルを指す
OSSのゲートウェイとの違いは置き場所と請求です。LiteLLMや9routerのような自前のゲートウェイは、手元で動かし、各社のキーと請求をそのまま使います。OpenRouterは向こうのサーバーで動き、請求も1つにまとまります。
| OpenRouter | 自前のゲートウェイ(LiteLLM など) | 各社のAPIを直接 | |
|---|---|---|---|
| 動く場所 | OpenRouterのサーバー | 自分のサーバー | 各社のサーバー |
| キーと請求 | OpenRouterに1つ | 各社のまま | 各社のまま |
| 料金の上乗せ | 単価は上乗せなし、購入時に手数料 | なし(運用の手間がかかる) | なし |
| 落ちたときの切り替え | models で指定 |
設定で書く | 自分で書く |
| プロンプトの通り道 | OpenRouter → 各社 | 自分 → 各社 | 直接 |
OpenRouterの使い方|OpenAI SDKで呼ぶ
キーはOpenRouterの画面で作り、環境変数 OPENROUTER_API_KEY に入れます。あとはOpenAIのSDKで base_url を替えます。公式のQuickstartとModel Fallbacksの例をもとにした呼び出しです。
import os
from openai import OpenAI
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.environ["OPENROUTER_API_KEY"],
)
resp = client.chat.completions.create(
model="~anthropic/claude-sonnet-latest",
messages=[{"role": "user", "content": "OpenRouterを一文で説明して"}],
extra_body={"models": ["~openai/gpt-sol-latest", "openrouter/free"]},
)
print(resp.model, resp.choices[0].message.content)
このコードの base_url だけを手元の受け口(http://127.0.0.1 で動かした記録用のHTTPサーバー)に替え、openai 3.35.0 で何が送られるかを見ました。送り先は POST /api/v1/chat/completions、認証は Authorization: Bearer <キー> でした。extra_body の models は、model・messages と同じ最上位に並んで送られました。OpenRouterからの実際の応答は、キーを使っていないので未検証です。
models の意味はドキュメントのとおりで、model のモデルが落ちたり断られたりしたときに、配列の順に試します。応答の model には、実際に答えたモデルの名前が入ります。HTTPヘッダーの HTTP-Referer と X-OpenRouter-Title は任意で、OpenRouterのランキングにアプリを載せるためのものです。公式のPython SDK(pip install openrouter・1.3.64・Apache-2.0)もあり、client.chat.send(...) の形で呼びます。
HOW A REQUEST ROUTESリクエストの通り道
1つのリクエストがモデルとプロバイダを順に試して返る
-
アプリ
OpenAI SDK
-
OpenRouter
キーと残高を確認
-
model を試す
だめなら models の次
-
プロバイダ
同じモデルの提供元
-
応答
実際の model 名つき
モデル一覧の取り方
モデル一覧はキー無しで取れる公開のエンドポイントです(ドキュメントの例に認証ヘッダーが無い)。:free の付いたIDを抜き出す形です。
curl -s "https://openrouter.ai/api/v1/models" |
python3 -c 'import json,sys; d=json.load(sys.stdin)["data"]; print(len(d), [m["id"] for m in d if m["id"].endswith(":free")][:5])'
手元の受け口に向けて、この形で件数と :free のIDが出ることを確かめました。実際の件数と無料モデルの顔ぶれは未検証です。既定では文字を出力するモデルだけが返り、画像生成などは ?output_modalities=all を付けると入ります。?sort=pricing-low-to-high で安い順、?supported_parameters=tools でツール呼び出しに対応したモデルに絞れます。
OpenRouterの料金の見方
料金は前払いのクレジットから引かれます。ドキュメントのFAQはトークン単価について「提供元の価格をそのまま通し、上乗せはない」と書いています。費用が増えるのは別の所です。
READING THE BILL料金の見方
トークン単価は上乗せなし。手数料はクレジットの購入時
-
1.トークン単価
提供元の価格をそのまま。上乗せなし
-
2.クレジット購入の手数料
カードは5.5%(最低0.80ドル)、暗号資産は5%
-
3.自分のキー(BYOK)
月25,000ドル分(定価換算)まで無料、超えた分は5%
| 費用 | 値(2026年10月17日のドキュメントの原稿) |
|---|---|
| トークン単価 | 提供元の価格をそのまま。モデル一覧の pricing に1トークンあたりのドル(文字列)で入る |
| クレジット購入(カード) | 5.5%、最低0.80ドル |
| クレジット購入(暗号資産) | 5% |
| BYOK(自分の各社キーを持ち込む) | 従量課金プランは月25,000ドル分(定価換算)まで無料、超えた分はOpenRouterでの価格の5% |
| 製品改善への利用を許可した場合 | 全モデルの利用が1%引き |
単価の読み方には注意が要ります。モデル一覧の pricing.prompt と pricing.completion は、1トークンあたりのドルです。ドキュメントの例 "0.0000025" は、100万トークンで2.5ドルにあたります。"0" は無料を表します。長い入力や時間帯で単価が変わるモデルは、overrides に条件つきの単価が入ります。
無料モデルの制限|1日50回と402エラー
IDの末尾に :free が付いたものが無料版です。無料版のあるモデルだけに付き、一覧では有料版とは別の項目として出ます。openrouter/free を指定すると、無料モデルの中から1つを自動で選びます(Free Models Router)。
| これまでに買ったクレジット | 1分あたり | 1日あたり |
|---|---|---|
| 10ドル未満 | 20回 | 50回 |
| 10ドル以上 | 20回 | 1,000回 |
上の値はドキュメントの原稿(2026年10月17日のコミット)の定数です。表の基準は残高ではなく「これまでに買った額(all time)」です。日の区切りはUTCです。使った回数と残りは、キーの情報の free_model_daily_requests に出ます。
curl -s "https://openrouter.ai/api/v1/key" \
-H "Authorization: Bearer $OPENROUTER_API_KEY"
この形で GET /api/v1/key に認証ヘッダーつきで届くことを、手元の受け口で確かめました。応答の中身(limit_remaining・is_free_tier・free_model_daily_requests など)はドキュメントの型定義によるもので、未検証です。キーやアカウントを増やしても上限は増えないと、ドキュメントは明記しています。
止まったときのエラーは2種類あります。
・429:回数の上限を超えた。応答の X-RateLimit-* ヘッダーで残りを見る
・402:残高が足りない。残高がマイナスだと、無料モデルでも402になる。クレジットを足して0より上に戻すと解ける
OpenRouterは安全?データの扱い
ドキュメントによると、OpenRouterはプロンプトと応答を保存しません。保存されるのは、利用者が次のどちらかを有効にしたときだけで、どちらも既定は無効です。
・ログの記録:自分の画面でプロンプトと応答を見返すため。OpenRouterはこの中身を使わない
・製品改善への利用:OpenRouterに使わせる代わりに、全モデルの利用が1%引きになる
トークン数や待ち時間などのメタデータは、毎回保存されます。もう1つ見落としやすいのが、モデルを提供する各社の扱いです。各社は自分の規約で記録や学習を行い、OpenRouterはその方針を提供元ごとに表で出しています。アカウントの設定で「学習に使うかもしれない提供元に送らない」を選べ、この設定は有料モデルと無料モデルで別々です。社外に出せないデータを送るなら、両方を確かめてから使います。地域の中だけで処理する指定(EU・US)は、BusinessとEnterpriseのプランにあります。
自前で動かす選択肢もあります。ローカルのモデルにOpenAI互換で送るなら Ollama API完全ガイド2026|REST・OpenAI互換・Python/JSでローカルLLMを叩く が同じ書き方で使えます。OpenRouter経由でよく使われたモデルの例は Qwen 3.6 Plus徹底解説|1日1.4兆トークン突破の中身とClaude/GPTとのタスク別使い分け で扱いました。
参照ソース
- OpenRouterTeam/docs(OpenRouter のドキュメントの原稿)
- OpenRouter docs: Quickstart(原稿)
- OpenRouter docs: Limits
- OpenRouter docs: FAQ(原稿・Pricing and fees)
- OpenRouter docs: 料金と制限の定数(原稿)
- OpenRouter docs: Models(原稿)
- OpenRouter docs: Model Fallbacks(原稿)
- OpenRouter docs: Data Collection(原稿)
- OpenRouter docs: Provider Logging(原稿)
- OpenRouterTeam/python-sdk(公式 Python SDK)







