OneProvider

Autenticazione e limiti dell'API rivenditori

Token Bearer, scope, allowlist IP, rate limit, codici di errore, chiavi di idempotenza e paginazione dell'API rivenditori di OneProvider, con esempi.

Token Bearer, scope, allowlist IP, rate limit, codici di errore, chiavi di idempotenza e paginazione dell'API per rivenditori.

Tutti i modelli, le funzionalità e i prezzi Indice della documentazione per agenti AI: https://oneprovider.dev/docs/llms.txt

Token

Un token ha la forma rsk_ seguito da 40 caratteri. Lo crei nell'area personale (scheda Rivenditore, «API e impostazioni»); il valore viene mostrato una sola volta, noi conserviamo solo un hash e gli ultimi 4 caratteri. Puoi avere fino a 10 token attivi e revocarli in qualsiasi momento. Alla creazione puoi dare al token una durata (da 1 a 365 giorni): trascorsa, il token risponde 401 token_expired, e expires_at in GET /me indica quando succede (null: nessuna scadenza).

http
Authorization: Bearer rsk_...
Solo lato server CORS è disattivato. Non inserire mai un token in un bundle per browser o in un'app mobile: chiama l'API dal tuo backend. Se un rivenditore perde l'accesso, tutti i suoi token rispondono 403 reseller_disabled.

Scope

Un token porta con sé un insieme di scope. Gli scope sono indipendenti: keys non implica read. GET /me funziona con qualsiasi token valido. Senza lo scope richiesto la risposta è 403 forbidden_scope.

