OneProvider

Auth et limites de l’API revendeur

Jetons Bearer, scopes, IP autorisées, limite de débit, codes d’erreur, clés d’idempotence et pagination de l’API revendeur OneProvider, avec exemples.

Jetons Bearer, autorisations, liste d’IP autorisées, limite de débit, codes d’erreur, clés d’idempotence et pagination de l’API revendeur.

Tous les modèles, leurs capacités et leurs tarifs Index de la documentation pour les agents IA : https://oneprovider.dev/docs/llms.txt

Jetons

Un jeton ressemble à rsk_ suivi de 40 caractères. Créez-le dans l’espace client (onglet revendeur, « API et paramètres ») ; la valeur n’est affichée qu’une fois, nous ne conservons qu’un hachage et les 4 derniers caractères. Vous pouvez avoir jusqu’à 10 jetons actifs et en révoquer n’importe lequel à tout moment. Un jeton peut recevoir une durée de vie (de 1 à 365 jours) à sa création : passé ce délai, il répond 401 token_expired, et expires_at dans GET /me indique quand cela arrive (null : sans expiration).

http
Authorization: Bearer rsk_...
Côté serveur uniquement CORS est désactivé. N’intégrez jamais un jeton dans un bundle de navigateur ni dans une application mobile : appelez l’API depuis votre backend. Si un revendeur perd l’accès, tous ses jetons répondent 403 reseller_disabled.

Autorisations (scopes)

Un jeton porte un ensemble d’autorisations. Elles sont indépendantes : keys n’implique pas read. GET /me fonctionne avec n’importe quel jeton valide. Sans l’autorisation requise, la réponse est 403 forbidden_scope.

Autorisations du jeton
ScopeCe qu’elle permet
readLecture : solde et transactions, tarifs, modèles, clients, clés et leur consommation, commandes, forfaits, statistiques, les paramètres de la boutique GET /settings, le journal des actions GET /audit (tous les GET sauf ceux des codes, des webhooks, des bots et des moyens de paiement, et sauf le statut du paiement d’une recharge).
keysÉcriture : clients (y compris le blocage), émission, modification, pause, recharge, réémission et suppression des clés, POST /orders, les paramètres de la boutique PATCH /settings (ils déterminent l’aspect des clés émises).
codesLots de codes et codes eux-mêmes (lire, créer, révoquer, activer). Les codes sont des secrets, d’où une autorisation distincte.
plansCréer, modifier et supprimer des forfaits (pour lire les forfaits, il faut read).
billingRecharges du solde revendeur : POST /balance/topups et le statut du paiement.
webhooksGérer les webhooks, envoyer un test, lire le journal des livraisons.
supportRéservé aux futurs endpoints de support.
botLire l’état des bots et des moyens de paiement : GET /bot et GET /payment-providers (aucun jeton dans les réponses). Les bots se connectent uniquement dans l’espace client.

L’autorisation de chaque méthode est indiquée dans la référence .

Liste d’IP autorisées

Un jeton peut être restreint à une liste d’adresses IPv4/IPv6 ou de plages CIDR (jusqu’à 20). Une requête provenant d’une autre adresse reçoit 403 ip_not_allowed. La liste se définit à la création du jeton.

Limite de débit

20 requêtes par seconde par jeton et 100 par seconde par adresse IP source. En cas de dépassement : 429 rate_limited et un en-tête Retry-After. Attendez ce nombre de secondes, puis réessayez.

Erreurs

Chaque erreur a la même forme. Le même identifiant est envoyé dans l’en-tête X-Request-Id : communiquez-le au support.

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

Raisonnez sur error.code, pas sur le texte du message.

