Supplier Machine API
Die programmgesteuerte Marketplace-API für Anbieter: Erstellen Sie im Cabinet einen sk-sup-…-Schlüssel, rufen Sie jeden Endpunkt mit Authorization: Bearer auf, richten Sie Verbindungen in Stapeln ein und lesen Sie Verbindungen, Angebote, Preisänderungen, Einnahmen und Statistiken aus.
Das Anbieter-Cabinet verfügt über eine programmgesteuerte Schnittstelle: Ein Anbieter kann Konten gesammelt einrichten und die eigenen Verbindungen, Angebote, Preise, Preisänderungen, Einnahmen und Statistiken per Skript auslesen, wobei ein anbieterspezifischer API-Schlüssel anstelle einer Browsersitzung verwendet wird.
Dies ist eine Ergänzung. Das Browser-Dashboard bleibt unverändert, und die Maschinenrouten stellen dieselben Payloads zusammen wie die Dashboard-Seiten. Daher können die beiden Oberflächen keine unterschiedlichen Zahlen melden.
Schlüssel erhalten
Maschinenschlüssel werden im Lieferantenbereich erstellt und widerrufen. Das vollständige Token wird bei der Erstellung einmal angezeigt und danach nie wieder zurückgegeben.
- Öffnen Sie das Lieferantenportal und suchen Sie den Bereich Machine API keys.
- Geben Sie dem Schlüssel eine Bezeichnung (optional) und klicken Sie auf „Erstellen“.
- Kopieren Sie das Token sofort. Es beginnt mit
sk-sup-. - Speichern Sie ihn in einem Secret-Manager oder einer Umgebungsvariablen. Committen Sie ihn niemals und senden Sie ihn nicht in einer Supportnachricht.
Endpunkte zur Cabinet-Verwaltung
Diese Routen verwenden die Dashboard-Sitzung oder das Tracking-Token. Sie akzeptieren absichtlich keinen Maschinenschlüssel, damit ein offengelegter Maschinenschlüssel keine anderen Schlüssel erstellen oder widerrufen kann.
| Parameter | Typ | Beschreibung |
|---|---|---|
GET /api/marketplace/suppliers/me/api-keys | list | Schlüssel der Liste: id, label, prefix, active, lastUsedAt, createdAt. Niemals das Token oder seinen Hash. |
POST /api/marketplace/suppliers/me/api-keys | mint | Body { "label"?: string }. Gibt { "key": "sk-sup-…", "apiKey": { … } } zurück — dies ist der einzige Zeitpunkt, zu dem das Token angezeigt wird. |
DELETE /api/marketplace/suppliers/me/api-keys/{id} | revoke | Widerruft einen Schlüssel. 404, wenn die id nicht dem Aufrufer gehört. |
Authentifizierung
Jede Maschinenroute erfordert den Lieferantenschlüssel als Bearer-Token:
Authorization: Bearer sk-sup-<64 hex>curl https://getvibeapi.com/api/marketplace/suppliers/api/v1/connections \
-H "Authorization: Bearer $SUPPLIER_API_KEY"Eine Anfrage löst den Schlüssel genau einem Anbieter zu, und jede Abfrage wird nach dieser id gefiltert. Der Widerruf ist sowohl auf die id des Schlüssels als auch auf dessen Besitzer beschränkt, sodass ein Anbieter den Schlüssel eines anderen Anbieters nicht widerrufen kann. Protokollieren oder übertragen Sie den Schlüssel niemals.
401-Nachricht zurück, sodass ein Aufrufer die Fälle nicht unterscheiden kann. Übermitteln Sie den Schlüssel nur über HTTPS.Leseendpunkte
Alle sind GET und per API-Schlüssel authentifiziert sowie auf den authentifizierten Anbieter beschränkt. Geldbeträge in Mikro-USD werden als Strings zurückgegeben; Tokenanzahlen sind Zahlen.
Verbindungen
Die verbundenen Konten des Anbieters, jeweils mit ihren Einnahmen (nur auszahlbare Beträge).
{
"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"
}
]
}Angebote
Die Angebote des Anbieters mit den aktuellen Preisen und dem aktuellen prozentualen Anteil an der offiziellen Karte.
{
"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
}
]
}Historie der Preisänderungen
Das Preisänderungsprotokoll für eines der eigenen Angebote des Anbieters: geplante, angewendete und stornierte Änderungen. Ein Angebot eines anderen Anbieters antwortet mit 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
}
]
}Statistiken
Dieselbe Struktur, die die Statistikseite des Cabinets anzeigt: totals, eine daily-Reihe über 14 Tage und eine byOffer-Aufschlüsselung pro Angebot.
{
"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 }
]
}Einnahmen
Bis zu 500 aktuelle, für die Abrechnung geeignete Routenversuche, neueste zuerst.
{
"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"
}
]
}Verbindungen erstellen
Erstellen Sie ein Konto oder ein vollständiges Paket aus einer Anmeldedaten, über die Sie bereits verfügen – ohne OAuth-Roundtrip im Browser. Der Body ist ein Element, ein { "items": [ … ] }-Envelope oder ein rohes Array. Alle drei werden zum gleichen Ergebnis pro Element normalisiert. Der ältere /api/marketplace/suppliers/api/v1/connections/batch-Pfad ist ein Alias desselben Handlers.
Anmeldedatenstrukturen
Jedes Element benennt den Pool mit provider (dem lesbaren Poolnamen, z. B. codex oder claude-code) und enthält genau eine der folgenden Anmeldeinformationsformen:
| Parameter | Typ | Beschreibung |
|---|---|---|
codexAuthJson | codex-bundle | Die unverändert eingefügte ~/.codex/auth.json von Codex CLI: auth_mode, tokens.{id_token,access_token,refresh_token,account_id}, _meta.{plan_type,email}. |
accessToken + refreshToken | claude-tokens | Das Zugriffstoken von Claude Code (sk-ant-oat01-…) und sein Refresh-Token. |
refreshToken | antigravity-refresh | Ein Antigravity-Refresh-Token. |
apiKey | api-key | Ein fertiger Abonnement-API-Schlüssel. |
bindToken + oauthCode | oauth-code | Das OAuth-Ergebnis aus dem Browser-Ablauf, wenn Sie es anstelle eines eingefügten Bundles verwendet haben. |
Jedes Element verwendet einen funktionierenden Egress-Proxy, und es gibt keine Verbindung ohne Proxy. Übergeben Sie Ihren eigenen proxy oder einen proxyCountry, um einen unserer zu bevorzugen; übergeben Sie keinen von beiden, weist der Server vor jeder Anbieteranfrage einen eigenen zu und verifiziert ihn. Wenn kein Pool-Proxy verifiziert werden kann, wird das Element als proxy_unavailable abgelehnt. externalId wird unverändert zur Korrelation zurückgegeben.
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 – ein eigener Proxy und ein Proxy aus einem Länder-Pool:
[
{
"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 zurückgibt und nichts Neues schreibt. Wiederholen Sie ein fehlgeschlagenes Pack-Element einzeln.Teilerfolg ist Bestandteil des Vertrags
Jedes Element wird gegenüber dem Anbieter verifiziert und einzeln geschrieben. Eine fehlerhafte Zeile lässt den Batch niemals fehlschlagen, und ein Element wird erst als ok: true gemeldet, nachdem seine Verbindungszeile festgeschrieben wurde.
{
"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"
}
]
}Ablehnungscodes pro Element
| Parameter | Typ | Beschreibung |
|---|---|---|
invalid_credential | code | Der Anbieter hat die Form oder den Wert des Berechtigungsnachweises abgelehnt. |
connection_type_unavailable | code | Dieser Verbindungstyp ist noch nicht verfügbar. |
subscription_product_unavailable | code | Das benannte Abonnementprodukt wird nicht angeboten. |
provider_unavailable | code | Der ausgewählte Anbieter ist nicht verfügbar. |
bind_session_invalid | code | Die OAuth-Sitzung ist abgelaufen oder stimmte nicht überein. |
proxy_required | code | Für den aufgelösten Proxy war keine verwendbare URL vorhanden. (Ein Element, das keinen Proxy angibt, erhält stattdessen einen.) |
proxy_unavailable | code | Für das angeforderte Land konnte kein Pool-Proxy nachgewiesen werden – oder für irgendein Land, wenn keines angegeben wurde. |
proxy_race_lost | code | Dieser Proxy wurde gerade von einer anderen Verbindung übernommen. |
probe_failed | code | Der Anbieter hat den Berechtigungsnachweis während der Live-Prüfung abgelehnt. |
model_not_served | code | Das Konto hat ein angefordertes Modell nicht bestätigt; die abgelehnten Modelle befinden sich im Array „models“ des Elements. |
duplicate | code | Der gleiche Berechtigungsnachweis-Fingerabdruck ist bereits verbunden. |
encryption_unavailable | code | Die Anmeldedatenverschlüsselung ist für das Projekt nicht konfiguriert. |
internal_error | code | Ein unerwarteter Serverfehler. Versuchen Sie es später für das einzelne Element erneut. |
Proxy-Vorabtest
Überprüfen Sie einen Proxy, bevor Sie eine Zugangsdaten weitergeben: Geben Sie Ihre eigene proxy oder einen proxyCountry an, und der Server öffnet denselben Tunnel, den er für die Verbindung verwenden wird, und erreicht darüber einen neutralen Host. Dies ist nur ein Vorabtest – der Erstellungsaufruf führt dieselbe Prüfung aus und lehnt vorher ab, bevor er ein Token austauscht oder den Anbieter abfragt, sodass ein fehlerhafter Proxy niemals eine Zugangsdaten kostet.
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 mit outcome: "proxy_failed"; ein Land ohne kostenlosen Proxy-Pool antwortet mit 409 mit proxy_unavailable.Browser-OAuth (Cabinet)
Der zweistufige OAuth-Ablauf des Cabinets, wenn Sie ein Konto in einem Browser verknüpfen, anstatt ein Bundle zu verwenden:
Body { "connectionType": "claude-code" | "codex-oauth" }. Gibt den authorizeUrl zum Öffnen sowie den signierten bindToken zurück, der den Code an die PKCE-Sitzung bindet. Es wird nichts gespeichert.
Übermittelt den abgeschlossenen Grant — den bindToken sowie die oauthCode und dieselben offers- / proxy-Felder wie bei einem Create-Item. Der Proxy wird überprüft, bevor der Code ausgetauscht wird. Diese beiden Routen verwenden die Cabinet-Sitzung; ein Maschinenschlüssel kann sie nicht aufrufen (verwenden Sie stattdessen POST /connections mit bindToken + oauthCode).
Ratenlimits
| Parameter | Typ | Beschreibung |
|---|---|---|
Create connections | limit | Höchstens 25 Elemente pro Aufruf. 20 Aufrufe pro Stunde und Anbieter, zusätzlich zu einem Limit von 120/Stunde pro IP-Adresse. Jedes Element ist eine ausgehende Anbieterprüfung. |
Proxy pre-flight | limit | 30 Aufrufe pro Stunde und IP. Jeder Aufruf öffnet einen Tunnel zu einem neutralen Host. |
Read endpoints | limit | 600 Anfragen pro Stunde und IP für die gemeinsam genutzte Maschinenoberfläche, sofern eine Route kein eigenes Limit festlegt. |
Cabinet key management | limit | 120/Stunde pro IP zum Auflisten von Schlüsseln, 20/Stunde zum Erstellen und 60/Stunde zum Widerrufen. |
429-Antwort enthält Retry-After in Sekunden. Warten Sie diese Zeit ab und versuchen Sie es dann erneut; die erneute Übermittlung derselben Zugangsdaten wird aufgrund des eindeutigen Fingerabdrucks der Zugangsdaten als duplicate abgelehnt.Fehlerantworten
| Parameter | Typ | Beschreibung |
|---|---|---|
401 | status | Fehlender, unbekannter oder widerrufener API-Schlüssel. Eine einheitliche Meldung, damit ein Aufrufer die Fälle nicht unterscheiden kann. |
404 | status | Der Pfad existiert in diesem Projekt nicht (der Marktplatz ist hier nicht aktiviert), oder das adressierte Angebot gehört zu einem anderen Anbieter. |
429 | status | Ratenlimit. Retry-After wird vom gemeinsamen Limiter zurückgegeben. |
400 | status | Fehlerhaftes JSON oder ein Batch über dem Limit. Der Body benennt die ungültige Eingabe. |
Eine maschinenlesbare Beschreibung jedes Endpunkts ist im OpenAPI-Dokument unter /api/openapi enthalten. Verweisen Sie mit einem OpenAPI-Clientgenerator darauf, um einen typisierten Client zu erstellen.