主题
语言

供应商机器 API

供应商 marketplace 机器 API:在 cabinet 中生成一个 sk-sup-… 密钥,使用 Authorization: Bearer 调用每个端点,批量接入连接,并读取连接、报价、价格变更、收入和统计数据。

供应商 cabinet 提供机器接口:供应商可以批量接入账户,并通过脚本读取自己的连接、报价、价格、价格变更历史、收入和统计数据,使用供应商范围的 API 密钥,而不是浏览器会话。

这是增量功能。浏览器控制台保持不变,机器路由会组装与控制台页面相同的载荷,因此两个界面不可能报告不同的数字。

获取密钥

机器密钥在 供应商管理柜 中生成和撤销。完整令牌仅在创建时显示一次,此后不再返回。

  1. 打开供应商控制台,找到 Machine API keys 部分。
  2. 为密钥填写标签(可选),然后点击创建。
  3. 立即复制令牌。它以 sk-sup- 开头。
  4. 将其存储在密钥管理器或环境变量中。切勿将其提交到代码仓库或通过支持消息发送。
密钥经过哈希处理,而非加密:包括操作员在内,任何人都无法恢复丢失的密钥。请撤销该密钥并签发新密钥。一个供应商最多可持有 20 个活跃密钥。

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": { … } } —— 令牌唯一一次出现的地方。
DELETE /api/marketplace/suppliers/me/api-keys/{id}revoke撤销一个密钥。如果 id 不属于调用者,则返回 404。

身份验证

每条机器路由都需要将供应商密钥作为 bearer token:

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

请求会将密钥解析到唯一的供应商,并且每次查询都会按该 id 进行筛选。撤销操作同时限定在密钥 id 及其所有者范围内,因此供应商无法撤销其他供应商的密钥。切勿记录或传输密钥。

缺失、未知或已撤销的 key 都会返回同一条固定的 401 消息,因此调用方无法区分这些情况。仅通过 HTTPS 发送 key。

读取端点

全部为 GET,通过 API key 进行身份验证,并限定在已验证的供应商范围内。Micro-USD 金额以字符串返回;token 数量为数字。

连接

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"
    }
  ]
}

优惠

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

某个供应商自有报价的价格变更记录:计划中的、已应用的和已取消的变更。属于其他供应商的报价会回答 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

与 cabinet 统计页面显示的结构相同: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

使用你已有的凭据创建一个账户或整套账户,无需浏览器 OAuth 往返。请求正文可以是 一个项目、{ "items": [ … ] } 信封或 裸数组。这三种形式都会规范化为相同的逐项目结果。较旧的 /api/marketplace/suppliers/api/v1/connections/batch 路径是同一处理程序的别名。

凭据格式

每个项目通过provider指定代理池(可读的池名称,例如codex或claude-code),并且恰好携带一种凭据格式:

参数类型描述
codexAuthJsoncodex-bundle原样粘贴的 Codex 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 结果,即你使用它而不是粘贴凭据包时的结果。

每个项目都带有可用的出口代理,不存在无代理连接。传入你自己的proxy,或传入一个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 — 一个自有代理和一个国家池代理:

[
  {
    "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 拒绝结果,并且不会写入任何新内容。请逐项重试失败的打包项目。

部分成功是既定契约

每个项目都会向供应商验证,并单独写入。单个错误行永远不会导致整个批次失败;只有在其连接行提交后,项目才会报告为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。(未指定代理的项目会被分配一个代理。)
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,服务器会打开连接将使用的同一条隧道,并通过它访问一个中立主机。这只是预检流程:创建调用会执行完全相同的检查,并在交换令牌或探测供应商之前拒绝请求,因此失效的代理不会消耗凭据。

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、代理用户信息或出口地址。失败时返回 422 和 outcome: "proxy_failed";没有空闲池代理的国家返回 409 和 proxy_unavailable。

浏览器 OAuth(控制台)

控制台自身的两步 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 字段。代理会在交换代码之前完成验证。这两条路由使用 cabinet 会话;机器密钥无法调用它们(请改用 POST /connections,并配合 bindToken + oauthCode)。

速率限制

参数类型描述
Create connectionslimit每次调用最多 25 个项目。每个供应商每小时 20 次调用,另有每个 IP 每小时 120 次的上限。每个项目都会发起一次出站供应商探测。
Proxy pre-flightlimit每个 IP 每小时 30 次调用。每次调用都会向中立主机打开一条隧道。
Read endpointslimit共享机器界面每个 IP 每小时 600 个请求,除非某条路由设置了自己的上限。
Cabinet key managementlimit每个 IP 每小时可列出密钥 120 次、创建密钥 20 次、撤销密钥 60 次。
429 响应会在 Retry-After 中携带秒数。等待该延迟后退避并重试;由于凭据指纹唯一,再次提交相同凭据会被拒绝,并返回 duplicate。

错误响应

参数类型描述
401status缺少、未知或已撤销的 API 密钥。使用统一的固定消息,因此调用方无法区分这些情况。
404status此项目中不存在该路径(此处未启用 marketplace),或者所请求的报价属于其他供应商。
429status速率限制。共享限流器会返回 Retry-After。
400statusJSON 格式错误或批次超过上限。响应正文会指出无效输入。

每个 endpoint 的机器可读描述都包含在 /api/openapi 的 OpenAPI 文档中。将 OpenAPI client generator 指向该文档,即可生成类型化客户端。

供应商机器 API — sk-sup 密钥、批量接入、读取 | GetVibe API