テーマ
言語

サプライヤー マシン API

サプライヤーマーケットプレイスのマシン API:キャビネットで sk-sup-… キーを発行し、すべてのエンドポイントを Authorization: Bearer で呼び出して、接続を一括でオンボーディングし、接続、オファー、価格変更、収益、統計を読み取ります。

サプライヤーキャビネットにはマシン向けのインターフェースがあります。サプライヤーは、ブラウザセッションの代わりにサプライヤー単位の API キーを使い、スクリプトからアカウントを一括でオンボーディングして、自身の接続、オファー、価格、価格変更履歴、収益、統計を読み取ることができます。

これは加算的です。ブラウザcabinetは変更されず、マシンルートはcabinetページと同じペイロードを組み立てるため、2つのサーフェスが異なる数値を報告することはできません。

キーを取得

マシンキーは サプライヤーキャビネット で発行および失効されます。完全なトークンは作成時に一度だけ表示され、その後再び返されることはありません。

  1. サプライヤーの管理画面を開き、Machine API keys セクションを探します。
  2. キーにラベルを付け(任意)、作成を押します。
  3. トークンをすぐにコピーしてください。トークンは sk-sup- で始まります。
  4. シークレットマネージャーまたは環境変数に保管してください。コミットしたり、サポートメッセージで送信したりしないでください。
キーは暗号化ではなくハッシュ化されています。オペレーターを含め、誰も失われたキーを復元することはできません。キーを失効させ、新しいキーを発行してください。サプライヤーは最大20個のアクティブなキーを保持できます。

Cabinet管理エンドポイント

これらのルートはcabinetセッションまたはトラッキングトークンを使用します。意図的にマシンキーを受け付けないため、漏洩したマシンキーで他のキーを発行したり失効させたりすることはできません。

パラメータータイプ説明
GET /api/marketplace/suppliers/me/api-keyslistキー一覧: id、label、prefix、active、lastUsedAt、createdAt。トークンやそのハッシュが返されることはありません。
POST /api/marketplace/suppliers/me/api-keysmintボディ { "label"?: string }。{ "key": "sk-sup-…", "apiKey": { … } } を返します — トークンが表示されるのはこの1回だけです。
DELETE /api/marketplace/suppliers/me/api-keys/{id}revokeキーを 1 つ無効化します。id が呼び出し元のものでない場合は 404 を返します。

認証

すべてのマシンルートは、サプライヤーキーをベアラートークンとして必要とします:

Authorization: Bearer sk-sup-<64 hex>
curl https://getvibeapi.com/api/marketplace/suppliers/api/v1/connections \
  -H "Authorization: Bearer $SUPPLIER_API_KEY"

1 つのリクエストではキーは必ず 1 つのサプライヤーに解決され、すべてのクエリはその id でフィルタリングされます。失効はキー id とその所有者の両方でスコープされるため、あるサプライヤーが別のサプライヤーのキーを失効させることはできません。キーをログに記録したり送信したりしないでください。

欠落、不明、または失効したキーは固定の 401 メッセージを 1 つ返すため、呼び出し元はこれらのケースを区別できません。キーは HTTPS 経由でのみ送信してください。

読み取りエンドポイント

すべて GET、API キーで認証され、認証されたサプライヤーにスコープされます。Micro-USD の金額は文字列として返され、トークン数は数値です。

接続

GEThttps://getvibeapi.com/api/marketplace/suppliers/api/v1/connections

サプライヤーが接続したアカウント。それぞれの獲得額(支払可能分のみ)が付きます。

{
  "connections": [
    {
      "id": "…",
      "connectionType": "subscription-api-key",
      "subscriptionProductLabel": "…",
      "verifiedEndpoint": "https://…",
      "status": "ACTIVE",
      "enabled": true,
      "verificationState": "verified",
      "verifiedBy": "…",
      "label": "nightly-1",
      "account": "…",
      "verifiedModels": ["…"],
      "servingModels": ["…"],
      "lastVerifiedAt": "2026-09-18T09:00:00.000Z",
      "proxy": "…",
      "proxySource": "pool",
      "proxyCountry": "de",
      "proxyExpiresAt": "2026-10-18T09:00:00.000Z",
      "proxyExpiryDays": 30,
      "proxyLost": false,
      "probedVia": "…",
      "lastError": null,
      "needsReauth": false,
      "accountLimits": null,
      "accountLimitsSource": null,
      "accountLimitsCheckedAt": null,
      "earnings": { "earnedMicros": "1250000", "requestCount": 42 },
      "createdAt": "2026-09-01T09:00:00.000Z"
    }
  ]
}

