Машинный API поставщика
Машинный API маркетплейса поставщиков: создайте в кабинете ключ sk-sup-…, вызывайте любой эндпоинт с Authorization: Bearer, подключайте соединения пакетами и читайте соединения, предложения, изменения цен, заработок и статистику.
У кабинета поставщика есть машинный интерфейс: поставщик может массово подключать аккаунты и читать из скрипта свои подключения, предложения, цены, историю изменений цен, заработок и статистику, используя API-ключ с областью поставщика вместо сессии браузера.
Это аддитивно. Браузерный кабинет не меняется, а машинные маршруты собирают те же полезные нагрузки, что и страницы кабинета, поэтому две поверхности не могут показывать разные числа.
Получить ключ
Машинные ключи создаются и отзываются в кабинете поставщика. Полный токен показывается один раз, при создании, и больше не возвращается.
- Откройте кабинет поставщика и найдите раздел Machine API keys.
- Дайте ключу метку (необязательно) и нажмите «Создать».
- Скопируйте токен сразу. Он начинается с
sk-sup-. - Храните его в менеджере секретов или переменной окружения. Никогда не коммитьте его и не отправляйте в сообщении в поддержку.
Эндпоинты управления личным кабинетом
Эти маршруты используют сессию кабинета или токен отслеживания. Они намеренно не принимают машинный ключ, поэтому утёкший машинный ключ не может создать или отозвать другие ключи.
| Параметр | Тип | Описание |
|---|---|---|
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 | Отзывает один ключ. 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 возвращаются как строки; счётчики токенов — как числа.
Подключения
Подключённые аккаунты поставщика, каждый с тем, что он заработал (только к выплате).
{
"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
}
]
}Статистика
Та же форма, что показывает страница статистики в кабинете: 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 }
]
}Заработок
До 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-…) и его refresh-токен. |
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 | Вендор отклонил учётные данные во время live-проверки. |
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.Browser OAuth (личный кабинет)
Собственный двухшаговый OAuth-поток кабинета — для случая, когда вы привязываете аккаунт в браузере вместо того, чтобы хранить пакет:
Тело { "connectionType": "claude-code" | "codex-oauth" }. Возвращает authorizeUrl, который нужно открыть, и подписанный bindToken, привязывающий код к PKCE-сессии. Ничего не сохраняется.
Отправляет завершённый grant — bindToken плюс oauthCode и те же поля offers / proxy, что и у элемента create. Прокси подтверждается до обмена кода. Эти два маршрута используют сессию кабинета; машинный ключ не может их вызвать (вместо этого используйте POST /connections с bindToken + oauthCode).
Лимиты частоты
| Параметр | Тип | Описание |
|---|---|---|
Create connections | limit | Не более 25 элементов за вызов. 20 вызовов в час на поставщика в дополнение к ограничению в 120/час на IP-адрес. Каждый элемент — это исходящая проверка вендора. |
Proxy pre-flight | limit | 30 вызовов в час на IP. Каждый вызов открывает один туннель к нейтральному хосту. |
Read endpoints | limit | 600 запросов в час на IP для общей машинной поверхности, если маршрут не задаёт собственный лимит. |
Cabinet key management | limit | 120/час на IP для просмотра списка ключей, 20/час на создание, 60/час на отзыв. |
429 содержит Retry-After в секундах. Подождите этот интервал и повторите; повторная отправка того же credential отклоняется как duplicate из-за уникального отпечатка credential.Ответы с ошибками
| Параметр | Тип | Описание |
|---|---|---|
401 | status | Ключ API отсутствует, неизвестен или отозван. Сообщение всегда одинаковое, поэтому вызывающая сторона не может различить эти случаи. |
404 | status | Такого пути в этом проекте нет (маркетплейс здесь не включён), либо запрошенное предложение принадлежит другому поставщику. |
429 | status | Лимит частоты. Retry-After возвращается общим ограничителем. |
400 | status | Некорректный JSON или пакет сверх лимита. В теле указан неверный входной параметр. |
Машиночитаемое описание всех эндпоинтов входит в документ OpenAPI по адресу /api/openapi. Направьте на него генератор клиентов OpenAPI, чтобы собрать типизированный клиент.