आपूर्तिकर्ता मशीन API
Supplier marketplace machine API: cabinet में sk-sup-… key mint करें, हर endpoint को Authorization: Bearer के साथ call करें, connections को batches में onboard करें और connections, offers, price changes, earnings तथा statistics पढ़ें।
Supplier cabinet की एक machine surface है: कोई supplier browser session के बजाय supplier-scoped API key का उपयोग करके script से accounts को bulk में onboard कर सकता है और अपने connections, offers, prices, price-change history, earnings और statistics पढ़ सकता है।
यह additive है। browser cabinet अपरिवर्तित रहता है, और machine routes वही payloads जोड़ते हैं जो cabinet pages जोड़ते हैं, इसलिए दोनों surfaces अलग-अलग numbers नहीं बता सकते।
key पाएँ
Machine keys supplier cabinet में बनाई और रद्द की जाती हैं। पूरा token केवल creation के समय एक बार दिखाया जाता है, और फिर कभी वापस नहीं लौटाया जाता।
- supplier cabinet खोलें और Machine API keys सेक्शन ढूँढें।
- key को एक label दें (optional) और create दबाएँ।
- token को तुरंत copy करें। यह
sk-sup-से शुरू होता है। - इसे किसी secret manager या environment variable में रखें। इसे कभी commit न करें और न ही support message में भेजें।
कैबिनेट प्रबंधन एंडपॉइंट
ये routes cabinet session या tracking token का उपयोग करते हैं। ये जानबूझकर machine key स्वीकार नहीं करते, इसलिए leak हुई machine key अन्य keys न तो बना सकती है और न ही revoke कर सकती है।
| Parameter | Type | विवरण |
|---|---|---|
GET /api/marketplace/suppliers/me/api-keys | list | List keys: id, label, prefix, active, lastUsedAt, createdAt. token या उसका hash कभी नहीं। |
POST /api/marketplace/suppliers/me/api-keys | mint | Body { "label"?: string }। लौटाता है { "key": "sk-sup-…", "apiKey": { … } } — token केवल इसी समय दिखाई देता है। |
DELETE /api/marketplace/suppliers/me/api-keys/{id} | revoke | एक key revoke करें। जब id caller का न हो तो 404। |
Authentication
हर machine route के लिए supplier key bearer token के रूप में चाहिए:
Authorization: Bearer sk-sup-<64 hex>curl https://getvibeapi.com/api/marketplace/suppliers/api/v1/connections \
-H "Authorization: Bearer $SUPPLIER_API_KEY"एक request key को ठीक एक supplier तक resolve करती है, और हर query उसी id से filter होती है। Revocation दोनों — key id और उसके owner — से scoped है, इसलिए कोई supplier दूसरे supplier की key revoke नहीं कर सकता। Key को कभी log या transmit न करें।
401 message लौटाती है, इसलिए caller इन मामलों में फ़र्क़ नहीं कर सकता। Key सिर्फ़ HTTPS पर भेजें।पठन एंडपॉइंट्स
सभी GET हैं, API-key से authenticated और authenticated supplier तक scoped। Micro-USD money strings के रूप में लौटाया जाता है; token counts numbers होते हैं।
Connections
Supplier के जुड़े हुए accounts, प्रत्येक के साथ कि उसने क्या कमाया है (केवल payable)।
{
"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"
}
]
}ऑफ़र
Supplier के offers, वर्तमान कीमतों और official card के live percentage के साथ।
{
"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
}
]
}मूल्य-परिवर्तन इतिहास
किसी एक supplier के अपने offers के लिए price-change ledger: planned, applied और cancelled बदलाव। किसी दूसरे supplier से जुड़ा offer 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
}
]
}Statistics
वही आकार जो cabinet statistics page दिखाता है: totals, एक 14-दिन की daily series और प्रति-offer byOffer breakdown।
{
"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 }
]
}Earnings
अधिकतम 500 recent settlement-eligible route attempts, newest first।
{
"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"
}
]
}connections बनाएँ
आपके पास पहले से मौजूद credential से एक account या पूरा pack बनाएँ — कोई browser OAuth round-trip नहीं। Body एक item, { "items": [ … ] } envelope, या bare array हो सकती है। तीनों को उसी per-item result में normalise किया जाता है। पुराना /api/marketplace/suppliers/api/v1/connections/batch path उसी handler का alias है।
credential के आकार
हर item provider से pool का नाम बताता है (readable pool name, जैसे codex या claude-code) और ठीक एक credential shape रखता है:
| Parameter | Type | विवरण |
|---|---|---|
codexAuthJson | codex-bundle | Codex CLI ~/.codex/auth.json जैसा है वैसा ही paste किया गया: auth_mode, tokens.{id_token,access_token,refresh_token,account_id}, _meta.{plan_type,email}। |
accessToken + refreshToken | claude-tokens | Claude Code access token (sk-ant-oat01-…) और उसका refresh token। |
refreshToken | antigravity-refresh | एक Antigravity refresh token। |
apiKey | api-key | एक तैयार subscription API key। |
bindToken + oauthCode | oauth-code | browser flow से OAuth result, जब आपने pasted bundle की जगह इसका इस्तेमाल किया। |
हर item में एक काम करने वाला egress proxy होता है, और proxy-less connection जैसा कुछ नहीं है। अपना proxy दें, या हमारे में से किसी को prefer करने के लिए proxyCountry दें; दोनों में से कुछ न दें तो server किसी भी vendor request से पहले अपना एक proxy assign और prove करता है। यदि pool का कोई proxy prove नहीं हो पाता, तो item को proxy_unavailable के रूप में refuse कर दिया जाता है। correlation के लिए externalId ज्यों का त्यों echo किया जाता है।
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 — एक अपना proxy और एक country-pool proxy:
[
{
"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 refusal लौटाता है और कुछ भी नया नहीं लिखता। विफल pack को item दर item retry करें।Partial success ही contract है
हर item को vendor के सामने verify किया जाता है और अलग से लिखा जाता है। एक खराब row कभी पूरे batch को fail नहीं करती, और किसी item को ok: true तभी report किया जाता है जब उसकी connection row commit हो चुकी हो।
{
"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"
}
]
}प्रति-आइटम अस्वीकृति कोड
| Parameter | Type | विवरण |
|---|---|---|
invalid_credential | code | Vendor ने credential का shape या value अस्वीकार कर दिया। |
connection_type_unavailable | code | वह connection type अभी उपलब्ध नहीं है। |
subscription_product_unavailable | code | यह नामित subscription product उपलब्ध नहीं है। |
provider_unavailable | code | चुना गया provider उपलब्ध नहीं है। |
bind_session_invalid | code | OAuth session खत्म हो गया या match नहीं हुआ। |
proxy_required | code | Resolve किए गए proxy का कोई उपयोगी URL नहीं था। (जो item कोई proxy नहीं बताता, उसे इसके बजाय एक assign किया जाता है।) |
proxy_unavailable | code | अनुरोधित देश के लिए, या कोई देश नामित न होने पर किसी भी देश के लिए, कोई pool proxy सिद्ध नहीं हो सका। |
proxy_race_lost | code | वह proxy अभी-अभी किसी दूसरे connection ने ले लिया। |
probe_failed | code | Live probe के दौरान vendor ने credential अस्वीकार कर दिया। |
model_not_served | code | अकाउंट ने माँगे गए model की पुष्टि नहीं की; अस्वीकार किए गए models item की "models" array में हैं। |
duplicate | code | वही credential fingerprint पहले से जुड़ा हुआ है। |
encryption_unavailable | code | project पर credential encryption configure नहीं है। |
internal_error | code | एक unexpected server error। single item को बाद में retry करें। |
प्रॉक्सी प्री-फ़्लाइट
किसी credential को सौंपने से पहले proxy को verify करें: अपना खुद का proxy या कोई proxyCountry दें और server वही tunnel खोलता है जिसका उपयोग वह connection के लिए करेगा और उसके ज़रिए एक neutral host तक पहुँचता है। यह केवल एक pre-flight है — create call वही जाँच चलाता है और token का आदान-प्रदान करने या vendor को probe करने से पहले मना कर देता है, इसलिए टूटा हुआ proxy कभी किसी credential की कीमत नहीं बनता।
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" लौटाती है; जिस देश के लिए कोई free pool proxy नहीं है वह 409 के साथ proxy_unavailable लौटाता है।ब्राउज़र OAuth (कैबिनेट)
cabinet का अपना two-step OAuth flow, उस स्थिति के लिए जब आप bundle रखने की जगह browser में account link करते हैं:
Body { "connectionType": "claude-code" | "codex-oauth" }। खोलने के लिए authorizeUrl और code को PKCE session से जोड़ने वाला signed bindToken लौटाता है। कुछ भी persist नहीं होता।
पूरा किया गया grant submit करता है — bindToken के साथ-साथ oauthCode और create item जैसे ही offers / proxy fields। code exchange होने से पहले proxy सिद्ध हो जाता है। ये दोनों routes cabinet session का उपयोग करते हैं; कोई machine key इन्हें call नहीं कर सकती (इसके बजाय bindToken + oauthCode के साथ POST /connections का उपयोग करें)।
दर सीमाएँ
| Parameter | Type | विवरण |
|---|---|---|
Create connections | limit | प्रति call अधिकतम 25 items। प्रति supplier 20 calls प्रति घंटा, ऊपर से 120/hour per-IP cap के अतिरिक्त। हर item एक outbound vendor probe है। |
Proxy pre-flight | limit | 30 calls per hour per IP। हर call एक neutral host के लिए एक tunnel खोलती है। |
Read endpoints | limit | shared machine surface के लिए 600 requests per hour per IP, जब तक कोई route अपनी अलग cap तय न करे। |
Cabinet key management | limit | keys list करने के लिए 120/hour per IP, mint करने के लिए 20/hour, revoke करने के लिए 60/hour। |
429 response में Retry-After सेकंड में आता है। उतनी देर back off करके retry करें; वही credential दोबारा submit करने पर unique credential fingerprint की वजह से duplicate के रूप में मना कर दिया जाता है।त्रुटि प्रतिक्रियाएँ
| Parameter | Type | विवरण |
|---|---|---|
401 | status | API key गुम, अज्ञात या निरस्त। एक ही निश्चित संदेश, ताकि caller इन स्थितियों में अंतर न कर सके। |
404 | status | यह path इस project पर मौजूद नहीं है (यहाँ marketplace enabled नहीं है), या address किया गया offer किसी दूसरे supplier का है। |
429 | status | Rate limit। Retry-After shared limiter द्वारा लौटाया जाता है। |
400 | status | Malformed JSON या cap से ऊपर का batch। body अमान्य input का नाम बताती है। |
हर endpoint का machine-readable विवरण /api/openapi पर मौजूद OpenAPI document का हिस्सा है। typed client बनाने के लिए किसी OpenAPI client generator को उस पर point करें।