Design
Sprache

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.

  1. Öffnen Sie das Lieferantenportal und suchen Sie den Bereich Machine API keys.
  2. Geben Sie dem Schlüssel eine Bezeichnung (optional) und klicken Sie auf „Erstellen“.
  3. Kopieren Sie das Token sofort. Es beginnt mit sk-sup-.
  4. Speichern Sie ihn in einem Secret-Manager oder einer Umgebungsvariablen. Committen Sie ihn niemals und senden Sie ihn nicht in einer Supportnachricht.
Schlüssel werden gehasht, nicht verschlüsselt: Niemand, auch kein Betreiber, kann einen verlorenen Schlüssel wiederherstellen. Widerrufen Sie ihn und stellen Sie einen neuen aus. Ein Anbieter kann höchstens 20 aktive Schlüssel halten.

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.

ParameterTypBeschreibung
GET /api/marketplace/suppliers/me/api-keyslistSchlüssel der Liste: id, label, prefix, active, lastUsedAt, createdAt. Niemals das Token oder seinen Hash.
POST /api/marketplace/suppliers/me/api-keysmintBody { "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}revokeWiderruft 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.

Ein fehlender, unbekannter oder widerrufener Schlüssel gibt immer dieselbe 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

GEThttps://getvibeapi.com/api/marketplace/suppliers/api/v1/connections

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

GEThttps://getvibeapi.com/api/marketplace/suppliers/api/v1/offers

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

GEThttps://getvibeapi.com/api/marketplace/suppliers/api/v1/offers/{offerId}/price-changes

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

GEThttps://getvibeapi.com/api/marketplace/suppliers/api/v1/stats

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

GEThttps://getvibeapi.com/api/marketplace/suppliers/api/v1/earnings

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

POSThttps://getvibeapi.com/api/marketplace/suppliers/api/v1/connections

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:

ParameterTypBeschreibung
codexAuthJsoncodex-bundleDie 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 + refreshTokenclaude-tokensDas Zugriffstoken von Claude Code (sk-ant-oat01-…) und sein Refresh-Token.
refreshTokenantigravity-refreshEin Antigravity-Refresh-Token.
apiKeyapi-keyEin fertiger Abonnement-API-Schlüssel.
bindToken + oauthCodeoauth-codeDas 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.json

pack.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 }]
  }
]
Das erneute Senden desselben Kontos ist sicher: Der Credential-Fingerprint ist eindeutig, sodass ein Wiederholungsversuch eine Ablehnung pro Element 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

ParameterTypBeschreibung
invalid_credentialcodeDer Anbieter hat die Form oder den Wert des Berechtigungsnachweises abgelehnt.
connection_type_unavailablecodeDieser Verbindungstyp ist noch nicht verfügbar.
subscription_product_unavailablecodeDas benannte Abonnementprodukt wird nicht angeboten.
provider_unavailablecodeDer ausgewählte Anbieter ist nicht verfügbar.
bind_session_invalidcodeDie OAuth-Sitzung ist abgelaufen oder stimmte nicht überein.
proxy_requiredcodeFür den aufgelösten Proxy war keine verwendbare URL vorhanden. (Ein Element, das keinen Proxy angibt, erhält stattdessen einen.)
proxy_unavailablecodeFür das angeforderte Land konnte kein Pool-Proxy nachgewiesen werden – oder für irgendein Land, wenn keines angegeben wurde.
proxy_race_lostcodeDieser Proxy wurde gerade von einer anderen Verbindung übernommen.
probe_failedcodeDer Anbieter hat den Berechtigungsnachweis während der Live-Prüfung abgelehnt.
model_not_servedcodeDas Konto hat ein angefordertes Modell nicht bestätigt; die abgelehnten Modelle befinden sich im Array „models“ des Elements.
duplicatecodeDer gleiche Berechtigungsnachweis-Fingerabdruck ist bereits verbunden.
encryption_unavailablecodeDie Anmeldedatenverschlüsselung ist für das Projekt nicht konfiguriert.
internal_errorcodeEin unerwarteter Serverfehler. Versuchen Sie es später für das einzelne Element erneut.
Eine Ablehnung enthält niemals eine Berechtigung, ein Token oder einen OAuth-Code. Ablehnungen werden nur mit dem Elementindex und dem Code protokolliert.

Proxy-Vorabtest

POSThttps://getvibeapi.com/api/marketplace/suppliers/proxy-check

Ü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 }
Die Antwort enthält nur ein Ergebnis und eine Latenz. Sie gibt niemals die Proxy-URL, die zugehörigen Benutzerinformationen oder die Exit-Adresse zurück. Ein Fehler antwortet mit 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:

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

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.

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

Ü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

ParameterTypBeschreibung
Create connectionslimitHö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-flightlimit30 Aufrufe pro Stunde und IP. Jeder Aufruf öffnet einen Tunnel zu einem neutralen Host.
Read endpointslimit600 Anfragen pro Stunde und IP für die gemeinsam genutzte Maschinenoberfläche, sofern eine Route kein eigenes Limit festlegt.
Cabinet key managementlimit120/Stunde pro IP zum Auflisten von Schlüsseln, 20/Stunde zum Erstellen und 60/Stunde zum Widerrufen.
Eine 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

ParameterTypBeschreibung
401statusFehlender, unbekannter oder widerrufener API-Schlüssel. Eine einheitliche Meldung, damit ein Aufrufer die Fälle nicht unterscheiden kann.
404statusDer Pfad existiert in diesem Projekt nicht (der Marktplatz ist hier nicht aktiviert), oder das adressierte Angebot gehört zu einem anderen Anbieter.
429statusRatenlimit. Retry-After wird vom gemeinsamen Limiter zurückgegeben.
400statusFehlerhaftes 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.

Supplier Machine API — sk-sup-Schlüssel, Batch-Onboarding, Lesezugriffe | GetVibe API