Autenticação e limites da API de revenda
Tokens Bearer, escopos, IPs permitidos, limite de requisições, códigos de erro, idempotência e paginação da API de revenda da OneProvider. Com exemplos.
Tokens Bearer, permissões, lista de IPs permitidos, limite de requisições, códigos de erro, chaves de idempotência e paginação da API de revendedores.
Todos os modelos, recursos e preços Índice da documentação para agentes de IA:https://oneprovider.dev/docs/llms.txt Tokens
Um token tem o formato rsk_ seguido de 40 caracteres. Crie-o no painel (aba Revendedor, “API e configurações”); o valor é exibido uma única vez, e guardamos apenas um hash e os últimos 4 caracteres. Você pode ter até 10 tokens ativos e revogar qualquer um a qualquer momento. Ao criar um token, é possível definir um prazo de validade (de 1 a 365 dias): depois dele o token responde 401 token_expired, e expires_at em GET /me informa quando isso acontece (null: sem validade).
httpAuthorization: Bearer rsk_... Somente no servidor O CORS está desativado. Nunca embuta um token em um bundle de navegador nem em um app de celular: chame a API do seu backend. Se um revendedor perder o acesso, todos os tokens dele respondem 403 reseller_disabled. Permissões
Um token carrega um conjunto de permissões. As permissões são independentes: keys não implica read. GET /me funciona com qualquer token válido. Sem a permissão necessária, a resposta é 403 forbidden_scope.
| Scope | O que ela libera |
|---|---|
read | Leitura: saldo e transações, preços, modelos, clientes, chaves e o consumo delas, pedidos, planos, estatísticas, as configurações da loja GET /settings, o registro de ações GET /audit (todo GET, exceto códigos, webhooks, bots, formas de pagamento e o status do pagamento das recargas). |
keys | Escrita: clientes (inclusive o bloqueio), emitir, editar, pausar, recarregar, reemitir e excluir chaves, POST /orders, as configurações da loja PATCH /settings (elas definem como as chaves emitidas aparecem). |
codes | Lotes de códigos e os próprios códigos (ler, criar, revogar, resgatar). Os códigos são segredos, por isso há uma permissão separada. |
plans | Criar, editar e excluir planos (para ler os planos é preciso read). |
billing | Recargas do saldo de revendedor: POST /balance/topups e o status do pagamento. |
webhooks | Gerenciar webhooks, enviar um teste, ler o registro de entregas. |
support | Reservada para os futuros endpoints de suporte. |
bot | Ler o estado dos bots e das formas de pagamento: GET /bot e GET /payment-providers (sem tokens nas respostas). Os bots só são conectados no painel. |
A permissão de cada método está listada na referência .
Lista de IPs permitidos
Um token pode ser limitado a uma lista de endereços IPv4/IPv6 ou faixas CIDR (até 20). Uma requisição vinda de outro endereço recebe 403 ip_not_allowed. A lista é definida na criação do token.
Limite de requisições
20 requisições por segundo por token e 100 por segundo por endereço IP de origem. Ao exceder: 429 rate_limited e o cabeçalho Retry-After. Aguarde esse número de segundos e tente de novo.
Erros
Todo erro tem o mesmo formato. O mesmo id é enviado no cabeçalho X-Request-Id: informe-o ao suporte.
{
"error": {
"code": "insufficient_balance",
"message": "Not enough free reseller balance for this key.",
"request_id": "req_..."
}
} Trate o erro por error.code, não pelo texto da mensagem.
| HTTP | code | Significado |
|---|---|---|
| 400 | invalid | Falta um campo ou ele está fora do intervalo. |
| 400 | bad_request | Não foi possível interpretar a requisição. |
| 400 | idempotency_key_required | O cabeçalho Idempotency-Key está ausente em um método que gasta dinheiro. |
| 400 | invalid_url | A URL do webhook não passou na validação (somente https, sem IPs literais nem redes privadas). |
| 400 | limit_below_spent | O novo limite da chave é menor do que a chave já gastou. |
| 400 | currency_required | POST /balance/topups: a forma de pagamento aceita várias moedas, envie currency (as permitidas estão em topup_providers). |
| 400 | method_unavailable | POST /balance/topups: essa forma de pagamento não existe em topup_providers (bad_currency, bad_email e email_required respondem do mesmo jeito para a moeda e o e-mail). |
| 401 | unauthorized | O token está ausente, é desconhecido ou foi revogado. |
| 401 | token_expired | O token venceu (expires_at em GET /me): crie um novo. |
| 403 | forbidden_scope | O token não tem a permissão necessária. |
| 403 | ip_not_allowed | O IP da requisição não está na lista de IPs permitidos do token. |
| 403 | reseller_disabled | O revendedor perdeu o acesso; todos os tokens respondem assim. |
| 403 | banned | A conta está banida. |
| 404 | not_found | O objeto não existe ou pertence a outro revendedor. |
| 404 | key_not_found | A chave não existe. |
| 409 | insufficient_balance | O valor não cabe em Disponível (Free, available_usd), veja a regra do dinheiro. |
| 409 | idempotency_key_reused | O mesmo Idempotency-Key já foi usado com outro corpo de requisição: use um Idempotency-Key novo. |
| 409 | fund_first | Recarregue primeiro o saldo de revendedor. |
| 409 | not_activated | O painel de revendedor ainda não foi ativado. |
| 409 | name_taken | Já existe uma chave com este nome. |
| 409 | key_limit | O número máximo de chaves foi atingido. |
| 409 | plan_limit | O número máximo de planos (20) foi atingido. |
| 409 | customer_limit | O número máximo de clientes (10.000) foi atingido. |
| 409 | plan_in_use | O plano não pode ser excluído, ficar mais caro nem mudar de moeda enquanto uma fatura recente não paga ou uma compra paga, mas não entregue, no bot o estiver usando. |
| 409 | key_exhausted | Reemitir: a chave não tem mais nada a transferir, o restante é 0. |
| 409 | key_expired | Reemitir: a chave venceu, prorrogue-a antes. |
| 409 | action_failed | A ação na chave falhou por outro motivo; tente de novo ou verifique a chave. |
| 409 | code_used | O código já foi resgatado. |
| 409 | code_revoked | O código foi revogado. |
| 409 | code_busy | O código está sendo processado ou não pode ser resgatado agora. |
| 409 | external_order_id_conflict | O external_order_id já foi usado com outros parâmetros. |
| 409 | customer_exists | Já existe um cliente com este external_id. |
| 409 | customer_blocked | O cliente está bloqueado: chaves, pedidos e resgates para ele são recusados. |
| 409 | token_limit | O número máximo de tokens ativos (10) foi atingido. |
| 409 | webhook_limit | O número máximo de webhooks (5) foi atingido. |
| 429 | rate_limited | Mais de 20 requisições por segundo por token (ou 100 por segundo por endereço IP); aguarde Retry-After segundos. |
| 429 | too_many_invoices | POST /balance/topups: muitas faturas não pagas seguidas; pague as abertas ou tente de novo em um minuto. |
| 501 | sandbox_not_implemented | O sandbox (rsk_test_...) ainda não foi implementado. |
| 503 | provider_unavailable | Um provedor de pagamento ou de modelos está temporariamente indisponível: tente mais tarde. |
Idempotência
Os métodos que gastam dinheiro exigem o cabeçalho Idempotency-Key (de 1 a 128 caracteres imprimíveis); sem ele (ou com um inadequado) a resposta é 400 idempotency_key_required. Eles estão marcados na referência. Repetir uma requisição com o mesmo Idempotency-Key e o mesmo corpo (por revendedor) nunca gasta duas vezes e retorna o mesmo objeto, inclusive o segredo da chave criada por aquela chamada: uma resposta perdida no caminho pode ser recuperada repetindo a chamada. O mesmo Idempotency-Key com outro corpo dá 409 idempotency_key_reused. Use um Idempotency-Key novo para cada pagamento ou pedido novo; em POST /orders a identidade é external_order_id. O cabeçalho é opcional (e respeitado, se enviado) em PATCH /keys/{id} (um extend_days/extend_hours repetido prorroga uma só vez), POST /plans e POST /webhooks (uma repetição retorna o mesmo objeto; o segredo de um webhook não é exibido de novo).
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"}' Guarde a chave de idempotência junto com o registro do seu próprio pedido, para que, depois de um erro de rede, você repita exatamente a mesma requisição.
Paginação
Os endpoints de listagem aceitam ?limit=1..100 (padrão 50) e &cursor=. A resposta é {"items": [...], "next": "<cursor>"}; next é null na última página. O cursor é opaco: devolva-o como está.
curl -s "https://app.oneprovider.dev/partner/v1/keys?limit=100&cursor=<next from the previous page>" \
-H "Authorization: Bearer $OP_PARTNER_TOKEN" Sandbox
Os tokens de teste rsk_test_... chegam em breve. Por enquanto, esse token recebe 501 sandbox_not_implemented.