アプリ:掲載されてユーザーが接続できるようにする
UberLLMでアプリを開発する人向けの2つのこと。どちらもOpenRouterと同じように機能するため、すでにこれらを行っているアプリはbase URLを変更するだけで済みます。
- 掲載される。 2つのヘッダーを送信すると、あなたのアプリがuberllm.dev/apps]に、送信するtoken数でランク付けされて表示されます。モデルページには、それらを最も多く使用するアプリがリストされます。
- ユーザーが接続できるようにする。 ユーザーをUberLLMに誘導し、彼らが同意すると、あなたのアプリは彼らのアカウントでAPI keyを取得します。彼らは自身の使用料を支払い、あなたが彼らの支払い詳細を処理することはありません。
アプリランキングに掲載されましょう
リクエスト(チャット、メッセージ、メディア、あらゆるエンドポイント)に以下のヘッダーを追加してください。
| ヘッダー | 機能 |
|---|---|
HTTP-Referer |
アプリのアドレス。例: https://myapp.com。必須: アプリを識別するものです。Referer も使用できます。 |
X-Title |
ユーザーに表示されるアプリ名。X-OpenRouter-Title も使用できます。 |
X-OpenRouter-Categories |
任意。以下のカテゴリから最大2個まで、カンマ区切りで指定します。 |
X-OpenRouter-App-Visibility |
任意。hidden を指定すると、新しいアプリが公開ランキングに表示されなくなります。 |
curl https://api.uberllm.dev/v1/chat/completions \
-H "Authorization: Bearer $UBERLLM_API_KEY" \
-H "Content-Type: application/json" \
-H "HTTP-Referer: https://myapp.com" \
-H "X-Title: My App" \
-H "X-OpenRouter-Categories: cli-agent" \
-d '{"model":"deepseek/deepseek-v4-flash","messages":[{"role":"user","content":"Hello"}]}'
OpenAI SDKで:
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://api.uberllm.dev/v1',
apiKey: process.env.UBERLLM_API_KEY,
defaultHeaders: {
'HTTP-Referer': 'https://myapp.com',
'X-Title': 'My App',
},
});
カウント方法:
- アドレスのみが保持されます:
https://myapp.com/some/page?user=…はhttps://myapp.comとして保存されます。パス、クエリ文字列、ログイン情報は破棄されます。GitHub、 GitLab、Codeberg、Bitbucket、Hugging Face のリンクはowner/repoを保持するため、 オープンソースアプリは個別のエントリを取得します。 - 名前は60文字に切り詰められます。非表示文字と制御文字は削除されます。
- アプリにトラフィックを送信した最初のアカウントが、そのアプリの名前と カテゴリを設定します。他のアカウントからのトラフィックもそのアプリにカウントされますが、 名前を変更することはできません。
- ご自身のマシンまたはネットワーク上のアドレス(
localhost、127.0.0.1、 プライベートIP、*.local)は公開されることはありません。 - ブラウザからのリクエストは、自動的に
Refererを送信するため、ウェブアプリは ヘッダーがなくてもカウントされます。名前を選択するにはX-Titleを追加してください。 - ランキングは、過去24時間、7日間、または30日間に応答されたリクエストを トークン数でカウントします。数分ごとに更新されます。
カテゴリ: cli-agent、ide-extension、cloud-agent、programming-app、
native-app-builder、creative-writing、video-gen、image-gen、
audio-gen、writing-assistant、general-chat、personal-agent、legal、
roleplay、game。不明なカテゴリは無視されます。アプリは最大10個のカテゴリを保持します。
ランキングはAPIとしても利用できます: GET https://uberllm.dev/api/v1/public/apps?period=day|week|month&category=<slug>。
UberLLMに接続する (OAuth PKCE)
あなたのアプリは、ユーザー自身のUberLLMアカウントに、あなたのアプリ名でキーを取得します。ユーザーは、キーを許可する際に利用限度額を設定でき、キーのページ]でいつでもオフにできます。
1. コードベリファイアとチャレンジを作成する
ベリファイアは、あなたが保持するランダムな文字列です(43から128文字)。チャレンジは、そのSHA-256,をパディングなしでbase64urlエンコードしたものです。
function base64url(bytes) {
return btoa(String.fromCharCode(...new Uint8Array(bytes)))
.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}
const codeVerifier = base64url(crypto.getRandomValues(new Uint8Array(32)));
const codeChallenge = base64url(
await crypto.subtle.digest('SHA-256', new TextEncoder().encode(codeVerifier)),
);
sessionStorage.setItem('uberllm_verifier', codeVerifier);
2. ユーザーをUberLLMに送る
https://uberllm.dev/auth?callback_url=https://myapp.com/uberllm/callback&code_challenge=<CHALLENGE>&code_challenge_method=S256
| パラメーター | |
|---|---|
callback_url |
ユーザーが戻ってくる場所。https://である必要があります。開発用にはhttp://localhost(任意のポート)が許可されています。これを省略すると、ユーザーがアプリに貼り付けるためのコードが画面に表示されます。 |
code_challenge |
ステップ1で作成したもの。必須。 |
code_challenge_method |
S256。必須。plainは受け入れられません。 |
key_label |
キーのオプション名(デフォルト:あなたのアプリ名)。 |
state |
オプション。コードと一緒に変更されずに返送されるため、返信があなたが開始したリクエストに属するかどうかを確認できます。 |
ユーザーはサインイン(またはサインアップ)し、「あなたのアプリがあなたのUberLLMクレジットを使用しようとしています」と表示され、許可またはキャンセルを選択します。許可を選択すると、以下の場所に送られます。
https://myapp.com/uberllm/callback?code=<CODE>&state=<STATE>
キャンセルを選択した場合、何も送信されません。
3. コードをキーと交換する
const code = new URLSearchParams(location.search).get('code');
const res = await fetch('https://uberllm.dev/api/v1/auth/keys', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
code,
code_verifier: sessionStorage.getItem('uberllm_verifier'),
code_challenge_method: 'S256',
}),
});
const { key } = await res.json(); // ull_… Store it like a password.
curl https://uberllm.dev/api/v1/auth/keys \
-H "Content-Type: application/json" \
-d '{"code":"<CODE>","code_verifier":"<VERIFIER>","code_challenge_method":"S256"}'
返信は{"key": "ull_…", "key_id": "…", "name": "My App"}です。キーをhttps://api.uberllm.dev/v1でAuthorization: Bearerとして使用してください。このエンドポイントは、あらゆるサイトからのブラウザリクエスト(CORS)に応答するため、ウェブアプリから動作します。
| ステータス | コード | 意味 |
|---|---|---|
| 400 | invalid_code_challenge_method |
S256を使用してください。 |
| 403 | invalid_code |
コードまたはcode_verifierが間違っているか、コードがすでに使用されています。 |
| 403 | code_expired |
コードは10分間有効です。ステップ2からやり直してください。 |
| 405 | method_not_allowed |
POSTを使用してください。 |
| 429 | rate_limited |
1つのアドレスからの試行回数が多すぎます。1分待ってください。 |
コードは一度だけ有効です。間違ったcode_verifierもコードを消費してしまうため、漏洩したコードを推測で悪用することはできません。
OpenRouterとの違い
code_challengeは必須であり、S256のみが受け入れられます(OpenRouterはplainまたはチャレンジなしも受け入れます)。これがないと、ブラウザの履歴やログでコードを見た人がキーを取得できてしまいます。workspace_id/required_workspace_idは使用されません。UberLLMアカウントには1つの残高があります。