Scope dei token
ScopeChe cosa sblocca
readLettura: saldo e transazioni, prezzi, modelli, clienti, chiavi e il loro consumo, ordini, piani, statistiche, le impostazioni del negozio GET /settings, il registro delle azioni GET /audit (tutti i GET tranne codici, webhook, bot, metodi di pagamento e stato del pagamento di una ricarica).
keysScrittura: clienti (compreso il blocco), emissione, modifica, pausa, ricarica, riemissione (rotate) ed eliminazione delle chiavi, POST /orders, le impostazioni del negozio PATCH /settings (decidono l'aspetto delle chiavi emesse).
codesLotti di codici e codici stessi (lettura, creazione, revoca, riscatto). I codici sono segreti, perciò hanno uno scope a parte.
plansCreare, modificare ed eliminare piani (per leggere i piani serve read).
billingRicariche del saldo da rivenditore: POST /balance/topups e lo stato del pagamento.
webhooksGestire i webhook, inviare un test, leggere il registro delle consegne.
supportRiservato ai futuri endpoint dell'assistenza.
botLeggere lo stato dei bot e dei metodi di pagamento: GET /bot e GET /payment-providers (nessun token nelle risposte). I bot si collegano solo nell'area personale.

Lo scope di ogni metodo è indicato nel riferimento .

Allowlist IP

Un token può essere limitato a un elenco di indirizzi IPv4/IPv6 o di intervalli CIDR (fino a 20). Una richiesta da un altro indirizzo riceve 403 ip_not_allowed. L'elenco si imposta alla creazione del token.

Rate limit

20 richieste al secondo per token e 100 al secondo per indirizzo IP di origine. Se superato: 429 rate_limited e un header Retry-After. Aspetta quel numero di secondi e riprova.

Errori

Ogni errore ha la stessa forma. Lo stesso id viene inviato nell'header X-Request-Id: comunicalo all'assistenza.

json
{
"error": {
"code": "insufficient_balance",
"message": "Not enough free reseller balance for this key.",
"request_id": "req_..."
}
}

Gestisci i casi in base a error.code, non al testo del messaggio.

Codici di errore
HTTPcodeSignificato
400invalidUn campo manca o è fuori intervallo.
400bad_requestNon è stato possibile interpretare la richiesta.
400idempotency_key_requiredL'header Idempotency-Key manca su un metodo che spende soldi.
400invalid_urlL'URL del webhook non ha superato la validazione (solo https, niente IP letterali né reti private).
400limit_below_spentIl nuovo limite della chiave è inferiore a quanto la chiave ha già speso.
400currency_requiredPOST /balance/topups: il provider accetta più valute, passa currency (quelle ammesse sono in topup_providers).
400method_unavailablePOST /balance/topups: questo provider non è in topup_providers (bad_currency, bad_email ed email_required rispondono allo stesso modo per la valuta e l'e-mail).
401unauthorizedIl token manca, è sconosciuto o è stato revocato.
401token_expiredIl token è scaduto (expires_at in GET /me): creane uno nuovo.
403forbidden_scopeIl token non ha lo scope richiesto.
403ip_not_allowedL'IP della richiesta non è nell'allowlist del token.
403reseller_disabledIl rivenditore ha perso l'accesso; tutti i token rispondono così.
403bannedL'account è bannato.
404not_foundL'oggetto non esiste oppure appartiene a un altro rivenditore.
404key_not_foundLa chiave non esiste.
409insufficient_balanceL'importo non rientra in Disponibile (Free, available_usd), vedi la regola dei soldi.
409idempotency_key_reusedLa stessa Idempotency-Key è già stata usata con un corpo della richiesta diverso: usane una nuova.
409fund_firstRicarica prima il saldo da rivenditore.
409not_activatedL'area personale da rivenditore non è ancora attivata.
409name_takenEsiste già una chiave con questo nome.
409key_limitÈ stato raggiunto il numero massimo di chiavi.
409plan_limitÈ stato raggiunto il numero massimo di piani (20).
409customer_limitÈ stato raggiunto il numero massimo di clienti (10.000).
409plan_in_useIl piano non si può eliminare, rendere più caro né passare a un'altra valuta finché lo usano una fattura recente non pagata o un acquisto del bot pagato ma non consegnato.
409key_exhaustedRiemissione: nella chiave non c'è più nulla da spostare, il residuo è 0.
409key_expiredRiemissione: la chiave è scaduta, prima prolungala.
409action_failedL'azione sulla chiave non è riuscita per un altro motivo; riprova o controlla la chiave.
409code_usedIl codice è già stato riscattato.
409code_revokedIl codice è stato revocato.
409code_busyIl codice è in elaborazione o al momento non può essere riscattato.
409external_order_id_conflictexternal_order_id è già stato usato con parametri diversi.
409customer_existsEsiste già un cliente con questo external_id.
409customer_blockedIl cliente è bloccato: chiavi, ordini e riscatti a suo nome vengono rifiutati.
409token_limitÈ stato raggiunto il numero massimo di token attivi (10).
409webhook_limitÈ stato raggiunto il numero massimo di webhook (5).
429rate_limitedPiù di 20 richieste al secondo per token (o 100 al secondo per indirizzo IP); attendi Retry-After secondi.
429too_many_invoicesPOST /balance/topups: troppe fatture non pagate di fila; paga quelle aperte oppure riprova tra un minuto.
501sandbox_not_implementedLa sandbox (rsk_test_...) non è ancora implementata.
503provider_unavailableUn provider di pagamento o di modelli è temporaneamente non disponibile: riprova più tardi.

Idempotenza

I metodi che spendono soldi richiedono l'header Idempotency-Key (da 1 a 128 caratteri stampabili); senza (o con uno non valido) la risposta è 400 idempotency_key_required. Sono segnati nel riferimento. Ripetere una richiesta con la stessa chiave e lo stesso corpo (per rivenditore) non spende mai due volte e restituisce lo stesso oggetto, compreso il segreto della chiave creata da quella chiamata: una risposta persa per strada si recupera ripetendo la chiamata. La stessa chiave con un corpo diverso dà 409 idempotency_key_reused. Usa una chiave nuova per ogni nuovo pagamento od ordine; per POST /orders l'identità è external_order_id. L'header è facoltativo (e rispettato se inviato) su PATCH /keys/{id} (un extend_days/extend_hours ripetuto prolunga una volta sola), POST /plans e POST /webhooks (una ripetizione restituisce lo stesso oggetto; il segreto di un webhook non viene mostrato di nuovo).

bash
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"}'

Conserva la chiave di idempotenza insieme al record del tuo ordine, così dopo un errore di rete riprovi esattamente la stessa richiesta.

Paginazione

Gli endpoint di elenco accettano ?limit=1..100 (predefinito 50) e &cursor=. La risposta è {"items": [...], "next": "<cursor>"}; next è null nell'ultima pagina. Il cursore è opaco: restituiscilo così com'è.

bash
curl -s "https://app.oneprovider.dev/partner/v1/keys?limit=100&cursor=<next from the previous page>" \
-H "Authorization: Bearer $OP_PARTNER_TOKEN"

Sandbox

I token di test rsk_test_... arriveranno presto. Per ora un token così riceve 501 sandbox_not_implemented.

Ultimo aggiornamento: 2026-11-08 Hai trovato un errore? @Oneproviderhelpbot