Тема
Язык

Машинный API поставщика

Машинный API маркетплейса поставщиков: создайте в кабинете ключ sk-sup-…, вызывайте любой эндпоинт с Authorization: Bearer, подключайте соединения пакетами и читайте соединения, предложения, изменения цен, заработок и статистику.

У кабинета поставщика есть машинный интерфейс: поставщик может массово подключать аккаунты и читать из скрипта свои подключения, предложения, цены, историю изменений цен, заработок и статистику, используя API-ключ с областью поставщика вместо сессии браузера.

Это аддитивно. Браузерный кабинет не меняется, а машинные маршруты собирают те же полезные нагрузки, что и страницы кабинета, поэтому две поверхности не могут показывать разные числа.

Получить ключ

Машинные ключи создаются и отзываются в кабинете поставщика. Полный токен показывается один раз, при создании, и больше не возвращается.

  1. Откройте кабинет поставщика и найдите раздел Machine API keys.
  2. Дайте ключу метку (необязательно) и нажмите «Создать».
  3. Скопируйте токен сразу. Он начинается с sk-sup-.
  4. Храните его в менеджере секретов или переменной окружения. Никогда не коммитьте его и не отправляйте в сообщении в поддержку.
Ключи хранятся в виде хеша, а не в зашифрованном виде: никто, включая оператора, не может восстановить утерянный ключ. Отзовите его и выпустите новый. У одного поставщика может быть не более 20 активных ключей.

Эндпоинты управления личным кабинетом

Эти маршруты используют сессию кабинета или токен отслеживания. Они намеренно не принимают машинный ключ, поэтому утёкший машинный ключ не может создать или отозвать другие ключи.

ПараметрТипОписание
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Отзывает один ключ. 404, когда id не принадлежит вызывающему.

Аутентификация

Каждый машинный маршрут требует ключ поставщика в виде bearer-токена:

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.

Эндпоинты чтения

Все они GET, аутентификация по API-ключу и область действия ограничена аутентифицированным поставщиком. Денежные суммы в микро-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"
    }
  ]
}

Предложения

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

Та же форма, что показывает страница статистики в кабинете: totals, серия daily за 14 дней и разбивка по предложениям 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-tokensТокен доступа Claude Code (sk-ant-oat01-…) и его refresh-токен.
refreshTokenantigravity-refreshТокен обновления Antigravity.
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_invalidcodeСессия OAuth истекла или не совпала.
proxy_requiredcodeУ разрешённого прокси не оказалось пригодного URL. (Элементу, который не указывает прокси, он назначается вместо этого.)
proxy_unavailablecodeНе удалось доказать существование пула прокси для запрошенной страны или для любой страны, если ни одна не была указана.
proxy_race_lostcodeЭтот прокси только что заняло другое подключение.
probe_failedcodeВендор отклонил учётные данные во время live-проверки.
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 прокси, его userinfo или адрес выхода. Ошибка отвечает 422 с outcome: "proxy_failed"; страна без свободного прокси из пула отвечает 409 с proxy_unavailable.

Browser OAuth (личный кабинет)

Собственный двухшаговый OAuth-поток кабинета — для случая, когда вы привязываете аккаунт в браузере вместо того, чтобы хранить пакет:

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

Тело { "connectionType": "claude-code" | "codex-oauth" }. Возвращает authorizeUrl, который нужно открыть, и подписанный bindToken, привязывающий код к PKCE-сессии. Ничего не сохраняется.

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

Отправляет завершённый grant — bindToken плюс oauthCode и те же поля offers / proxy, что и у элемента create. Прокси подтверждается до обмена кода. Эти два маршрута используют сессию кабинета; машинный ключ не может их вызвать (вместо этого используйте POST /connections с bindToken + oauthCode).

Лимиты частоты

ПараметрТипОписание
Create connectionslimitНе более 25 элементов за вызов. 20 вызовов в час на поставщика в дополнение к ограничению в 120/час на IP-адрес. Каждый элемент — это исходящая проверка вендора.
Proxy pre-flightlimit30 вызовов в час на IP. Каждый вызов открывает один туннель к нейтральному хосту.
Read endpointslimit600 запросов в час на IP для общей машинной поверхности, если маршрут не задаёт собственный лимит.
Cabinet key managementlimit120/час на IP для просмотра списка ключей, 20/час на создание, 60/час на отзыв.
Ответ 429 содержит Retry-After в секундах. Подождите этот интервал и повторите; повторная отправка того же credential отклоняется как duplicate из-за уникального отпечатка credential.

Ответы с ошибками

ПараметрТипОписание
401statusКлюч API отсутствует, неизвестен или отозван. Сообщение всегда одинаковое, поэтому вызывающая сторона не может различить эти случаи.
404statusТакого пути в этом проекте нет (маркетплейс здесь не включён), либо запрошенное предложение принадлежит другому поставщику.
429statusЛимит частоты. Retry-After возвращается общим ограничителем.
400statusНекорректный JSON или пакет сверх лимита. В теле указан неверный входной параметр.

Машиночитаемое описание всех эндпоинтов входит в документ OpenAPI по адресу /api/openapi. Направьте на него генератор клиентов OpenAPI, чтобы собрать типизированный клиент.

API для машин поставщиков — ключи sk-sup, пакетная регистрация, чтение | GetVibe API