Documentação da API
Sincronize o catálogo, gere keys e consulte resgates programaticamente a partir da sua loja ou bot. Crie um token em Desenvolvedores (é preciso estar logado) e use nos exemplos abaixo.
Autenticação
Todas as rotas exigem o cabeçalho Authorization com um token gerado no painel. O token começa com swr_live_ e não é exibido de novo depois da criação — guarde em variável de ambiente, nunca no repositório.
- Base URL
- https://steamwave.com.br/api/v1/reseller
- Header
- Authorization: Bearer <TOKEN>
- Formato
- JSON (UTF-8)
curl "https://steamwave.com.br/api/v1/reseller/me" \ -H "Authorization: Bearer $STEAMWAVE_TOKEN"
Modelo de cobrança (escrow)
Gerar uma key não debita o saldo na hora: o valor é reservado. O débito real acontece quando o cliente final ativa a key no launcher.
POST /keysreserva o custo —walletReservedCentssobe.- A key nasce com status
SOLD, pronta pro launcher. - Na ativação do cliente o saldo é consumido de verdade.
- Reembolso de key ainda não usada devolve a reserva ao saldo disponível.
O que libera a geração é o saldo disponível (balanceCents − reservedCents). Se ele for menor que o custo, a API responde 402 insufficient_balance.
Limites
- Por requisição
- 1 a 500 keys em POST /keys
- Rate limit geral
- 120 req/min em /me, /catalog, /games, GET /keys e /batches
- Rate limit de geração
- 30 req/min em POST /keys
- Cap mensal
- Mesmas regras de plano e meta do painel (janela de 30 dias)
- Cobrança
- Saldo debitado quando o cliente ativa a key
Acima do limite a API responde 429 com o campo retryAfter em segundos.
/meSua conta e limites
curl "https://steamwave.com.br/api/v1/reseller/me" \ -H "Authorization: Bearer $STEAMWAVE_TOKEN"
{
"reseller": { "keyPrefix": "RBY", "status": "ACTIVE" },
"plan": {
"slug": "intermediario",
"perKeyCostCents": 150,
"keyLimitMonthly": 500
},
"wallet": {
"balanceCents": 5000,
"reservedCents": 450,
"spendableCents": 4550
},
"usage": {
"monthlyGenerated": 62,
"monthlyCap": 500,
"monthlyRemaining": 438
}
}/catalogSincronizar catálogo
unitCostCents já é o seu custo real de geração (plano + meta). Query: limit (máx 500), cursor, since, search, deliverable (padrão true).# carga inicial curl "https://steamwave.com.br/api/v1/reseller/catalog?limit=200" \ -H "Authorization: Bearer $STEAMWAVE_TOKEN" # sincronização incremental curl "https://steamwave.com.br/api/v1/reseller/catalog?limit=200&since=2026-07-01T00:00:00Z" \ -H "Authorization: Bearer $STEAMWAVE_TOKEN"
flags.deliverable, flags.denuvoKey, flags.onlineFix e flags.bypass. Só liste na sua loja o que estiver com deliverable: true./gamesBuscar jogos
search, limit (máx 100), cursor. available: false significa manifest ainda sincronizando — não gere key nesse caso.curl "https://steamwave.com.br/api/v1/reseller/games?search=cyberpunk" \ -H "Authorization: Bearer $STEAMWAVE_TOKEN"
/keysGerar keys
gameId ou appId, quantity (1–500) e label opcional. O header Idempotency-Key é obrigatório — use um UUID determinístico por pedido.curl -X POST "https://steamwave.com.br/api/v1/reseller/keys" \
-H "Authorization: Bearer $STEAMWAVE_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"appId":"1091500","quantity":1,"label":"pedido #123"}'{
"batchId": "clx…",
"game": { "id": "clx…", "name": "Cyberpunk 2077", "appId": "1091500" },
"label": "pedido #123",
"count": 1,
"codes": ["XXXXX-XXXXX-XXXXX-XXXXX"],
"cost": 150,
"unitCost": 150,
"walletBalanceAfter": 5000,
"walletReservedAfter": 450,
"walletSpendableAfter": 4550,
"planSlug": "intermediario"
}Idempotency-Key devolve a resposta original com o header Idempotent-Replayed: true, sem gerar key duplicada. Nunca gere sem esse header./keysListar keys
status, gameId, batch, search, limit, cursor.curl "https://steamwave.com.br/api/v1/reseller/keys?status=USED&limit=50" \ -H "Authorization: Bearer $STEAMWAVE_TOKEN"
/keys/{code}Consultar uma key
curl "https://steamwave.com.br/api/v1/reseller/keys/XXXXX-XXXXX-XXXXX-XXXXX" \ -H "Authorization: Bearer $STEAMWAVE_TOKEN"
/batchesListar lotes
curl "https://steamwave.com.br/api/v1/reseller/batches" \ -H "Authorization: Bearer $STEAMWAVE_TOKEN"
Erros
Respostas de erro seguem sempre o mesmo formato, com code estável para tratamento programático.
{ "error": { "code": "insufficient_balance", "message": "…" } }| HTTP | code | Significado |
|---|---|---|
| 401 | missing_token / invalid_token | Token ausente, inválido ou revogado |
| 402 | insufficient_balance | Saldo disponível menor que o custo |
| 403 | api_not_available | Conta sem acesso à API (plano pago ou meta Onda I) |
| 403 | subscription_inactive | Plano inativo ou vencido |
| 404 | game_not_found | Jogo ou key não encontrados |
| 409 | game_not_ready | Manifest ainda sincronizando |
| 400 | idempotency_key_required | Header Idempotency-Key ausente |
| 409 | idempotency_in_progress | Retry antes da primeira requisição terminar |
| 429 | monthly_limit_exceeded | Cap mensal do plano atingido |
| 429 | rate_limited | Rate limit — veja retryAfter |
Valores monetários são sempre em centavos de BRL — divida por 100 para exibir.
Levar a doc pra fora
Baixe o markdown completo ou copie um prompt pronto pra colar no ChatGPT, Claude ou Cursor e deixar a integração escrita pra você.