サプライヤー マシン API
サプライヤーマーケットプレイスのマシン API:キャビネットで sk-sup-… キーを発行し、すべてのエンドポイントを Authorization: Bearer で呼び出して、接続を一括でオンボーディングし、接続、オファー、価格変更、収益、統計を読み取ります。
サプライヤーキャビネットにはマシン向けのインターフェースがあります。サプライヤーは、ブラウザセッションの代わりにサプライヤー単位の API キーを使い、スクリプトからアカウントを一括でオンボーディングして、自身の接続、オファー、価格、価格変更履歴、収益、統計を読み取ることができます。
これは加算的です。ブラウザcabinetは変更されず、マシンルートはcabinetページと同じペイロードを組み立てるため、2つのサーフェスが異なる数値を報告することはできません。
キーを取得
マシンキーは サプライヤーキャビネット で発行および失効されます。完全なトークンは作成時に一度だけ表示され、その後再び返されることはありません。
- サプライヤーの管理画面を開き、Machine API keys セクションを探します。
- キーにラベルを付け(任意)、作成を押します。
- トークンをすぐにコピーしてください。トークンは
sk-sup-で始まります。 - シークレットマネージャーまたは環境変数に保管してください。コミットしたり、サポートメッセージで送信したりしないでください。
Cabinet管理エンドポイント
これらのルートはcabinetセッションまたはトラッキングトークンを使用します。意図的にマシンキーを受け付けないため、漏洩したマシンキーで他のキーを発行したり失効させたりすることはできません。
| パラメーター | タイプ | 説明 |
|---|---|---|
GET /api/marketplace/suppliers/me/api-keys | list | キー一覧: id、label、prefix、active、lastUsedAt、createdAt。トークンやそのハッシュが返されることはありません。 |
POST /api/marketplace/suppliers/me/api-keys | mint | ボディ { "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 の金額は文字列として返され、トークン数は数値です。
接続
サプライヤーが接続したアカウント。それぞれの獲得額(支払可能分のみ)が付きます。
{
"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
サプライヤーのオファー。現在の価格と、公式カードに対するリアルタイムのパーセンテージが付きます。
{
"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
}
]
}価格変更履歴
サプライヤー自身のオファー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
}
]
}統計
キャビネットの統計ページが表示するのと同じ形式: 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 }
]
}収益
直近の決済対象ルート試行を最大 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"
}
]
}接続を作成
すでにお持ちの認証情報から、1 つのアカウントまたはパック全体を作成できます — ブラウザでの OAuth ラウンドトリップは不要です。ボディは 単一の項目、{ "items": [ … ] } エンベロープ、または ベア配列 です。3 つとも同じ項目ごとの結果に正規化されます。以前の /api/marketplace/suppliers/api/v1/connections/batch パスは同じハンドラーのエイリアスです。
認証情報の形式
すべてのアイテムはproviderでプールを指定し (読み取り可能なプール名、例: codex や claude-code)、正確に 1 つの資格情報の形式を持ちます:
| パラメーター | タイプ | 説明 |
|---|---|---|
codexAuthJson | codex-bundle | Codex CLI の ~/.codex/auth.json をそのまま貼り付け: auth_mode、tokens.{id_token,access_token,refresh_token,account_id}、_meta.{plan_type,email}。 |
accessToken + refreshToken | claude-tokens | Claude Code アクセストークン(sk-ant-oat01-…)とそのリフレッシュトークン。 |
refreshToken | antigravity-refresh | Antigravity のリフレッシュトークン。 |
apiKey | api-key | すぐに使えるサブスクリプション用 API キーです。 |
bindToken + oauthCode | oauth-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.jsonpack.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_credential | code | ベンダーが認証情報の形式または値を拒否しました。 |
connection_type_unavailable | code | その接続タイプはまだ利用できません。 |
subscription_product_unavailable | code | その名前のサブスクリプション製品は提供されていません。 |
provider_unavailable | code | 選択したプロバイダーは利用できません。 |
bind_session_invalid | code | OAuth セッションが期限切れであるか、一致しませんでした。 |
proxy_required | code | 解決されたプロキシに使用可能な URL がありませんでした。(プロキシを指定していない項目には、代わりに1つが割り当てられます。) |
proxy_unavailable | code | 要求された国について、あるいは国が指定されなかった場合はどの国についても、プールプロキシを証明できませんでした。 |
proxy_race_lost | code | そのプロキシはちょうど今、別の接続に取得されました。 |
probe_failed | code | ベンダーがライブプローブ中に認証情報を拒否しました。 |
model_not_served | code | アカウントが要求されたモデルを確認しませんでした。拒否されたモデルはアイテムの "models" 配列にあります。 |
duplicate | code | 同じ認証情報のフィンガープリントがすでに接続されています。 |
encryption_unavailable | code | プロジェクトで認証情報の暗号化が設定されていません。 |
internal_error | code | 予期しないサーバーエラーです。後でその項目を再試行してください。 |
プロキシの事前確認
認証情報を渡す前にプロキシを検証します。自身の 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 }422 と outcome: "proxy_failed" を返し、無料プールプロキシのない国は 409 と proxy_unavailable を返します。ブラウザOAuth(cabinet)
キャビネット独自の 2 ステップ OAuth フロー。バンドルを持たずにブラウザでアカウントを連携する場合に使用します:
ボディは{ "connectionType": "claude-code" | "codex-oauth" }です。authorizeUrlを返して開き、コードをPKCEセッションに結び付ける署名済みのbindTokenを返します。何も永続化されません。
完了したグラントを送信します — bindToken に加えて oauthCode、および作成アイテムと同じ offers / proxy フィールドです。コードを交換する前にプロキシが検証されます。これら 2 つのルートはキャビネットセッションを使用するため、マシンキーからは呼び出せません(代わりに POST /connections を bindToken + oauthCode とともに使用してください)。
レート制限
| パラメーター | タイプ | 説明 |
|---|---|---|
Create connections | limit | 1 回の呼び出しにつき最大 25 項目。サプライヤーごとに 1 時間あたり 20 回の呼び出しで、IP ごとの 1 時間あたり 120 回の上限に加えて適用されます。各項目は外部ベンダーへのプローブです。 |
Proxy pre-flight | limit | IP あたり 1 時間に 30 回の呼び出しです。各呼び出しは中立のホストへのトンネルを1つ開きます。 |
Read endpoints | limit | 共有マシンのサーフェスでは、ルートが独自の上限を設定している場合を除き、IP あたり 1 時間に 600 リクエストです。 |
Cabinet key management | limit | キーの一覧取得は IP あたり 1 時間に 120 回、発行は 1 時間に 20 回、失効は 1 時間に 60 回です。 |
429 レスポンスは Retry-After を秒単位で返します。その遅延の後にバックオフして再試行してください。同じ認証情報の再送信は、一意の認証情報フィンガープリントにより duplicate として拒否されます。エラーレスポンス
| パラメーター | タイプ | 説明 |
|---|---|---|
401 | status | APIキーが欠落しているか、不明または無効化されています。呼び出し元が各ケースを区別できないよう、メッセージは1つに固定されています。 |
404 | status | このプロジェクトにはそのパスが存在しないか(ここではマーケットプレイスが有効になっていません)、または対象のオファーが別のサプライヤーに属しています。 |
429 | status | レート制限。Retry-After は共有リミッターによって返されます。 |
400 | status | JSON が不正、またはバッチが上限を超えています。本文に無効な入力が示されます。 |
すべてのエンドポイントの機械可読な記述は、/api/openapi の OpenAPI ドキュメントの一部です。OpenAPI クライアントジェネレーターをこれに向けて、型付きクライアントを構築してください。