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, /games, GET /keys e /batches; 60 req/min em /catalog e /catalog/events
- Rate limit de geração
- 30 req/min em POST /keys
- Cap de quantidade
- Não existe — gere quantas keys o saldo cobrir
- 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": null
},
"wallet": {
"balanceCents": 5000,
"reservedCents": 450,
"spendableCents": 4550
},
"usage": {
"monthlyGenerated": 62,
"monthlyCap": null,
"monthlyRemaining": null
}
}/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./catalog/eventsAvisos de jogo novo ou atualizado
GAME_ADDED quando um jogo entra no catálogo, GAME_UPDATED quando a versão pública da Steam muda. Query: since (ISO em announcedAt), kind, limit (máx 200), cursor.# sincronização incremental curl "https://steamwave.com.br/api/v1/reseller/catalog/events?since=2026-08-31T00:00:00Z" \ -H "Authorization: Bearer $STEAMWAVE_TOKEN" # GAME_ADDED | GAME_UPDATED curl "https://steamwave.com.br/api/v1/reseller/catalog/events?kind=GAME_ADDED&limit=50" \ -H "Authorization: Bearer $STEAMWAVE_TOKEN"
{
"items": [
{
"id": "clx...",
"kind": "GAME_ADDED",
"announcedAt": "2026-08-31T12:04:00.000Z",
"createdAt": "2026-08-31T12:00:00.000Z",
"message": "Novo jogo disponível no catálogo.",
"game": {
"id": "clx...",
"appId": 1091500,
"name": "Cyberpunk 2077",
"slug": "cyberpunk-2077",
"imageUrl": "https://..."
},
"build": {
"buildId": "20498822",
"updatedAt": "2026-08-30T18:00:00.000Z"
}
}
],
"nextCursor": null,
"count": 1
}since do último announcedAt — não há webhook. message e build são o mesmo conteúdo do embed./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 II / 30 keys) |
| 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 | 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ê.