Codes d’erreur
HTTPcodeSignification
400invalidUn champ est manquant ou hors limites.
400bad_requestLa requête n’a pas pu être analysée.
400idempotency_key_requiredL’en-tête Idempotency-Key est absent sur une méthode qui dépense de l’argent.
400invalid_urlL’URL du webhook n’a pas passé la validation (https uniquement, ni adresse IP brute ni réseau privé).
400limit_below_spentLa nouvelle limite de la clé est inférieure à ce que la clé a déjà dépensé.
400currency_requiredPOST /balance/topups : le prestataire accepte plusieurs devises, indiquez currency (les devises autorisées figurent dans topup_providers).
400method_unavailablePOST /balance/topups : ce prestataire ne figure pas dans topup_providers (bad_currency, bad_email et email_required répondent de la même façon pour la devise et l’e-mail).
401unauthorizedLe jeton est absent, inconnu ou révoqué.
401token_expiredLe jeton a expiré (expires_at dans GET /me) : créez-en un nouveau.
403forbidden_scopeIl manque l’autorisation requise au jeton.
403ip_not_allowedL’IP de la requête ne figure pas dans la liste autorisée du jeton.
403reseller_disabledLe revendeur a perdu l’accès ; tous les jetons répondent ainsi.
403bannedLe compte est suspendu.
404not_foundL’objet n’existe pas ou appartient à un autre revendeur.
404key_not_foundLa clé n’existe pas.
409insufficient_balanceLe montant ne tient pas dans Disponible (Free, available_usd), voir la règle de l’argent.
409idempotency_key_reusedLa même Idempotency-Key a déjà servi avec un autre corps de requête : utilisez une nouvelle clé.
409fund_firstRechargez d’abord le solde revendeur.
409not_activatedL’espace client revendeur n’est pas encore activé.
409name_takenUne clé portant ce nom existe déjà.
409key_limitLe nombre maximal de clés est atteint.
409plan_limitLe nombre maximal de forfaits (20) est atteint.
409customer_limitLe nombre maximal de clients (10 000) est atteint.
409plan_in_useImpossible de supprimer le forfait, d’augmenter son prix ou de changer sa devise tant qu’une facture récente impayée ou un achat payé mais non livré via le bot l’utilise.
409key_exhaustedRéémission : la clé n’a plus rien à transférer, le reste est de 0.
409key_expiredRéémission : la clé a expiré, prolongez-la d’abord.
409action_failedL’action sur la clé a échoué pour une autre raison ; réessayez ou vérifiez la clé.
409code_usedLe code est déjà activé.
409code_revokedLe code est révoqué.
409code_busyLe code est en cours de traitement ou ne peut pas être activé pour le moment.
409external_order_id_conflictexternal_order_id a déjà été utilisé avec d’autres paramètres.
409customer_existsUn client avec cet external_id existe déjà.
409customer_blockedLe client est bloqué : les clés, commandes et activations de codes le concernant sont refusées.
409token_limitLe nombre maximal de jetons actifs (10) est atteint.
409webhook_limitLe nombre maximal de webhooks (5) est atteint.
429rate_limitedPlus de 20 requêtes par seconde par jeton (ou 100 par seconde par adresse IP) ; attendez Retry-After secondes.
429too_many_invoicesPOST /balance/topups : trop de factures impayées à la suite ; payez celles qui sont ouvertes ou réessayez dans une minute.
501sandbox_not_implementedLe bac à sable (rsk_test_...) n’est pas encore disponible.
503provider_unavailableUn prestataire de paiement ou de modèles est temporairement indisponible : réessayez plus tard.

Idempotence

Les méthodes qui dépensent de l’argent exigent l’en-tête Idempotency-Key (de 1 à 128 caractères imprimables) ; sans lui (ou avec une valeur inadaptée), la réponse est 400 idempotency_key_required. Elles sont signalées dans la référence. Répéter une requête avec la même clé et le même corps (par revendeur) ne dépense jamais deux fois et renvoie le même objet, y compris le secret de la clé créée par cet appel : une réponse perdue en route peut être récupérée en répétant l’appel. La même clé avec un autre corps donne 409 idempotency_key_reused. Utilisez une nouvelle clé pour chaque nouveau paiement ou commande ; pour POST /orders, l’identité est external_order_id. L’en-tête est facultatif (et pris en compte s’il est envoyé) sur PATCH /keys/{id} (un extend_days/extend_hours répété prolonge une seule fois), POST /plans et POST /webhooks (une répétition renvoie le même objet ; le secret d’un webhook n’est pas affiché de nouveau).

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

Conservez la clé d’idempotence avec votre propre enregistrement de commande, afin qu’après une erreur réseau vous répétiez exactement la même requête.

Pagination

Les endpoints de liste acceptent ?limit=1..100 (50 par défaut) et &cursor=. La réponse est {"items": [...], "next": "<cursor>"} ; next vaut null sur la dernière page. Le curseur est opaque : renvoyez-le tel quel.

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

Bac à sable

Les jetons de test rsk_test_... arrivent bientôt. Pour l’instant, un tel jeton reçoit 501 sandbox_not_implemented.

Dernière mise à jour: 2026-11-08 Vous avez trouvé un bug ? @Oneproviderhelpbot