Reseller-API: Authentifizierung und Limits
Bearer-Token, Scopes, IP-Allowlist, Rate-Limit, Fehlercodes, Idempotenzschlüssel und Paginierung der OneProvider-Reseller-API, mit Beispielen.
Bearer-Tokens, Scopes, IP-Allowlist, Rate-Limit, Fehlercodes, Idempotency-Keys und Paginierung der Reseller-API.
Alle Modelle, Funktionen und Preise Dokumentationsindex für KI-Agenten:https://oneprovider.dev/docs/llms.txt Tokens
Ein Token sieht aus wie rsk_ gefolgt von 40 Zeichen. Sie erstellen ihn im Konto (Reiter „Reseller“, „API & Einstellungen“); der Wert wird nur einmal angezeigt, wir speichern nur einen Hash und die letzten 4 Zeichen. Sie können bis zu 10 aktive Tokens haben und jeden davon jederzeit widerrufen. Beim Erstellen lässt sich für einen Token eine Lebensdauer (1 bis 365 Tage) festlegen: Danach antwortet der Token mit 401 token_expired, und expires_at in GET /me nennt den Zeitpunkt (null: unbefristet).
httpAuthorization: Bearer rsk_... Nur serverseitig CORS ist deaktiviert. Betten Sie einen Token niemals in ein Browser-Bundle oder eine mobile App ein: Rufen Sie die API von Ihrem Backend aus auf. Verliert ein Reseller den Zugang, antworten alle seine Tokens mit 403 reseller_disabled. Scopes
Ein Token trägt eine Menge von Scopes. Scopes sind voneinander unabhängig: keys schließt read nicht ein. GET /me funktioniert mit jedem gültigen Token. Fehlt der erforderliche Scope, lautet die Antwort 403 forbidden_scope.
| Scope | Was er freischaltet |
|---|---|
read | Lesen: Guthaben und Transaktionen, Preise, Modelle, Kunden, Schlüssel und ihr Verbrauch, Bestellungen, Tarife, Statistik, die Shop-Einstellungen GET /settings, das Aktionsprotokoll GET /audit (jedes GET außer Codes, Webhooks, Bots und Zahlungsmethoden sowie dem Status der Aufladezahlung). |
keys | Schreiben: Kunden (einschließlich Sperren), Ausstellen, Bearbeiten, Pausieren, Aufladen, Rotieren und Löschen von Schlüsseln, POST /orders, die Shop-Einstellungen PATCH /settings (sie bestimmen, wie ausgestellte Schlüssel aussehen). |
codes | Code-Chargen und die Codes selbst (lesen, erstellen, widerrufen, einlösen). Codes sind Secrets, daher ein eigener Scope. |
plans | Tarife erstellen, bearbeiten und löschen (zum Lesen von Tarifen genügt read). |
billing | Aufladungen des Reseller-Guthabens: POST /balance/topups und der Zahlungsstatus. |
webhooks | Webhooks verwalten, einen Test senden, das Zustellungsprotokoll lesen. |
support | Reserviert für künftige Support-Endpoints. |
bot | Den Zustand der Bots und Zahlungsmethoden lesen: GET /bot und GET /payment-providers (keine Tokens in den Antworten). Bots werden nur im Konto verbunden. |
Der Scope jeder Methode steht in der Referenz .
IP-Allowlist
Ein Token lässt sich auf eine Liste von IPv4-/IPv6-Adressen oder CIDR-Bereichen beschränken (bis zu 20). Eine Anfrage von einer anderen Adresse erhält 403 ip_not_allowed. Die Liste wird beim Erstellen des Tokens festgelegt.
Rate-Limit
20 Anfragen pro Sekunde und Token sowie 100 pro Sekunde und Quell-IP-Adresse. Bei Überschreitung: 429 rate_limited und ein Header Retry-After. Warten Sie so viele Sekunden und versuchen Sie es erneut.
Fehler
Jeder Fehler hat dieselbe Form. Dieselbe id wird im Header X-Request-Id mitgesendet: Nennen Sie sie dem Support.
{
"error": {
"code": "insufficient_balance",
"message": "Not enough free reseller balance for this key.",
"request_id": "req_..."
}
} Verzweigen Sie nach error.code, nicht nach dem Meldungstext.
| HTTP | code | Bedeutung |
|---|---|---|
| 400 | invalid | Ein Feld fehlt oder liegt außerhalb des zulässigen Bereichs. |
| 400 | bad_request | Die Anfrage konnte nicht geparst werden. |
| 400 | idempotency_key_required | Bei einer Methode, die Geld ausgibt, fehlt der Header Idempotency-Key. |
| 400 | invalid_url | Die Webhook-URL hat die Prüfung nicht bestanden (nur https, keine IP-Adressen und keine privaten Netze). |
| 400 | limit_below_spent | Das neue Schlüssellimit liegt unter dem, was der Schlüssel bereits verbraucht hat. |
| 400 | currency_required | POST /balance/topups: Der Anbieter unterstützt mehrere Währungen, übergeben Sie currency (die erlaubten stehen in topup_providers). |
| 400 | method_unavailable | POST /balance/topups: Einen solchen Anbieter gibt es in topup_providers nicht (bad_currency, bad_email und email_required werden für Währung und E-Mail auf dieselbe Weise zurückgegeben). |
| 401 | unauthorized | Der Token fehlt, ist unbekannt oder wurde widerrufen. |
| 401 | token_expired | Der Token ist abgelaufen (expires_at in GET /me): Erstellen Sie einen neuen. |
| 403 | forbidden_scope | Dem Token fehlt der erforderliche Scope. |
| 403 | ip_not_allowed | Die IP-Adresse der Anfrage steht nicht in der Allowlist des Tokens. |
| 403 | reseller_disabled | Der Reseller hat den Zugang verloren; jeder Token antwortet so. |
| 403 | banned | Das Konto ist gesperrt. |
| 404 | not_found | Das Objekt existiert nicht oder gehört einem anderen Reseller. |
| 404 | key_not_found | Der Schlüssel existiert nicht. |
| 409 | insufficient_balance | Der Betrag passt nicht in „Verfügbar“ (available_usd), siehe die Geldregel. |
| 409 | idempotency_key_reused | Derselbe Idempotency-Key wurde bereits mit einem anderen Anfragekörper verwendet: Nehmen Sie einen neuen Key. |
| 409 | fund_first | Laden Sie zuerst das Reseller-Guthaben auf. |
| 409 | not_activated | Das Reseller-Konto ist noch nicht aktiviert. |
| 409 | name_taken | Ein Schlüssel mit diesem Namen existiert bereits. |
| 409 | key_limit | Die Höchstzahl an Schlüsseln ist erreicht. |
| 409 | plan_limit | Die Höchstzahl an Tarifen (20) ist erreicht. |
| 409 | customer_limit | Die Höchstzahl an Kunden (10.000) ist erreicht. |
| 409 | plan_in_use | Der Tarif kann nicht gelöscht, verteuert oder auf eine andere Währung umgestellt werden, solange ihn eine frische unbezahlte Rechnung oder ein bezahlter, aber nicht zugestellter Bot-Kauf verwendet. |
| 409 | key_exhausted | Rotieren: Der Schlüssel hat nichts mehr zu übertragen, der Rest ist 0. |
| 409 | key_expired | Rotieren: Der Schlüssel ist abgelaufen, verlängern Sie ihn zuerst. |
| 409 | action_failed | Die Schlüsselaktion ist aus einem anderen Grund fehlgeschlagen; wiederholen Sie sie oder prüfen Sie den Schlüssel. |
| 409 | code_used | Der Code wurde bereits eingelöst. |
| 409 | code_revoked | Der Code wurde widerrufen. |
| 409 | code_busy | Der Code wird gerade verarbeitet oder lässt sich jetzt nicht einlösen. |
| 409 | external_order_id_conflict | external_order_id wurde bereits mit anderen Parametern verwendet. |
| 409 | customer_exists | Ein Kunde mit dieser external_id existiert bereits. |
| 409 | customer_blocked | Der Kunde ist gesperrt: Schlüssel, Bestellungen und Einlösungen für ihn werden abgelehnt. |
| 409 | token_limit | Die Höchstzahl aktiver Tokens (10) ist erreicht. |
| 409 | webhook_limit | Die Höchstzahl an Webhooks (5) ist erreicht. |
| 429 | rate_limited | Mehr als 20 Anfragen pro Sekunde und Token (oder 100 pro Sekunde und IP-Adresse); warten Sie Retry-After Sekunden. |
| 429 | too_many_invoices | POST /balance/topups: zu viele unbezahlte Rechnungen hintereinander; bezahlen Sie die offenen oder versuchen Sie es in einer Minute erneut. |
| 501 | sandbox_not_implemented | Die Sandbox (rsk_test_...) ist noch nicht umgesetzt. |
| 503 | provider_unavailable | Ein Zahlungs- oder Modellanbieter ist vorübergehend nicht erreichbar: Versuchen Sie es später erneut. |
Idempotenz
Methoden, die Geld ausgeben, erfordern den Header Idempotency-Key (1 bis 128 druckbare Zeichen); ohne ihn (oder mit einem ungeeigneten) lautet die Antwort 400 idempotency_key_required. Sie sind in der Referenz markiert. Wird eine Anfrage mit demselben Key und demselben Body (pro Reseller) wiederholt, wird nie doppelt Geld ausgegeben, und Sie erhalten dasselbe Objekt zurück, einschließlich des Secrets des Schlüssels, den dieser Aufruf erstellt hat: Eine unterwegs verlorene Antwort lässt sich durch Wiederholen des Aufrufs wiederherstellen. Derselbe Key mit einem anderen Body ergibt 409 idempotency_key_reused. Verwenden Sie für jede neue Zahlung oder Bestellung einen neuen Key; bei POST /orders übernimmt external_order_id diese Rolle. Der Header ist bei PATCH /keys/{id} (ein wiederholtes extend_days/extend_hours verlängert nur einmal), POST /plans und POST /webhooks optional (und wird berücksichtigt, wenn er gesendet wird; eine Wiederholung liefert dasselbe Objekt, das Webhook-Secret wird nicht erneut angezeigt).
curl -s -X POST https://app.oneprovider.dev/partner/v1/keys \
-H "Authorization: Bearer $OP_PARTNER_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"name":"client-1","limit_usd":"10.00"}' Speichern Sie den Idempotency-Key zusammen mit Ihrem eigenen Bestelldatensatz, damit Sie nach einem Netzwerkfehler genau dieselbe Anfrage wiederholen.
Paginierung
Listen-Endpoints akzeptieren ?limit=1..100 (Standard 50) und &cursor=. Die Antwort ist {"items": [...], "next": "<cursor>"}; next ist auf der letzten Seite null. Der Cursor ist opak: Geben Sie ihn unverändert zurück.
curl -s "https://app.oneprovider.dev/partner/v1/keys?limit=100&cursor=<next from the previous page>" \
-H "Authorization: Bearer $OP_PARTNER_TOKEN" Sandbox
Test-Tokens rsk_test_... kommen bald. Vorerst erhält ein solcher Token 501 sandbox_not_implemented.