Offers

GEThttps://getvibeapi.com/api/marketplace/suppliers/api/v1/offers

サプライヤーのオファー。現在の価格と、公式カードに対するリアルタイムのパーセンテージが付きます。

{
  "offers": [
    {
      "id": "…",
      "baseModel": "claude-opus-5",
      "claimedModel": "claude-opus-5",
      "providerLabel": "…",
      "status": "ACTIVE",
      "statusReason": null,
      "inputMicrosPer1M": "1000000",
      "outputMicrosPer1M": "2000000",
      "cacheReadMicrosPer1M": null,
      "blendedPctOfOfficial": "0.42",
      "officialPrice": null,
      "pctOfOfficial": 42,
      "trafficTier": "…",
      "cooldownUntil": null,
      "cooldownReason": null,
      "firstVerifiedAt": "2026-09-01T09:00:00.000Z",
      "activatedAt": "2026-09-01T09:00:00.000Z",
      "lastManualPriceChangeAt": null,
      "maxConcurrentRequests": 8,
      "servingEnabled": true
    }
  ]
}

価格変更履歴

GEThttps://getvibeapi.com/api/marketplace/suppliers/api/v1/offers/{offerId}/price-changes

サプライヤー自身のオファー1件の価格変更台帳:予定済み、適用済み、キャンセル済みの変更です。別のサプライヤーに属するオファーは 404 を返します。

{
  "offerId": "…",
  "schedules": [
    {
      "id": "…",
      "offerId": "…",
      "priceInUsd": "1.000000",
      "priceOutUsd": "2.000000",
      "effectiveFrom": "2026-10-01T00:00:00.000Z",
      "createdAt": "2026-09-18T09:00:00.000Z",
      "cancelledAt": null,
      "appliedAt": null
    }
  ]
}

統計

GEThttps://getvibeapi.com/api/marketplace/suppliers/api/v1/stats

キャビネットの統計ページが表示するのと同じ形式: totals、14日間の daily シリーズ、オファーごとの byOffer 内訳。

{
  "totals": {
    "requests": 12000,
    "successes": 11880,
    "errors": 90,
    "timeouts": 30,
    "successRatePct": 99,
    "promptTokens": 9000000,
    "completionTokens": 4000000,
    "cacheTokens": 2500000,
    "sourceCostMicros": 12345678,
    "avgLatencyMs": 812.4,
    "p50LatencyMs": 640,
    "p95LatencyMs": 2100
  },
  "daily": [
    { "date": "2026-09-05", "requests": 800, "successes": 795, "errors": 4, "promptTokens": 600000, "completionTokens": 250000, "sourceCostMicros": 900000 }
  ],
  "byOffer": [
    { "offerId": "…", "baseModel": "claude-opus-5", "requests": 12000, "successRatePct": 99, "promptTokens": 9000000, "completionTokens": 4000000, "tokens": 13000000, "sourceCostMicros": 12345678, "hitRate": 0.28, "effTotal": 3.14, "rank": 1 }
  ]
}

収益

GEThttps://getvibeapi.com/api/marketplace/suppliers/api/v1/earnings

直近の決済対象ルート試行を最大 500 件、新しい順に表示します。

{
  "events": [
    {
      "id": "…",
      "baseModel": "claude-opus-5",
      "result": "SUCCESS",
      "promptTokens": "1200",
      "completionTokens": "800",
      "paidMicros": "420000",
      "settlementEligible": true,
      "finishedAt": "2026-09-18T09:00:00.000Z",
      "settlementStatus": "pending_or_settled"
    }
  ]
}

接続を作成

POSThttps://getvibeapi.com/api/marketplace/suppliers/api/v1/connections

すでにお持ちの認証情報から、1 つのアカウントまたはパック全体を作成できます — ブラウザでの OAuth ラウンドトリップは不要です。ボディは 単一の項目、{ "items": [ … ] } エンベロープ、または ベア配列 です。3 つとも同じ項目ごとの結果に正規化されます。以前の /api/marketplace/suppliers/api/v1/connections/batch パスは同じハンドラーのエイリアスです。

認証情報の形式

すべてのアイテムはproviderでプールを指定し (読み取り可能なプール名、例: codex や claude-code)、正確に 1 つの資格情報の形式を持ちます:

