新着どんなエージェントもUberLLMにつなぐだけ。1つのキーで全モデル、定価以下で。
UberLLM

アプリ:掲載されてユーザーが接続できるようにする

UberLLMでアプリを開発する人向けの2つのこと。どちらもOpenRouterと同じように機能するため、すでにこれらを行っているアプリはbase URLを変更するだけで済みます。

  1. 掲載される。 2つのヘッダーを送信すると、あなたのアプリがuberllm.dev/apps]に、送信するtoken数でランク付けされて表示されます。モデルページには、それらを最も多く使用するアプリがリストされます。
  2. ユーザーが接続できるようにする。 ユーザーを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つの残高があります。