API REST · v1

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.

  1. POST /keys reserva o custo — walletReservedCents sobe.
  2. A key nasce com status SOLD, pronta pro launcher.
  3. Na ativação do cliente o saldo é consumido de verdade.
  4. 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.

GET/me

Sua conta e limites

Saldo, plano, custo por key e uso do cap no período.
curl "https://steamwave.com.br/api/v1/reseller/me" \
  -H "Authorization: Bearer $STEAMWAVE_TOKEN"
Resposta JSON
{
  "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
  }
}
GET/catalog

Sincronizar catálogo

Espelhe o catálogo na sua loja. 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"
Cada item traz flags.deliverable, flags.denuvoKey, flags.onlineFix e flags.bypass. Só liste na sua loja o que estiver com deliverable: true.
GET/games

Buscar jogos

Busca leve para autocomplete. Query: 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"
POST/keys

Gerar keys

Body: 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"}'
Resposta JSON (201)
{
  "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"
}
Repetir a requisição com a mesma Idempotency-Key devolve a resposta original com o header Idempotent-Replayed: true, sem gerar key duplicada. Nunca gere sem esse header.
GET/keys

Listar keys

Filtros: status, gameId, batch, search, limit, cursor.
curl "https://steamwave.com.br/api/v1/reseller/keys?status=USED&limit=50" \
  -H "Authorization: Bearer $STEAMWAVE_TOKEN"
GET/keys/{code}

Consultar uma key

Status da key e, se já ativada, o histórico de ativação.
curl "https://steamwave.com.br/api/v1/reseller/keys/XXXXX-XXXXX-XXXXX-XXXXX" \
  -H "Authorization: Bearer $STEAMWAVE_TOKEN"
GET/batches

Listar lotes

Histórico das gerações em lote feitas pela API e pelo painel.
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.

Resposta JSON
{ "error": { "code": "insufficient_balance", "message": "…" } }
HTTPcodeSignificado
401missing_token / invalid_tokenToken ausente, inválido ou revogado
402insufficient_balanceSaldo disponível menor que o custo
403api_not_availableConta sem acesso à API (plano pago ou meta Onda I)
403subscription_inactivePlano inativo ou vencido
404game_not_foundJogo ou key não encontrados
409game_not_readyManifest ainda sincronizando
400idempotency_key_requiredHeader Idempotency-Key ausente
409idempotency_in_progressRetry antes da primeira requisição terminar
429monthly_limit_exceededCap mensal do plano atingido
429rate_limitedRate 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ê.