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).
httpAuthorization: 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.
| Scope | Ce qu’elle permet |
|---|---|
read | Lecture : 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). |
codes | Lots de codes et codes eux-mêmes (lire, créer, révoquer, activer). Les codes sont des secrets, d’où une autorisation distincte. |
plans | Créer, modifier et supprimer des forfaits (pour lire les forfaits, il faut read). |
billing | Recharges du solde revendeur : POST /balance/topups et le statut du paiement. |
webhooks | Gérer les webhooks, envoyer un test, lire le journal des livraisons. |
support | Réservé aux futurs endpoints de support. |
bot | Lire 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.
{
"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.
| HTTP | code | Signification |
|---|---|---|
| 400 | invalid | Un champ est manquant ou hors limites. |
| 400 | bad_request | La requête n’a pas pu être analysée. |
| 400 | idempotency_key_required | L’en-tête Idempotency-Key est absent sur une méthode qui dépense de l’argent. |
| 400 | invalid_url | L’URL du webhook n’a pas passé la validation (https uniquement, ni adresse IP brute ni réseau privé). |
| 400 | limit_below_spent | La nouvelle limite de la clé est inférieure à ce que la clé a déjà dépensé. |
| 400 | currency_required | POST /balance/topups : le prestataire accepte plusieurs devises, indiquez currency (les devises autorisées figurent dans topup_providers). |
| 400 | method_unavailable | POST /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). |
| 401 | unauthorized | Le jeton est absent, inconnu ou révoqué. |
| 401 | token_expired | Le jeton a expiré (expires_at dans GET /me) : créez-en un nouveau. |
| 403 | forbidden_scope | Il manque l’autorisation requise au jeton. |
| 403 | ip_not_allowed | L’IP de la requête ne figure pas dans la liste autorisée du jeton. |
| 403 | reseller_disabled | Le revendeur a perdu l’accès ; tous les jetons répondent ainsi. |
| 403 | banned | Le compte est suspendu. |
| 404 | not_found | L’objet n’existe pas ou appartient à un autre revendeur. |
| 404 | key_not_found | La clé n’existe pas. |
| 409 | insufficient_balance | Le montant ne tient pas dans Disponible (Free, available_usd), voir la règle de l’argent. |
| 409 | idempotency_key_reused | La même Idempotency-Key a déjà servi avec un autre corps de requête : utilisez une nouvelle clé. |
| 409 | fund_first | Rechargez d’abord le solde revendeur. |
| 409 | not_activated | L’espace client revendeur n’est pas encore activé. |
| 409 | name_taken | Une clé portant ce nom existe déjà. |
| 409 | key_limit | Le nombre maximal de clés est atteint. |
| 409 | plan_limit | Le nombre maximal de forfaits (20) est atteint. |
| 409 | customer_limit | Le nombre maximal de clients (10 000) est atteint. |
| 409 | plan_in_use | Impossible 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. |
| 409 | key_exhausted | Réémission : la clé n’a plus rien à transférer, le reste est de 0. |
| 409 | key_expired | Réémission : la clé a expiré, prolongez-la d’abord. |
| 409 | action_failed | L’action sur la clé a échoué pour une autre raison ; réessayez ou vérifiez la clé. |
| 409 | code_used | Le code est déjà activé. |
| 409 | code_revoked | Le code est révoqué. |
| 409 | code_busy | Le code est en cours de traitement ou ne peut pas être activé pour le moment. |
| 409 | external_order_id_conflict | external_order_id a déjà été utilisé avec d’autres paramètres. |
| 409 | customer_exists | Un client avec cet external_id existe déjà. |
| 409 | customer_blocked | Le client est bloqué : les clés, commandes et activations de codes le concernant sont refusées. |
| 409 | token_limit | Le nombre maximal de jetons actifs (10) est atteint. |
| 409 | webhook_limit | Le nombre maximal de webhooks (5) est atteint. |
| 429 | rate_limited | Plus de 20 requêtes par seconde par jeton (ou 100 par seconde par adresse IP) ; attendez Retry-After secondes. |
| 429 | too_many_invoices | POST /balance/topups : trop de factures impayées à la suite ; payez celles qui sont ouvertes ou réessayez dans une minute. |
| 501 | sandbox_not_implemented | Le bac à sable (rsk_test_...) n’est pas encore disponible. |
| 503 | provider_unavailable | Un 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).
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.
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.