パラメータータイプ説明
codexAuthJsoncodex-bundleCodex CLI の ~/.codex/auth.json をそのまま貼り付け: auth_mode、tokens.{id_token,access_token,refresh_token,account_id}、_meta.{plan_type,email}。
accessToken + refreshTokenclaude-tokensClaude Code アクセストークン(sk-ant-oat01-…)とそのリフレッシュトークン。
refreshTokenantigravity-refreshAntigravity のリフレッシュトークン。
apiKeyapi-keyすぐに使えるサブスクリプション用 API キーです。
bindToken + oauthCodeoauth-code貼り付けたバンドルの代わりに使用した場合の、ブラウザフローによる OAuth の結果。

すべてのアイテムには動作する egress プロキシが付属しており、プロキシなしの接続はありません。独自のproxyを渡すか、当社のプロキシの 1 つを優先するためにproxyCountryを渡します。どちらも渡さない場合、サーバーがベンダーリクエストの前に独自のプロキシを割り当てて検証します。プールのプロキシを検証できない場合、そのアイテムはproxy_unavailableとして拒否されます。externalIdは相関のためにそのまま返されます。

curl https://getvibeapi.com/api/marketplace/suppliers/api/v1/connections \
  -H "Authorization: Bearer $SUPPLIER_API_KEY" \
  -H "Content-Type: application/json" \
  --data @pack.json

pack.json — 自社プロキシ1つと国別プールプロキシ1つ:

[
  {
    "externalId": "codex-1",
    "provider": "codex",
    "connectionLabel": "nightly-codex-1",
    "codexAuthJson": "{\"auth_mode\":\"chatgpt\",\"tokens\":{\"id_token\":\"…\",\"access_token\":\"…\",\"refresh_token\":\"…\",\"account_id\":\"…\"},\"_meta\":{\"plan_type\":\"plus\",\"email\":\"…\"}}",
    "proxy": { "scheme": "http", "host": "proxy.example.com", "port": 8899, "username": "u", "password": "p" },
    "offers": [{ "baseModel": "deepseek-v4.1-flash", "inputMicrosPer1M": 1000000, "outputMicrosPer1M": 2000000 }]
  },
  {
    "externalId": "claude-1",
    "provider": "claude-code",
    "connectionLabel": "nightly-claude-1",
    "accessToken": "sk-ant-oat01-…",
    "refreshToken": "sk-ant-ort01-…",
    "proxyCountry": "de",
    "offers": [{ "baseModel": "claude-opus-5", "inputMicrosPer1M": 1000000, "outputMicrosPer1M": 2000000 }]
  }
]
同じアカウントを再送信しても安全です。認証情報のフィンガープリントが一意であるため、再試行は項目ごとの duplicate 拒否を返し、新しいものは何も書き込まれません。失敗したパック項目は 1 つずつ再試行してください。

部分的な成功が契約です

各アイテムはベンダーに対して検証され、個別に書き込まれます。1 つの不正な行がバッチ全体を失敗させることはなく、アイテムがok: trueとして報告されるのは、その接続行がコミットされた後だけです。

{
  "supplierId": "…",
  "accepted": 1,
  "rejected": 1,
  "results": [
    {
      "index": 0,
      "externalId": "row-1",
      "ok": true,
      "connectionId": "…",
      "connectionType": "subscription-api-key",
      "verificationState": "verified",
      "verifiedModels": ["…"],
      "subscriptionProduct": "codebuddy-cn",
      "verifiedEndpoint": "https://…",
      "latencyMs": 210
    },
    {
      "index": 1,
      "externalId": "row-2",
      "ok": false,
      "code": "bind_session_invalid",
      "error": "the authorization session expired or did not match"
    }
  ]
}

項目ごとの拒否コード

パラメータータイプ説明
invalid_credentialcodeベンダーが認証情報の形式または値を拒否しました。
connection_type_unavailablecodeその接続タイプはまだ利用できません。
subscription_product_unavailablecodeその名前のサブスクリプション製品は提供されていません。
provider_unavailablecode選択したプロバイダーは利用できません。
bind_session_invalidcodeOAuth セッションが期限切れであるか、一致しませんでした。
proxy_requiredcode解決されたプロキシに使用可能な URL がありませんでした。(プロキシを指定していない項目には、代わりに1つが割り当てられます。)
proxy_unavailablecode要求された国について、あるいは国が指定されなかった場合はどの国についても、プールプロキシを証明できませんでした。
proxy_race_lostcodeそのプロキシはちょうど今、別の接続に取得されました。
probe_failedcodeベンダーがライブプローブ中に認証情報を拒否しました。
model_not_servedcodeアカウントが要求されたモデルを確認しませんでした。拒否されたモデルはアイテムの "models" 配列にあります。
duplicatecode同じ認証情報のフィンガープリントがすでに接続されています。
encryption_unavailablecodeプロジェクトで認証情報の暗号化が設定されていません。
internal_errorcode予期しないサーバーエラーです。後でその項目を再試行してください。
拒否の応答に認証情報、トークン、OAuth コードが含まれることはありません。拒否は項目のインデックスとコードのみがログに記録されます。

