プラットフォーム API
カタログ、価格、残高、利用状況をコードから読み取る。
プロンプトの送信以外のすべてです。どのモデルが存在するか、各プロバイダーの料金はいくらか、これまでいくら使ったか、どのキーを保有しているか。いずれも補完リクエストを送るのと同じ api ホストで JSON を返します。
カタログと価格のエンドポイントは公開されており、認証情報は一切不要です。自分のアカウントに関わるものには認証情報が必要で、その種類は 2 つあります。
両者は交換できません。API キーで残高は読み取れず、アクセストークンで補完リクエストは送れません。
| 認証情報 | 形式 | 使える範囲 |
|---|---|---|
| API キー | sk-... | 推論、モデル一覧、およびそのキー自身の利用カウンター。 |
| アクセストークン | 29 文字から 32 文字、プレフィックスなし | 自分のアカウント:残高、キー管理、利用ログ。 |
どちらも同じヘッダーで送ります。Authorization: Bearer に続けて値を置きます。それ以外は読み取りません。古い例では New-Api-User ヘッダーを付けていますが、これは無視され、cookie によるフォールバックもありません。
エンドポイントが認証情報なしでも応答する場合でも、このヘッダーを送ってください。認証情報を持たないアカウント系ルートへのリクエストは、当方に届く前にチャレンジされることがあり、チャレンジは JSON ではなく HTML を返します。
まず設定を開き、セキュリティの項目にある API アクセスから生成します。表示されるのは一度だけです。サインイン中にしか作成できないため、スクリプトが自分で発行することはできません。
アクセストークンは同時に 1 つしか保有できません。新しく生成すると古いものは黙って無効になり、それを使い続けているものはすべて動かなくなります。
パスワードと同じように扱ってください。お金を使い、キーを作成し、履歴を読み取れます。スクリプトで不要になったら、同じ画面から失効させてください。
公開リクエスト 1 回ですべてのモデルが返り、価格は 100 万トークンあたりのドル額に換算済みです。キーも登録も不要です。
curl https://api.unorouter.com/api/pricing/catalog{
"counts": { "models": 239, "free": 134, "paid": 105, "vendors": 50 },
"first_free_model": "glm-5.3:free",
"vendors": [{ "vendor_id": 4, "vendor_name": "Zhipu", "icon": "Zhipu.Color" }],
"models": [
{
"model_name": "glm-5.3",
"vendor": "Zhipu",
"type": "text",
"is_free": false,
"online": true,
"input_price": 0.05103,
"output_price": 0.160382187,
"original_input_price": 1.26,
"original_output_price": 3.960054,
"tags": "Text,Reasoning,Tools,Cache",
"supported_endpoint_types": ["openai", "anthropic"],
"uptime_24h": 99.965,
"success_rate": 95,
"avg_latency_ms": 11062
}
]
}input_price と output_price は、そのモデルを現在提供している中で最も安いプロバイダーで、今日実際に支払う金額です。original_input_price と original_output_price はベンダー自身の定価なので、両者の差が割引分になります。is_free は課金されないモデルを示し、online は今この時点で稼働中のプロバイダーがあるモデルを示します。
小型の近縁が 2 つあります。/api/pricing/counts は合計値だけを返し、ポーリングできるほど軽量です。/api/pricing/vendors はベンダー一覧を返します。古い /api/pricing エンドポイントはドルではなく生の比率を返し、サイズは数倍になります。
ほとんどのモデルは複数のプロバイダーが異なる料金で提供しています。モデルを 1 つ指定すると、そのすべてを確認できます。
curl "https://api.unorouter.com/api/pricing/catalog/model?model=glm-5.3"{
"model_name": "glm-5.3",
"model_ratio": 0.63,
"completion_ratio": 3.1429,
"cache_ratio": 0.1857,
"input_price": 0.05103,
"output_price": 0.160382187,
"grid_min_ratio": 0.0405,
"auto_chain": ["a7-bbgt-2846-glm-5.3", "a7-kkl-3731-glm-5.3", "a7-4069-glm-5.3"],
"group_ratio": {
"a7-bbgt-2846-glm-5.3": 0.0405,
"a7-kkl-3731-glm-5.3": 0.0911,
"a7-4069-glm-5.3": 0.1214
},
"enable_groups": ["a7-bbgt-2846-glm-5.3", "a7-kkl-3731-glm-5.3"]
}auto_chain はルーティングが試す順序で、安いものが先に来ます。group_ratio は各プロバイダーの倍率で、価格はそこから決まります:
input $/1M = model_ratio * 2 * group_ratio
output $/1M = input * completion_ratio
cached $/1M = input * cache_ratio
glm-5.3 on a7-bbgt-2846: 0.63 * 2 * 0.0405 = $0.05103 / 1M in
0.05103 * 3.1429 = $0.16038 / 1M outこれらのグループ名は、キーに紐づけるグループ名と同じものです。詳しくは グループのピン留め
OpenAI 互換の一覧は、接続を押したときにほとんどのクライアントが呼び出すものです。API キーが必要です。
curl https://api.unorouter.com/v1/models \
-H "Authorization: Bearer $UNOROUTER_API_KEY"そのキーが実際に使えるものだけを返すため、無料枠のキーでは入金済みのキーより見えるモデルが少なくなります。各項目には context_length と max_output_tokens も含まれます。これは本家 OpenAI では提供されません。
パスは /v1/models です。/v1 を省くと API ではなく Web ページに到達し、クライアントは予期しない doctype に関する JSON パースエラーとして報告します。
1 回の呼び出しで、使える残額を含むアカウント情報が返ります。
curl https://api.unorouter.com/api/user/self \
-H "Authorization: Bearer $UNOROUTER_ACCESS_TOKEN"{
"success": true,
"message": "",
"data": {
"id": 12345,
"username": "you",
"group": "default",
"quota": 265000,
"used_quota": 4231900,
"request_count": 1884,
"aff_code": "ABC123"
}
}金額の単位はドルではなくクォータです。500,000 単位が 1 米ドルなので、上の残高は 0.53 米ドルです。金額として表示するには 500,000 で割ってください。
quota はこれから使える分です。used_quota と request_count は増える一方の累計値なので、used_quota は何かと残高との差ではありません。
キーを一覧し、id を指定して 1 つの値を表示します。
curl "https://api.unorouter.com/api/token/?p=1&page_size=20" \
-H "Authorization: Bearer $UNOROUTER_ACCESS_TOKEN"
curl -X POST https://api.unorouter.com/api/token/42/key \
-H "Authorization: Bearer $UNOROUTER_ACCESS_TOKEN"一覧ではすべてのキーの値がマスクされます。そのため値の表示は別の呼び出しになります。この呼び出しにはレート制限があり、監査ログに記録されます。
キーの作成では success は返りますが、キー自体は返りません。まず作成し、一覧から id を調べ、それから実際の値を表示します。更新では更新後のオブジェクトが返りますが、オブジェクト全体を送ってください。省略しても保持されるのは cross_group_retry、group_mapping、auto_groups だけで、それ以外の省略したフィールドは空で書き戻されます。
自分のリクエスト履歴はページングとフィルタリングに対応しています。
curl -G https://api.unorouter.com/api/log/self \
-H "Authorization: Bearer $UNOROUTER_ACCESS_TOKEN" \
-d p=1 \
-d page_size=100 \
-d type=2 \
-d start_timestamp=1789344000 \
-d model_name=glm-5.3| パラメーター | 意味 |
|---|---|
type | 1 チャージ、2 消費、3 管理、5 エラー、6 返金、7 ログイン。省略するとすべてが対象になります。 |
start_timestamp, end_timestamp | Unix 秒。2 つの間隔は 10 年を超えられません。 |
model_name, token_name, group | 特定のモデル、特定のキー、特定のプロバイダーグループに絞り込みます。 |
request_id, upstream_request_id | 当方の id またはプロバイダーの id で 1 件のリクエストを探します。 |
ページングには p と page_size を追加します。ページサイズの上限は 100 です。同系統のエンドポイント /api/log/self/stat は、同じ絞り込み条件の合計値だけを返します。支出、毎分のリクエスト数、毎分のトークン数です。
アクセストークンなしで 1 つのキーの残高を読み取るには、そのキー自体で認証します:
curl https://api.unorouter.com/api/usage/token/ \
-H "Authorization: Bearer $UNOROUTER_API_KEY"{
"object": "token_usage",
"name": "SillyTavern",
"total_granted": 500000,
"total_used": 231900,
"total_available": 268100,
"unlimited_quota": false,
"model_limits_enabled": false,
"expires_at": 0
}アカウント系のエンドポイントはペイロードを 1 段ラップします。ページング対応のものは 2 段です。
{ "success": true, "message": "", "data": { ... } }
{ "success": true, "message": "", "data": {
"page": 1, "page_size": 20, "total": 137, "items": [ ... ]
} }公開カタログのエンドポイントは例外で、ラッパーなしでオブジェクトをそのまま返します。
ほとんどの失敗でも HTTP 200 が返り、success が false になって理由を示すメッセージが付きます。ステータスコードではなく、このフィールドを確認してください。
認証だけは例外で、実際のステータスを返します。認証情報が不正なら 401 と AUTH_UNAUTHORIZED、期限切れなら AUTH_TOKEN_EXPIRED、ログアウト後は AUTH_SESSION_REVOKED、そのルートを呼び出す権限がアカウントにない場合は 403 と AUTH_INSUFFICIENT_PRIVILEGE です。