モデル数を比べる前に、レスポンスの4つのフィールドを見る。請求書を説明できるかどうかは、そこに宿っています。
同じClaudeのリクエストをOpenRouterと別のAPIゲートウェイに送ると、どちらも200を返します。Anthropic Messagesのエンドポイントがあり、x-api-key も Authorization: Bearer も通り、クライアント側の変更は不要です。単価も同じで、どちらもベンダーの定価に従います。
つまり表面上は引き分けです。残るのはエンジニアリングの比較——トークンの上に何が乗るのか、リクエストがコードを離れた後に何が起きるのかだけになります。
実際に違うのは4点です。
- レスポンスフィールド。 OpenRouterは各社のフィールドをクロスベンダーの命名に正規化し、もう一方はAnthropicの返却をそのまま透過させます。
-
ルーティング。 OpenRouterはオープンウェイトモデルを複数のホストに分散し、既定では価格で重み付けします。もう一方は直供で、モデルIDごとに1つの価格、
providerパラメータはありません。 - ルールの置き場所。 OpenRouterのフォールバックはリクエストかプリセットに、もう一方の許可リストと予算はAPIキーに書きます。
- モデルカタログ。 正規化後で372対177。これは後者の弱点で、目を逸らしません。
両者の違いはインターフェースではなく、要件がどちら側に落ちるかです。OpenRouterが適する場面もあります:自前のproviderキー、待ってよいバッチ処理、欧州に留める必要のあるprompt、SAML SSOと契約SLAが要る調達です。
実測した内容
2026年10月12日、両方のAnthropic Messagesエンドポイントに最小リクエストを送り、返却JSONを保存しました。あわせて cache_control 付きの長いコンテキストと、budget_tokens を128と1024に振った比較も行っています。対象モデルは claude-haiku-5-5、claude-sonnet-5-5、claude-opus-5-5 です。
カタログ数、フィールド名、価格は各社の公開APIとドキュメントから取得しました。OpenRouter側はドキュメントベースで、有料の実測はしていません。
4点の比較
| OpenRouter | もう一方のゲートウェイ | |
|---|---|---|
| モデル項目(正規化後の一意ID) | 458 / 372 | 177 / 177 |
| プロトコル | Chat、Responses、Messages | Chat、Messages(両方の認証ヘッダーが可) |
| オープンウェイトモデル | 実際のホスト先の価格 | モデルIDごとに1価格 |
| 制限とフォールバックの設定場所 | リクエストまたは @preset
|
APIキー(許可リスト + 予算) |
| 自前providerキー | 月2.5万ドルまで手数料なし、以降5% | 対応する仕組みの記載なし |
| バッチとフレックス | 約半額 | バッチエンドポイントの記載なし |
| キャッシュミスの理由 | なし(cached_tokens が0になるだけ) |
diagnostics.cache_miss_reason |
| thinkingトークンの計数 | usageに正規化 | output_tokens_details.thinking_tokens |
| ゼロデータ保持 | 全プランで利用可 | ZDR相当の記載なし(画像は48時間保持) |
| リージョン内ルーティング | BusinessでEUまたはUS | なし |
レスポンスフィールドが分岐点
ネイティブ側には、OpenAI互換の形では表現できないフィールドが4つあります。cache_creation.ephemeral_5m_input_tokens と ephemeral_1h_input_tokens はキャッシュ書き込みを5分/1時間の2段で数え、output_tokens_details.thinking_tokens は推論トークンを出力から分離し、diagnostics.cache_miss_reason は今回ヒットしなかった理由を返します(実測では previous_message_not_found)。safeguard_results も含まれます。
# 静かな失敗を、大きな失敗に変える2つのassert
diag = resp.get("diagnostics") or {}
assert resp["usage"]["output_tokens_details"]["thinking_tokens"] > 0, "thinkingが出ていない: budget_tokensを確認"
if reason := diag.get("cache_miss_reason"):
print(f"キャッシュミス: {reason}")
1つ目のassertは見た目より重要です。budget_tokens が小さすぎてもエラーにならず、200が返り、thinking_tokens が0になります。4モデルで試したところ、128ではthinkingブロックが出ず、1024では出ました。
正規化は欠点ではありません。集約サービスとしては当然の選択で、ClaudeからGemini、DeepSeekへ移っても usage のパースを書き換えずに済みます。代償は障害時に現れます。ヒット率が落ちても cached_tokens が0になったことしか分からず、あとは推測になります。
ルールはどこに置くか
OpenRouterはリクエスト内の models リストか、@preset/<name> として参照するプリセットでフォールバックを設定します。openrouter/auto という自動ルーターもあります。いずれもクライアントがOpenRouter固有のものを送る必要があります。
もう一方はAPIキー側です。モデルの許可リストとtoken予算をキーに紐づけ、クライアントは今まで通りのモデル名を送り続けます。許可外のモデルは model not allowed(403)、予算超過は429を返します。
レート制限のスコープも違います。OpenRouterはキーを増やしても上限は上がらないと明記しており、容量は全体管理です。もう一方のトラブルシューティング文書は、429の対処として「複数のtokenにトラフィックを分散する」を挙げており、制限がtoken単位で数えられていることが分かります。
料金:単価よりキャッシュ
OpenRouterは推論に上乗せせず、費用をチャージ時に取ります。Standardはカード決済で5.5%(最低$0.80)、暗号通貨5%、Businessは8%で、手数料は返金されません。つまり定価×1.055が実効単価です。もう一方は単価にグループ割引が含まれ、実際の呼び出し量で精算されます。
100万トークン(入力/出力)あたり、チャージ条件を織り込むとこうなります。
| モデル | ベンダー定価 | OpenRouter(手数料込み) | もう一方(割引) |
|---|---|---|---|
| Claude Opus 5.5 | $4 / $20 | $4.22 / $21.10 | グループ割引 |
| Claude Sonnet 5.5 | $2 / $10 | $2.11 / $10.55 | グループ割引 |
| GPT-6.1 Sol | $2 / $10 | $2.11 / $10.55 | グループ割引 |
| GPT-6 Astra | $10 / $50 | $10.55 / $52.75 | 定価比35%減 |
| Gemini 3.8 Flash | $0.75 / $3.75 | $0.79 / $3.96 | グループ割引 |
| GLM-5.3 | $1.40 / $4.40 | $1.48 / $4.64 | グループ割引 |
割引欄は割引率のみで、単価には換算していません。グループ割引はモデルごとに異なるためです。35%は2026年10月13日の価格ページのスナップショット($6.50 / $32.50、定価$10 / $50)です。
月$1,000をAstraの定価で使う場合、OpenRouterは年$12,660、35%で外挿すると年$7,800、差は$4,860になります。
ただし本命はキャッシュです。 Anthropicの規則では、書き込み1.25倍、読み取り0.1倍、1時間TTLの書き込み2倍で、この係数は両方に適用されます。6万トークンの文脈で1日40ターンなら、ミス時は0.06M × $2 = 1ターン$0.12、1日$4.80。全ヒットなら初回書き込み$0.15に、以降39ターン×$0.012で合計$0.62。1日$4.18、月$125の差です。
同じトークンで10倍の単価差。そのすべてがヒットしたかどうかで決まり、「なぜ外したか」をレスポンスに書いているのは片方だけです。
どちらを選ぶか
| 要件 | 適する側 | 理由 |
|---|---|---|
| マルチモデル比較、オープンウェイトのロングテール | OpenRouter | 372対177、Qwen3は37対12 |
| ベンダーを頻繁に切り替えるコード | OpenRouter | 正規化フィールドでパーサ変更不要 |
| providerを跨ぐ冗長化 | OpenRouter | 複数ホスト + Sticky Routing |
| データ所在地、ゼロ保持、ソブリンクラウド | OpenRouter | ZDRとリージョンルーティングの文書あり |
| 文書通りにレート制限を実装したい | OpenRouter | 402 / 403 / 429の分離 + in-flight予算 |
| モデルがClaudeの1〜2本に固定 | もう一方 | ネイティブフィールド透過、thinking も tool_use もそのまま |
| キャッシュミスの原因を追いたい | もう一方 |
cache_miss_reason が返る |
| token単位の予算・許可リスト・環境分離 | もう一方 | 仕組みが用意されている |
| 1つのキーで画像や音声も呼ぶ | もう一方 | 独立エンドポイント |
Claude Codeの切り替えは環境変数3つです。
export ANTHROPIC_BASE_URL="https://api.crazyrouter.com"
export ANTHROPIC_AUTH_TOKEN="あなたのキー"
export ANTHROPIC_MODEL="claude-sonnet-5-5"
検証していないこと
レイテンシとエラー率は測っていません。両者を同一条件で比較する安定した方法がないためです。429の実閾値も未計測で、token単位という記述はトラブルシューティング文書からの推測です。OpenRouter側は有料実測ではなくドキュメントベースで、実際の請求は自分の明細で確認するのが確実です。35%は1日・1モデルのスナップショットであり、外挿はできません。
価格とモデル数は自分で取得するのが最も正確です。どちらのAPIもキー不要です。
curl -s https://openrouter.ai/api/v1/models | jq '.data | length'
curl -s https://crazyrouter.com/api/pricing | jq '.data | length'
参考
Crazyrouter
OpenRouter(比較元)