プロキシの事前確認

POSThttps://getvibeapi.com/api/marketplace/suppliers/proxy-check

認証情報を渡す前にプロキシを検証します。自身の proxy または proxyCountry を指定すると、サーバーは接続に使用するのと同じトンネルを開き、その経由でニュートラルなホストに到達します。これは事前確認にすぎません。create 呼び出しもまったく同じチェックを実行し、トークンを交換したりベンダーにプローブする前に拒否するため、壊れたプロキシで認証情報が失われることはありません。

curl https://getvibeapi.com/api/marketplace/suppliers/proxy-check \
  -H "Content-Type: application/json" \
  -d '{ "proxy": { "scheme": "http", "host": "proxy.example.com", "port": 8899, "username": "u", "password": "p" } }'
{ "ok": true, "outcome": "ok", "latencyMs": 42 }
応答に含まれるのは結果とレイテンシのみです。プロキシ URL、その userinfo、exit アドレスがエコーされることはありません。失敗時は 422 と outcome: "proxy_failed" を返し、無料プールプロキシのない国は 409 と proxy_unavailable を返します。

ブラウザOAuth(cabinet)

キャビネット独自の 2 ステップ OAuth フロー。バンドルを持たずにブラウザでアカウントを連携する場合に使用します:

POSThttps://getvibeapi.com/api/marketplace/suppliers/connect/start

ボディは{ "connectionType": "claude-code" | "codex-oauth" }です。authorizeUrlを返して開き、コードをPKCEセッションに結び付ける署名済みのbindTokenを返します。何も永続化されません。

POSThttps://getvibeapi.com/api/marketplace/suppliers/connect

完了したグラントを送信します — bindToken に加えて oauthCode、および作成アイテムと同じ offers / proxy フィールドです。コードを交換する前にプロキシが検証されます。これら 2 つのルートはキャビネットセッションを使用するため、マシンキーからは呼び出せません(代わりに POST /connections を bindToken + oauthCode とともに使用してください)。

レート制限

パラメータータイプ説明
Create connectionslimit1 回の呼び出しにつき最大 25 項目。サプライヤーごとに 1 時間あたり 20 回の呼び出しで、IP ごとの 1 時間あたり 120 回の上限に加えて適用されます。各項目は外部ベンダーへのプローブです。
Proxy pre-flightlimitIP あたり 1 時間に 30 回の呼び出しです。各呼び出しは中立のホストへのトンネルを1つ開きます。
Read endpointslimit共有マシンのサーフェスでは、ルートが独自の上限を設定している場合を除き、IP あたり 1 時間に 600 リクエストです。
Cabinet key managementlimitキーの一覧取得は IP あたり 1 時間に 120 回、発行は 1 時間に 20 回、失効は 1 時間に 60 回です。
429 レスポンスは Retry-After を秒単位で返します。その遅延の後にバックオフして再試行してください。同じ認証情報の再送信は、一意の認証情報フィンガープリントにより duplicate として拒否されます。

エラーレスポンス

パラメータータイプ説明
401statusAPIキーが欠落しているか、不明または無効化されています。呼び出し元が各ケースを区別できないよう、メッセージは1つに固定されています。
404statusこのプロジェクトにはそのパスが存在しないか(ここではマーケットプレイスが有効になっていません)、または対象のオファーが別のサプライヤーに属しています。
429statusレート制限。Retry-After は共有リミッターによって返されます。
400statusJSON が不正、またはバッチが上限を超えています。本文に無効な入力が示されます。

すべてのエンドポイントの機械可読な記述は、/api/openapi の OpenAPI ドキュメントの一部です。OpenAPI クライアントジェネレーターをこれに向けて、型付きクライアントを構築してください。

サプライヤー機 API — sk-sup キー、バッチオンボーディング、読み取り | GetVibe API