供应商机器 API
供应商 marketplace 机器 API:在 cabinet 中生成一个 sk-sup-… 密钥,使用 Authorization: Bearer 调用每个端点,批量接入连接,并读取连接、报价、价格变更、收入和统计数据。
供应商 cabinet 提供机器接口:供应商可以批量接入账户,并通过脚本读取自己的连接、报价、价格、价格变更历史、收入和统计数据,使用供应商范围的 API 密钥,而不是浏览器会话。
这是增量功能。浏览器控制台保持不变,机器路由会组装与控制台页面相同的载荷,因此两个界面不可能报告不同的数字。
获取密钥
机器密钥在 供应商管理柜 中生成和撤销。完整令牌仅在创建时显示一次,此后不再返回。
- 打开供应商控制台,找到 Machine API keys 部分。
- 为密钥填写标签(可选),然后点击创建。
- 立即复制令牌。它以
sk-sup-开头。 - 将其存储在密钥管理器或环境变量中。切勿将其提交到代码仓库或通过支持消息发送。
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": { … } } —— 令牌唯一一次出现的地方。 |
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 及其所有者范围内,因此供应商无法撤销其他供应商的密钥。切勿记录或传输密钥。
401 消息,因此调用方无法区分这些情况。仅通过 HTTPS 发送 key。读取端点
全部为 GET,通过 API key 进行身份验证,并限定在已验证的供应商范围内。Micro-USD 金额以字符串返回;token 数量为数字。
连接
供应商已连接的账户,以及每个账户的收入(仅限可支付收入)。
{
"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": [
{
"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
}
]
}价格变更历史
某个供应商自有报价的价格变更记录:计划中的、已应用的和已取消的变更。属于其他供应商的报价会回答 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
}
]
}统计信息
与 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 }
]
}收益
最多 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"
}
]
}创建连接
使用你已有的凭据创建一个账户或整套账户,无需浏览器 OAuth 往返。请求正文可以是 一个项目、{ "items": [ … ] } 信封或 裸数组。这三种形式都会规范化为相同的逐项目结果。较旧的 /api/marketplace/suppliers/api/v1/connections/batch 路径是同一处理程序的别名。
凭据格式
每个项目通过provider指定代理池(可读的池名称,例如codex或claude-code),并且恰好携带一种凭据格式:
| 参数 | 类型 | 描述 |
|---|---|---|
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 结果,即你使用它而不是粘贴凭据包时的结果。 |
每个项目都带有可用的出口代理,不存在无代理连接。传入你自己的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.jsonpack.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_credential | code | 供应商拒绝了该凭据的格式或值。 |
connection_type_unavailable | code | 该连接类型尚不可用。 |
subscription_product_unavailable | code | 不提供该名称的订阅产品。 |
provider_unavailable | code | 所选提供商不可用。 |
bind_session_invalid | code | OAuth 会话已过期或不匹配。 |
proxy_required | code | 解析出的代理没有可用的 URL。(未指定代理的项目会被分配一个代理。) |
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,服务器会打开连接将使用的同一条隧道,并通过它访问一个中立主机。这只是预检流程:创建调用会执行完全相同的检查,并在交换令牌或探测供应商之前拒绝请求,因此失效的代理不会消耗凭据。
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(控制台)
控制台自身的两步 OAuth 流程,用于在浏览器中关联账户而不是持有凭据包时:
请求正文 { "connectionType": "claude-code" | "codex-oauth" }。返回用于打开的 authorizeUrl 和用于将代码与 PKCE 会话关联的签名 bindToken。不会持久化任何内容。
提交已完成的授权授予请求,即提交 bindToken,以及与创建项目相同的 oauthCode 和 offers / proxy 字段。代理会在交换代码之前完成验证。这两条路由使用 cabinet 会话;机器密钥无法调用它们(请改用 POST /connections,并配合 bindToken + oauthCode)。
速率限制
| 参数 | 类型 | 描述 |
|---|---|---|
Create connections | limit | 每次调用最多 25 个项目。每个供应商每小时 20 次调用,另有每个 IP 每小时 120 次的上限。每个项目都会发起一次出站供应商探测。 |
Proxy pre-flight | limit | 每个 IP 每小时 30 次调用。每次调用都会向中立主机打开一条隧道。 |
Read endpoints | limit | 共享机器界面每个 IP 每小时 600 个请求,除非某条路由设置了自己的上限。 |
Cabinet key management | limit | 每个 IP 每小时可列出密钥 120 次、创建密钥 20 次、撤销密钥 60 次。 |
429 响应会在 Retry-After 中携带秒数。等待该延迟后退避并重试;由于凭据指纹唯一,再次提交相同凭据会被拒绝,并返回 duplicate。错误响应
| 参数 | 类型 | 描述 |
|---|---|---|
401 | status | 缺少、未知或已撤销的 API 密钥。使用统一的固定消息,因此调用方无法区分这些情况。 |
404 | status | 此项目中不存在该路径(此处未启用 marketplace),或者所请求的报价属于其他供应商。 |
429 | status | 速率限制。共享限流器会返回 Retry-After。 |
400 | status | JSON 格式错误或批次超过上限。响应正文会指出无效输入。 |
每个 endpoint 的机器可读描述都包含在 /api/openapi 的 OpenAPI 文档中。将 OpenAPI client generator 指向该文档,即可生成类型化客户端。