API の概要

ゲートウェイは 1 つ、互換方言は 3 つ。OpenAI・Anthropic・Gemini のクライアントを Asale に向け、base URL とキーを変えるだけで、残りのコードはそのままです。

Asale のゲートウェイは 3 種類のワイヤ形式で応答します。いま使っているクライアントが話す形式をそのまま使えます——SDK もリクエストボディもストリーム処理もそのまま、変えるのは 2 行だけ:base URL とキーです。

このページの内容は 3 方言に共通です。エンドポイントと実行可能なサンプルは各ページにあります:

Base URL

各ベンダーのクライアントが後ろに付け足すパスが違うため、base URL を切る深さも方言ごとに違います。手元の SDK に対応する行を使ってください。

方言Base URL実際に呼ばれるエンドポイント
OpenAIhttps://gw.asale.ai/v1POST /v1/chat/completions
Anthropichttps://gw.asale.aiPOST /v1/messages
Geminihttps://gw.asale.aiPOST /v1beta/models/{model}:generateContent

gw.asale.ai は推論ゲートウェイです。api.asale.ai はコンソール API(セッション・ウォレット・マーケット情報)で、通常は sk-asale- キーを受け付けません。推論リクエストを送っても 404 が返ります。例外はウォレット残高 APIで、キーだけで認証します。

認証

方言ごとに 1 つずつ、計 3 つのヘッダー。各ベンダーの SDK が手を加えずに認証できるようにするためです。どのヘッダーもどのエンドポイントでも有効です。

Authorization: Bearer sk-asale-...
x-api-key: sk-asale-...
x-goog-api-key: sk-asale-...

キーは API キー画面で管理します。登録時に 1 本自動発行され、追加・命名・有効期限の設定・削除せずに無効化ができ、控えを失くしても読み直せます。

アカウントごとに 1 本がデフォルトです。これはデスクトップアプリが購入時に各 AI ツールへ渡すキーで、自分で書いたコードからのリクエストには関係ありません——そちらは実際に送ったキーで認証されます。

モデル

モデル名はプラットフォームのもので、特定ベンダーの型番一覧ではありません。何がマッチできるかはゲートウェイに直接聞けます:

curl https://gw.asale.ai/v1/models -H "Authorization: Bearer $ASALE_API_KEY"
{
  "object": "list",
  "data": [
    { "id": "claude-sonnet-4-5", "object": "model", "owned_by": "anthropic", "context_length": 200000 }
  ]
}

カタログにはあるが今この瞬間に売り手がいないモデルは、404 ではなく 503 no_supply を返します——名前は正しく、供給がないだけです。流動性はマーケットで確認できます。

ストリーミング

Server-Sent Events を、各方言のイベント形式のまま返します(再フレーミングなし)。OpenAI と Anthropic は stream: true、Gemini は :streamGenerateContent です。既存のストリームパーサーはそのまま動きます。

1 回のリクエストの料金

リクエスト送信前に、宣言された max_tokens とそのモデルの出力価格から見積額を確保します。応答完了後は実使用量で計算し直し、差額はただちに利用可能残高へ戻ります。

エラーになったとき、使用量がゼロで返ったとき、途中で切断したときは課金されません。計測の詳細はトークン計測を参照してください。

エラー

失敗はすべて同じ形の JSON で、対応する HTTP ステータスとともに返ります:

{
  "error": {
    "message": "insufficient balance",
    "code": "payment_required",
    "key": "errors.wallet.insufficientBalance"
  }
}

分岐は必ず code で行ってください。message は翻訳・書き換えの対象です。

ステータスcode対処
401unauthorizedキーが無い・形式が違う・存在しない。ヘッダーとキーを確認。
403forbiddenキーが無効化されているか、アカウントが取引を制限されている。
402payment_requiredウォレットに入金。
429rate_limitedバックオフして再試行。待ち時間は Retry-After。
503no_supplyそのモデルを今売っている人がいない。時間をおくか別のモデルへ。
502upstream処理した上流が失敗。再試行して問題ありません。

期限切れのキーは 401 と errors.apiKey.expired、無効化されたキーは 403 と errors.apiKey.disabled を返します。対処が違うので、ステータスも分けてあります。

レート制限

キーごとに 1 分あたりのリクエスト数とトークン数の上限があります。どちらかを超えると Retry-After 付きの 429 が返ります。上限はキー単位なので、処理を 2 本のキーに分ければ枠も分かれます。

残高を確認する

詳しくはウォレット残高 APIをご覧ください。

このページの他の内容はすべて gw.asale.ai です。これだけは api.asale.ai で、コンソール API の中で唯一、ログイン済みセッションではなくキーだけで認証するエンドポイントです——「残りはいくらで、このキーはいくら使ったか」は、キーしか持たないスクリプトがログインを借りずに自分で確認できてよい質問だからです。

GET https://api.asale.ai/api/v1/me/wallet/balance
Authorization: Bearer sk-asale-...

x-api-key、x-goog-api-key もここで有効です。ゲートウェイと同じです。

{
  "balance": 4820000,
  "frozen": 150000,
  "payable": 0,
  "debt": 0,
  "unit": "micro_usdt",
  "recent_consumption": [
    { "task_id": "t_...", "model": "claude-sonnet-4-5", "amount_usdt": 1200, "created_ts": 1760000000 }
  ],
  "recent_consumption_window_hours": 24,
  "api_key": {
    "id": 42,
    "label": "ci-bot",
    "rpm_limit": 60,
    "tpm_limit": 100000,
    "max_ratio_pct": 80,
    "budget_usdt": null,
    "budget_remaining_usdt": null,
    "spent_usdt": 0,
    "calls": 318,
    "in_tokens": 905120,
    "out_tokens": 221004,
    "settled_usdt": 184230,
    "list_usdt": 240310
  }
}
  • balance / frozen / payable / debt はウォレットページと同じ数字で、単位は micro-USDT です。
  • recent_consumption はこのアカウントの直近 24 時間分の請求済みリクエストで、最大 200 件です。このキーだけに絞っていないので、同じ時間帯のアカウント自身の履歴をたどったときと同じものが見えます。
  • api_key はこのキー自身の状態です:設定されているレート上限、支出上限があればその値、そしてこのキーが支払ったすべてのリクエストの累計です。

これはスクリプト向けの一回限りのスナップショットで、ページング付きのフィードではありません——「今どうなっているか」に答えるもので、「直近 N 件を列挙する」ものではありません。キーが存在しない・期限切れ・無効化されている場合は、ゲートウェイと同じく 401/403 を、上のエラー表に対応する code 付きで返します。