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).
httpAuthorization: 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 | Che cosa sblocca |
|---|---|
read | Lettura: 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). |
keys | Scrittura: 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). |
codes | Lotti di codici e codici stessi (lettura, creazione, revoca, riscatto). I codici sono segreti, perciò hanno uno scope a parte. |
plans | Creare, modificare ed eliminare piani (per leggere i piani serve read). |
billing | Ricariche del saldo da rivenditore: POST /balance/topups e lo stato del pagamento. |
webhooks | Gestire i webhook, inviare un test, leggere il registro delle consegne. |
support | Riservato ai futuri endpoint dell'assistenza. |
bot | Leggere 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.
{
"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.
| HTTP | code | Significato |
|---|---|---|
| 400 | invalid | Un campo manca o è fuori intervallo. |
| 400 | bad_request | Non è stato possibile interpretare la richiesta. |
| 400 | idempotency_key_required | L'header Idempotency-Key manca su un metodo che spende soldi. |
| 400 | invalid_url | L'URL del webhook non ha superato la validazione (solo https, niente IP letterali né reti private). |
| 400 | limit_below_spent | Il nuovo limite della chiave è inferiore a quanto la chiave ha già speso. |
| 400 | currency_required | POST /balance/topups: il provider accetta più valute, passa currency (quelle ammesse sono in topup_providers). |
| 400 | method_unavailable | POST /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). |
| 401 | unauthorized | Il token manca, è sconosciuto o è stato revocato. |
| 401 | token_expired | Il token è scaduto (expires_at in GET /me): creane uno nuovo. |
| 403 | forbidden_scope | Il token non ha lo scope richiesto. |
| 403 | ip_not_allowed | L'IP della richiesta non è nell'allowlist del token. |
| 403 | reseller_disabled | Il rivenditore ha perso l'accesso; tutti i token rispondono così. |
| 403 | banned | L'account è bannato. |
| 404 | not_found | L'oggetto non esiste oppure appartiene a un altro rivenditore. |
| 404 | key_not_found | La chiave non esiste. |
| 409 | insufficient_balance | L'importo non rientra in Disponibile (Free, available_usd), vedi la regola dei soldi. |
| 409 | idempotency_key_reused | La stessa Idempotency-Key è già stata usata con un corpo della richiesta diverso: usane una nuova. |
| 409 | fund_first | Ricarica prima il saldo da rivenditore. |
| 409 | not_activated | L'area personale da rivenditore non è ancora attivata. |
| 409 | name_taken | Esiste già una chiave con questo nome. |
| 409 | key_limit | È stato raggiunto il numero massimo di chiavi. |
| 409 | plan_limit | È stato raggiunto il numero massimo di piani (20). |
| 409 | customer_limit | È stato raggiunto il numero massimo di clienti (10.000). |
| 409 | plan_in_use | Il 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. |
| 409 | key_exhausted | Riemissione: nella chiave non c'è più nulla da spostare, il residuo è 0. |
| 409 | key_expired | Riemissione: la chiave è scaduta, prima prolungala. |
| 409 | action_failed | L'azione sulla chiave non è riuscita per un altro motivo; riprova o controlla la chiave. |
| 409 | code_used | Il codice è già stato riscattato. |
| 409 | code_revoked | Il codice è stato revocato. |
| 409 | code_busy | Il codice è in elaborazione o al momento non può essere riscattato. |
| 409 | external_order_id_conflict | external_order_id è già stato usato con parametri diversi. |
| 409 | customer_exists | Esiste già un cliente con questo external_id. |
| 409 | customer_blocked | Il cliente è bloccato: chiavi, ordini e riscatti a suo nome vengono rifiutati. |
| 409 | token_limit | È stato raggiunto il numero massimo di token attivi (10). |
| 409 | webhook_limit | È stato raggiunto il numero massimo di webhook (5). |
| 429 | rate_limited | Più di 20 richieste al secondo per token (o 100 al secondo per indirizzo IP); attendi Retry-After secondi. |
| 429 | too_many_invoices | POST /balance/topups: troppe fatture non pagate di fila; paga quelle aperte oppure riprova tra un minuto. |
| 501 | sandbox_not_implemented | La sandbox (rsk_test_...) non è ancora implementata. |
| 503 | provider_unavailable | Un 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).
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'è.
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.