Documentação da API

Com a API, a sua loja busca contas no catálogo, compra com o seu saldo e recebe login e senha na resposta, sem você abrir o painel. As regras são as mesmas do painel: o preço é o do seu plano, o valor sai do seu saldo e, se a compra falhar, ele volta sozinho para o saldo. A API faz parte dos planos Starter, Pro e Elite.

Começo rápido

1. No painel, abra API e crie uma chave. 2. Rode o comando abaixo no servidor da sua loja. Todas as rotas começam em https://quantumresell.lovable.app/api/v1, recebem e devolvem JSON, e todos os valores estão em reais.

bash
curl https://quantumresell.lovable.app/api/v1/saldo \
  -H "Authorization: Bearer qr_live_SUA_CHAVE"
json
{
  "saldo": 412.3,
  "plano": { "id": "pro", "nome": "Pro", "desconto": 36 },
  "margem_revenda": 100
}

Autenticação

Envie a chave em todas as requisições, no cabeçalho Authorization: Bearer qr_live_… (ou em X-Api-Key). Use a chave só no servidor: quem tem a chave compra com o seu saldo. Ela aparece uma única vez, quando você cria; se vazar, apague no painel e crie outra. Você pode ter até 5 chaves (por exemplo, uma para a loja e outra para um bot).

Limites

O quêLimitePor quê
Requisições por chave60 por minutoProtege a sua conta e o painel.
Buscas no catálogo (GET /contas)12 por minuto por revendedorO estoque vem de um fornecedor com limite de buscas. Buscas iguais nos últimos 3 minutos vêm do cache e são instantâneas.
Códigos de verificação1 leitura a cada 15 s e 30 por dia por pedidoDentro dos 15 s a resposta repete a última leitura (do_cache: true).
Compras15 a cada 10 minutosEvita compras em loop por engano.

Passou do limite: resposta 429 com o cabeçalho Retry-After (em segundos). Espere e tente de novo.

Erros

Todo erro vem com o status HTTP e um JSON com um código fixo (para a sua loja decidir o que fazer) e uma mensagem em português (para mostrar a quem estiver olhando):

json
{ "erro": { "codigo": "saldo_insuficiente", "mensagem": "Saldo insuficiente: esta conta custa R$ 160,58. Recarregue no PIX." } }
CódigoStatusQuando
chave_invalida401Chave ausente, errada ou apagada.
plano_sem_api403O seu plano não inclui a API.
jogo_bloqueado403O jogo não está liberado no seu plano.
parametro_invalido400Algum parâmetro está faltando ou errado.
nao_encontrado404Conta ou pedido não encontrado.
saldo_insuficiente409Falta saldo para a compra.
preco_mudou409O preço passou do preco_maximo que você mandou. Busque de novo.
conta_indisponivel409A conta foi vendida, está sendo comprada por outra pessoa ou o fornecedor está recusando. Escolha outra.
conflito409Outro impedimento (ex.: cadastro da loja incompleto). Leia a mensagem.
limite_de_requisicoes429Passou de um dos limites acima.
fornecedor_ocupado503Muita gente buscando ao mesmo tempo. Tente de novo em alguns segundos.
erro_interno500Falha nossa. Tente de novo; se repetir, fale com o suporte.

Fluxo de compra recomendado

  1. GET /contas?jogo=… com os filtros do pedido do seu cliente. Guarde o id e o precos.revendedor da conta escolhida.
  2. POST /pedidos com preco_maximo igual ao preço que você viu (se o preço subir, a compra não acontece) e um Idempotency-Key único por venda (se a sua requisição cair e você repetir, não compra duas vezes).
  3. A resposta normalmente já vem com status: "entregue" e os dados em entrega. A compra pode levar até 1 minuto; se a sua conexão cair antes, consulte GET /pedidos/{id} a cada 5 segundos até sair de comprando.
  4. devolvido: não deu para entregar e o valor já voltou para o seu saldo. Escolha outra conta. em_analise: nossa equipe está olhando; o valor não se perde.
  5. Se o jogo pedir um código no primeiro login, use POST /pedidos/{id}/codigo-email (ou codigo-steam em contas Steam com Steam Guard).

Endpoints

GET/api/v1/saldo

Seu saldo, o plano e a margem de revenda usada no preço sugerido.

GET/api/v1/jogos

Jogos do catálogo e quais estão liberados no seu plano.

json
{
  "jogos": [
    { "id": "valorant", "nome": "Valorant", "liberado": true },
    { "id": "fortnite", "nome": "Fortnite", "liberado": true },
    { "id": "roblox", "nome": "Roblox", "liberado": true },
    { "id": "steam", "nome": "Steam", "liberado": true },
    { "id": "r6", "nome": "Rainbow Six Siege", "liberado": true },
    { "id": "lol", "nome": "League of Legends", "liberado": true },
    { "id": "genshin", "nome": "Genshin Impact", "liberado": true },
    { "id": "brawlstars", "nome": "Brawl Stars", "liberado": true },
    { "id": "clashroyale", "nome": "Clash Royale", "liberado": true },
    { "id": "rocketleague", "nome": "Rocket League", "liberado": true },
    { "id": "ea", "nome": "EA", "liberado": true }
  ]
}

GET/api/v1/contas?jogo={jogo}

Contas à venda agora, com os três preços do seu plano: loja (preço de loja), revendedor (o que sai do seu saldo) e sugerido (o seu preço de revenda com a sua margem). Os filtros de cada jogo estão em Filtros por jogo.

ParâmetroExemploO que faz
jogovalorantObrigatório. Veja GET /jogos.
preco_min50Preço do revendedor mínimo, em reais.
preco_max150Preço do revendedor máximo, em reais.
ordemmenor_precorecentes (padrão), menor_preco ou maior_preco.
buscavandalTexto no título do anúncio (até 60 caracteres).
cursor…Próxima página: use o proximo_cursor da resposta anterior.
bash
curl "https://quantumresell.lovable.app/api/v1/contas?jogo=valorant&preco_max=150&ranque_min=12&faca=true" \
  -H "Authorization: Bearer qr_live_SUA_CHAVE"
json
{
  "jogo": "valorant",
  "total_no_fornecedor": 316,
  "proximo_cursor": "eyJ…",
  "contas": [
    {
      "id": "1a2b3c4d5e",
      "jogo": "valorant",
      "titulo": "Ouro 3 • 42 skins • 1 faca",
      "subtitulo": "Brasil • nível 87 • e-mail verificado",
      "imagem": null,
      "etiquetas": ["Ouro 3", "Brasil"],
      "numeros": [{ "nome": "Skins", "valor": "42" }, { "nome": "Facas", "valor": "1" }],
      "atributos": [{ "nome": "Ranque", "valor": "Ouro 3" }],
      "miniaturas": [{ "nome": "Karambit Prime", "imagem": "https://…", "detalhe": "Faca · Premium" }],
      "lista": [],
      "precos": { "loja": 250.9, "revendedor": 160.58, "sugerido": 321.9 },
      "lucro_sugerido": 161.32
    }
  ]
}

GET/api/v1/contas/{jogo}/{id}

Tudo da conta: todas as skins, agentes, cosméticos, jogos ou operadores (em abas), as conferências (e-mail verificado, sem ban…) e se ela ainda está disponível. Os dados ficam guardados por 60 segundos.

json
{
  "id": "1a2b3c4d5e",
  "…": "os mesmos campos da busca",
  "disponivel": true,
  "motivo_indisponivel": null,
  "numeros_detalhe": [{ "nome": "Agentes", "valor": "21" }],
  "verificacoes": [{ "ok": true, "texto": "E-mail verificado" }],
  "abas": [
    { "id": "skins", "nome": "Skins", "itens": [{ "nome": "Reaver Vandal", "imagem": "https://…", "detalhe": "Vandal · Premium" }] },
    { "id": "agentes", "nome": "Agentes", "itens": [{ "nome": "Jett", "imagem": "https://…", "detalhe": null }] }
  ]
}

POST/api/v1/pedidos

Compra a conta com o seu saldo e devolve o pedido (com os dados quando entregue). No Fortnite, a troca só é feita com a gravação da tela do primeiro acesso: avise o seu cliente na sua loja.

Campo / cabeçalhoObrigatórioO que faz
jogosimId do jogo (valorant, fortnite…).
contasimO id da conta que veio na busca.
preco_maximonão (recomendado)Não compra se o preço do revendedor tiver subido acima disso.
Idempotency-Keynão (recomendado)Cabeçalho de 8 a 80 caracteres. Repetir a mesma chave devolve o mesmo pedido em vez de comprar de novo.
bash
curl -X POST https://quantumresell.lovable.app/api/v1/pedidos \
  -H "Authorization: Bearer qr_live_SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: venda-48231" \
  -d '{ "jogo": "valorant", "conta": "1a2b3c4d5e", "preco_maximo": 160.58 }'
json
{
  "id": "AB12CD34",
  "tipo": "conta",
  "status": "entregue",
  "jogo": "valorant",
  "conta": { "id": "1a2b3c4d5e", "titulo": "Ouro 3 • 42 skins • 1 faca", "subtitulo": "Brasil" },
  "valor_pago": 160.58,
  "preco_loja": 250.9,
  "preco_sugerido": 321.9,
  "valor_devolvido": null,
  "mensagem": null,
  "criado_em": "2026-11-13T20:00:00.000Z",
  "entrega": {
    "login": "raze.main93",
    "senha": "••••••••",
    "dados": null,
    "email": "conta@outlook.com",
    "senha_email": "••••••••",
    "chave_2fa": null
  }
}

Status 201 quando compra; 200 com o cabeçalho Idempotent-Replay: true quando repete um pedido já feito.

GET/api/v1/pedidos

Seus últimos 100 pedidos de contas, do mais novo para o mais antigo. A lista não traz login e senha (use GET /pedidos/{id}).

GET/api/v1/pedidos/{id}

Situação do pedido e, quando entregue, os dados em entrega. Consultar um pedido em comprando também ajuda a destravar uma compra que foi interrompida. Se a conta vem com a chave do autenticador (chave_2fa), a resposta já traz o código atual em entrega.codigo_2fa e em quantos segundos ele troca (codigo_2fa_troca_em): é só repassar ao cliente.

POST/api/v1/pedidos/{id}/codigo-email

Código mais recente que chegou no e-mail da conta entregue (sem precisar entrar no e-mail). Para contas Steam com Steam Guard, use POST /api/v1/pedidos/{id}/codigo-steam.

json
{ "codigo": "482913", "texto": null, "recebido_em": "2026-11-13T20:02:11.000Z", "do_cache": false }

Sem código ainda: 404 com a dica de onde pedir o código (por exemplo, no login da Riot). Às vezes vem um link em vez de código: ele aparece em texto.

POST/api/v1/contas/{jogo}/{id}/verificar

Consulta agora (sem cache) se a conta ainda está à venda e o preço atual. Use antes de mostrar a conta ao seu cliente ou de cobrar. Até 20 verificações por minuto.

json
{ "id": "1a2b3c4d5e", "disponivel": true, "motivo": null, "precos": { "loja": 250.9, "revendedor": 160.58, "sugerido": 321.9 } }

GET/api/v1/skins?busca={nome}

Busca skins do Valorant pelo nome, em português ou inglês. Use os id no filtro skins= de GET /contas para achar contas que tenham aquela skin (até 5, separadas por vírgula). Com jogo=lol, busca as skins do League of Legends (pelo nome da skin ou do campeão) e devolve IDs numéricos. Com jogo=genshin, busca personagens do Genshin Impact para o filtro personagens=; com jogo=brawlstars, brawlers para o filtro brawlers=.

json
{
  "skins": [
    { "id": "362a42f4-4404-db85-267c-55bbe1b08f52", "nome": "Vandal Ceifador", "arma": "Vandal", "raridade": "Premium", "imagem": "https://…" }
  ]
}

// GET /api/v1/skins?jogo=lol&busca=ahri
{
  "jogo": "lol",
  "skins": [
    { "id": "103015", "nome": "Ahri K/DA", "campeao": "Ahri", "raridade": "Épica", "imagem": "https://…" }
  ]
}

// GET /api/v1/skins?jogo=genshin&busca=furina
{
  "jogo": "genshin",
  "personagens": [
    { "id": "10000089", "nome": "Furina", "estrelas": 5, "elemento": "Hydro", "imagem": "https://…" }
  ]
}

// GET /api/v1/skins?jogo=brawlstars&busca=spike
{
  "jogo": "brawlstars",
  "brawlers": [
    { "id": "SPIKE", "nome": "Spike", "raridade": "Lendário", "imagem": "https://…" }
  ]
}

POST/api/v1/recargas

Gera um PIX para colocar saldo, sem abrir o painel. O saldo cai sozinho quando o PIX é pago (com o webhook recarga.paga, se você usa). Acompanhe em GET /api/v1/recargas/{id}: pendente, paga ou expirada.

bash
curl -X POST https://quantumresell.lovable.app/api/v1/recargas \
  -H "Authorization: Bearer qr_live_SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{ "valor": 100 }'
json
{
  "id": "RC7H2K9Q",
  "valor": 100,
  "status": "pendente",
  "criado_em": "2026-11-14T15:00:00.000Z",
  "pix": { "copia_e_cola": "00020126…", "qr_code": "data:image/png;base64,…", "expira_em": "2026-11-14T15:30:00.000Z" }
}

GET/api/v1/estatisticas?periodo=30d

Os mesmos números do início do painel: contas vendidas, gasto, lucro estimado (pela sua margem), ticket médio, devoluções, recargas, comparação com o período anterior, jogos que mais vendem e a série por hora, dia ou mês. periodo: hoje, ontem, 7d, 30d, mes, mes_passado ou tudo. Ou datas: de=2026-11-01&ate=2026-11-14.

json
{
  "periodo": "30d",
  "vendidas": 65,
  "gasto": 9552,
  "lucro_estimado": 9552,
  "ticket_medio": 146.95,
  "comparacao": { "periodo_anterior": "16 set – 15 out 2026", "vendidas": 69, "variacao_percentual": { "vendidas": -5.8 } },
  "por_jogo": [{ "jogo": "valorant", "nome": "Valorant", "vendidas": 31, "lucro_estimado": 4366, "participacao_percentual": 47.7 }],
  "serie": { "por": "dia", "pontos": [{ "rotulo": "16/10", "vendidas": 2, "gasto": 280, "lucro_estimado": 280 }] }
}

GET/api/v1

Público, sem chave: diz se a API está no ar e lista os recursos. Bom para o monitoramento da sua loja.

json
{ "nome": "QuantumResell API", "versao": "1", "status": "no_ar", "moeda": "BRL", "documentacao": "https://quantumresell.lovable.app/docs", "recursos": { "…": "…" } }

Filtros por jogo

Jogo (id)FiltrosValores
valorantregiao, ranque_min, faca, skins_min, skins, nivel_min, telefone, com_email, inativa_diasregiao: BR (padrão), NA, LA, EU, AP, KR ou ALL. ranque_min: 3 = Ferro, 6 = Bronze, 9 = Prata, 12 = Ouro, 15 = Platina, 18 = Diamante, 21 = Ascendente, 24 = Imortal, 27 = Radiante (cada divisão soma 1). faca e com_email: true. skins: até 5 IDs de GET /skins, separados por vírgula (a conta tem todas). telefone: sem ou com. inativa_dias: dias sem uso, no mínimo.
fortniteskins_min, vbucks_minNúmeros inteiros.
robloxrobux_min, inventario_minSó contas com acesso ao e-mail.
steamtem_jogo, jogos_min, jogos_max, nivel_min, pais, premier_min, inativa_dias, com_email, sem_vac, nao_limitada, steam_guardtem_jogo: até 5 app ids separados por vírgula (a conta tem todos), ex. 730 = Counter-Strike 2, 570 = Dota 2, 252490 = Rust, 271590 = GTA V, 1174180 = Red Dead Redemption 2, 1245620 = Elden Ring. pais: código de 3 letras (BRA, USA, ARG, TUR…). premier_min: rating Premier do CS2. inativa_dias: dias sem uso, no mínimo. com_email, sem_vac, nao_limitada e steam_guard: true.
r6r6_ranque_min, r6_nivel_min, r6_operadores_min, r6_skins_minr6_ranque_min (pontos): 1500 = Bronze, 2000 = Prata, 2500 = Ouro, 3000 = Platina, 3500 = Esmeralda, 4000 = Diamante, 4500 = Campeão. Só contas sem ban no Rainbow Six.
lolregiao, elo_min, nivel_min, skins_min, campeoes_min, skins, telefone, com_email, inativa_diasregiao: BR (padrão), NA, LA, EU, AP, KR ou ALL. elo_min: ferro, bronze, prata, ouro, platina, esmeralda, diamante, mestre, grao_mestre, desafiante (a partir da divisão IV). skins: até 5 IDs numéricos de GET /skins?jogo=lol, separados por vírgula (a conta tem todas). telefone: sem ou com. com_email: true. inativa_dias: dias sem uso, no mínimo.
genshinregiao, nivel_min, cinco_estrelas_min, armas_5_min, personagens_min, constelacoes_min, gemas_min, personagens, com_email, inativa_diasregiao (servidor): NA (América), EU, AP (Ásia) ou TW; sem regiao = todos. nivel_min: Nível de Aventura (1 a 60). constelacoes_min: soma das constelações dos personagens 5★. gemas_min: Gemas Essenciais. personagens: até 5 IDs de GET /skins?jogo=genshin, separados por vírgula (a conta tem todos).
brawlstarstrofeus_min, brawlers_min, lendarios_min, hipercargas_min, ranqueado_min, brawlers, telefone, com_email, inativa_diasranqueado_min: 1 = Bronze I … 21 = Mestre III (cada liga tem 3 divisões). brawlers: até 5 nomes de GET /skins?jogo=brawlstars, separados por vírgula (ex.: SPIKE,8-BIT; a conta tem todos).
clashroyaletrofeus_min, nivel_min, campeoes_min, evolucoes_min, telefone, com_email, inativa_diasnivel_min: nível do Rei. campeoes_min: cartas campeão. evolucoes_min: cartas evoluídas.
rocketleaguehoras_min, jogos_min, compras_rl, troca_email, com_email, inativa_diasContas da Epic Games com o Rocket League. horas_min: horas jogadas no RL. compras_rl e troca_email (a Epic já libera trocar o e-mail): true.
eanivel_min, apex_ranque_min, jogos_min, assinatura, com_emailnivel_min: nível no Apex Legends. apex_ranque_min: bronze, prata, ouro, platina, diamante, mestre. assinatura: ea_play ou ea_play_pro. Só contas sem ban.

Status dos pedidos

statusO que significaO que fazer
comprandoEstamos comprando a conta no fornecedor.Consulte de novo em 5 s.
entreguePronto: os dados estão em entrega.Envie ao seu cliente.
devolvidoNão deu para entregar; o valor voltou para o seu saldo (valor_devolvido).Escolha outra conta.
em_analiseAlgo saiu do normal e a equipe está olhando. O valor não se perde.Aguarde ou fale com o suporte.
canceladoA compra não começou (ex.: saldo insuficiente).Nada foi cobrado.

Exemplo completo (Node.js 18+)

javascript
const BASE = "https://quantumresell.lovable.app/api/v1";
const KEY = process.env.QUANTUMRESELL_KEY; // nunca no navegador

async function api(path, init = {}) {
  const res = await fetch(BASE + path, {
    ...init,
    headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json", ...init.headers },
  });
  const body = await res.json();
  if (!res.ok) throw Object.assign(new Error(body.erro.mensagem), { codigo: body.erro.codigo });
  return body;
}

// 1) a conta mais barata de Valorant BR com faca, até R$ 150 para você
const { contas } = await api("/contas?jogo=valorant&faca=true&preco_max=150&ordem=menor_preco");
const conta = contas[0];

// 2) compra com proteção de preço e de repetição
let pedido = await api("/pedidos", {
  method: "POST",
  headers: { "Idempotency-Key": "venda-" + Date.now() },
  body: JSON.stringify({ jogo: "valorant", conta: conta.id, preco_maximo: conta.precos.revendedor }),
});

// 3) se ainda estiver comprando, espera
while (pedido.status === "comprando") {
  await new Promise((r) => setTimeout(r, 5000));
  pedido = await api(`/pedidos/${pedido.id}`);
}

if (pedido.status === "entregue") console.log(pedido.entrega); // envie ao seu cliente
else console.log("Não entregue:", pedido.status, pedido.mensagem);

Exemplo: bot de Discord

Um bot completo em discord.js: /contas lista o que está à venda e /comprar compra e manda login e senha na DM do cliente. O /comprar fica só para administradores, porque gasta o seu saldo.

javascript
// bot.js — discord.js v14. Variáveis: QUANTUMRESELL_KEY, DISCORD_TOKEN, DISCORD_APP_ID
import { Client, GatewayIntentBits, PermissionFlagsBits, REST, Routes, SlashCommandBuilder } from "discord.js";

const API = "https://quantumresell.lovable.app/api/v1";
async function api(path, init = {}) {
  const r = await fetch(API + path, {
    ...init,
    headers: {
      Authorization: `Bearer ${process.env.QUANTUMRESELL_KEY}`,
      "Content-Type": "application/json",
      ...init.headers,
    },
  });
  const body = await r.json();
  if (!r.ok) throw new Error(body.erro?.mensagem ?? "Erro na API");
  return body;
}

const commands = [
  new SlashCommandBuilder().setName("contas").setDescription("Contas à venda")
    .addStringOption((o) => o.setName("jogo").setDescription("valorant, fortnite…").setRequired(true)),
  // /comprar gasta o SEU saldo: só administradores. Numa loja de verdade, o bot só compra
  // depois que o cliente pagou (no seu sistema de pagamento).
  new SlashCommandBuilder().setName("comprar").setDescription("Compra uma conta e entrega na DM")
    .setDefaultMemberPermissions(PermissionFlagsBits.Administrator)
    .addStringOption((o) => o.setName("jogo").setDescription("valorant, fortnite…").setRequired(true))
    .addStringOption((o) => o.setName("id").setDescription("id da conta").setRequired(true))
    .addUserOption((o) => o.setName("cliente").setDescription("quem recebe").setRequired(true)),
].map((c) => c.toJSON());

await new REST().setToken(process.env.DISCORD_TOKEN)
  .put(Routes.applicationCommands(process.env.DISCORD_APP_ID), { body: commands });

const client = new Client({ intents: [GatewayIntentBits.Guilds] });

client.on("interactionCreate", async (i) => {
  if (!i.isChatInputCommand()) return;
  try {
    if (i.commandName === "contas") {
      const jogo = i.options.getString("jogo");
      const { contas } = await api(`/contas?jogo=${jogo}&ordem=menor_preco`);
      const lista = contas.slice(0, 10)
        .map((c) => `\`${c.id}\` ${c.titulo} — R$ ${c.precos.sugerido}`)
        .join("\n");
      return i.reply({ content: lista || "Nenhuma conta agora.", ephemeral: true });
    }
    if (i.commandName === "comprar") {
      await i.deferReply({ ephemeral: true });
      const pedido = await api("/pedidos", {
        method: "POST",
        headers: { "Idempotency-Key": `discord-${i.id}` }, // o mesmo comando nunca compra duas vezes
        body: JSON.stringify({ jogo: i.options.getString("jogo"), conta: i.options.getString("id") }),
      });
      if (pedido.status !== "entregue") return i.editReply(`Pedido ${pedido.id}: ${pedido.status}`);
      const e = pedido.entrega;
      await i.options.getUser("cliente").send(
        `Sua conta chegou! Pedido ${pedido.id}\nLogin: ${e.login}\nSenha: ${e.senha}` +
          (e.email ? `\nE-mail: ${e.email}\nSenha do e-mail: ${e.senha_email}` : ""),
      );
      return i.editReply("Entregue na DM do cliente.");
    }
  } catch (err) {
    return i.deferred ? i.editReply(err.message) : i.reply({ content: err.message, ephemeral: true });
  }
});

client.login(process.env.DISCORD_TOKEN);

Exemplo: loja (Next.js)

Na sua loja, compre só depois que o seu sistema de pagamento confirmar o pagamento do cliente, e sempre no servidor. O Idempotency-Key com o id da venda garante que uma confirmação repetida não compra duas vezes.

typescript
// app/api/entregar/route.ts — no SERVIDOR da sua loja (Next.js). Chame depois que o
// seu sistema de pagamento confirmar que o cliente pagou.
export async function POST(req: Request) {
  const { vendaId, jogo, conta, precoQueVoceViu } = await req.json();

  const r = await fetch("https://quantumresell.lovable.app/api/v1/pedidos", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.QUANTUMRESELL_KEY}`,
      "Content-Type": "application/json",
      "Idempotency-Key": `venda-${vendaId}`, // pagamento confirmado duas vezes = uma compra só
    },
    body: JSON.stringify({ jogo, conta, preco_maximo: precoQueVoceViu }),
  });
  const pedido = await r.json();
  if (!r.ok) {
    // ex.: conta_indisponivel → ofereça outra conta ou devolva o pagamento do cliente
    return Response.json({ erro: pedido.erro.codigo, mensagem: pedido.erro.mensagem }, { status: 409 });
  }

  // salve pedido.id na venda. Se ainda estiver "comprando", o webhook pedido.entregue avisa.
  return Response.json({ status: pedido.status, entrega: pedido.entrega });
}

Prompts para IA

Quer montar mais rápido? Copie um destes textos e cole no ChatGPT, Claude, v0 ou Cursor: eles já explicam a API para a IA gerar o código pronto.

Bot de Discord

prompt
Crie um bot de Discord em discord.js v14 (Node.js 18+) que revende contas usando esta API.

API do QuantumResell (contas de jogos para revenda).
Base: https://quantumresell.lovable.app/api/v1
Autenticação: cabeçalho "Authorization: Bearer <QUANTUMRESELL_KEY>" (variável de ambiente, só no servidor).
Erros: status HTTP + { "erro": { "codigo": "...", "mensagem": "..." } }.
Endpoints:
- GET /saldo -> { saldo, plano: { nome, desconto }, margem_revenda }
- GET /jogos -> { jogos: [{ id, nome, liberado }] }
- GET /contas?jogo={id}&preco_max=&ordem=menor_preco -> { contas: [{ id, titulo, subtitulo, numeros, precos: { revendedor, sugerido } }], proximo_cursor }
- GET /contas/{jogo}/{id} -> detalhe com abas de skins/itens
- POST /contas/{jogo}/{id}/verificar -> { disponivel, motivo }
- POST /pedidos body { jogo, conta, preco_maximo } + cabeçalho Idempotency-Key -> { id, status, entrega: { login, senha, email, senha_email } }
- GET /pedidos/{id} -> status: comprando | entregue | devolvido | em_analise
- POST /recargas body { valor } -> { id, status, pix: { copia_e_cola, qr_code } }
- GET /estatisticas?periodo=7d|30d|mes -> { vendidas, gasto, lucro_estimado, por_jogo }
Webhooks (opcional): POST na URL da loja com cabeçalho X-QuantumResell-Assinatura "t=..,v1=.." = HMAC-SHA256 de "t.corpo" com o segredo whsec_; eventos pedido.entregue, pedido.devolvido, pedido.em_analise, recarga.paga.

Comandos:
- /contas jogo:<id> → lista 10 contas (id, título, preço sugerido), resposta efêmera.
- /conta jogo:<id> id:<id> → mostra o detalhe com as principais skins.
- /comprar jogo:<id> id:<id> cliente:<usuário> → só administradores; compra com Idempotency-Key "discord-<id da interação>" e manda login e senha na DM do cliente.
- /saldo → mostra o saldo (só administradores).
Trate os erros mostrando erro.mensagem. Nunca escreva a chave em logs ou mensagens.

Loja em Next.js

prompt
Crie uma loja em Next.js 15 (App Router, TypeScript, Tailwind) que revende contas de jogos usando esta API.

API do QuantumResell (contas de jogos para revenda).
Base: https://quantumresell.lovable.app/api/v1
Autenticação: cabeçalho "Authorization: Bearer <QUANTUMRESELL_KEY>" (variável de ambiente, só no servidor).
Erros: status HTTP + { "erro": { "codigo": "...", "mensagem": "..." } }.
Endpoints:
- GET /saldo -> { saldo, plano: { nome, desconto }, margem_revenda }
- GET /jogos -> { jogos: [{ id, nome, liberado }] }
- GET /contas?jogo={id}&preco_max=&ordem=menor_preco -> { contas: [{ id, titulo, subtitulo, numeros, precos: { revendedor, sugerido } }], proximo_cursor }
- GET /contas/{jogo}/{id} -> detalhe com abas de skins/itens
- POST /contas/{jogo}/{id}/verificar -> { disponivel, motivo }
- POST /pedidos body { jogo, conta, preco_maximo } + cabeçalho Idempotency-Key -> { id, status, entrega: { login, senha, email, senha_email } }
- GET /pedidos/{id} -> status: comprando | entregue | devolvido | em_analise
- POST /recargas body { valor } -> { id, status, pix: { copia_e_cola, qr_code } }
- GET /estatisticas?periodo=7d|30d|mes -> { vendidas, gasto, lucro_estimado, por_jogo }
Webhooks (opcional): POST na URL da loja com cabeçalho X-QuantumResell-Assinatura "t=..,v1=.." = HMAC-SHA256 de "t.corpo" com o segredo whsec_; eventos pedido.entregue, pedido.devolvido, pedido.em_analise, recarga.paga.

Requisitos:
- Vitrine por jogo usando GET /contas, com o preço sugerido (precos.sugerido) como preço de venda; filtros de preço e ordem.
- Página da conta com GET /contas/{jogo}/{id}.
- Checkout no meu próprio gateway de pagamento (deixe uma função stub "confirmarPagamento").
- Depois do pagamento confirmado, uma rota de servidor chama POST /pedidos com preco_maximo = preço que o cliente viu e Idempotency-Key = id da venda, e mostra login e senha ao cliente.
- Rota /api/webhooks/quantumresell que confere a assinatura (HMAC-SHA256, tolerância de 5 min) e marca a venda como entregue.
- A chave fica só no servidor (process.env.QUANTUMRESELL_KEY).

Relatório na planilha

prompt
Crie um script Node.js 18+ que roda uma vez por dia e manda para uma planilha do Google Sheets (ou um CSV) o resumo das minhas vendas usando esta API.

API do QuantumResell (contas de jogos para revenda).
Base: https://quantumresell.lovable.app/api/v1
Autenticação: cabeçalho "Authorization: Bearer <QUANTUMRESELL_KEY>" (variável de ambiente, só no servidor).
Erros: status HTTP + { "erro": { "codigo": "...", "mensagem": "..." } }.
Endpoints:
- GET /saldo -> { saldo, plano: { nome, desconto }, margem_revenda }
- GET /jogos -> { jogos: [{ id, nome, liberado }] }
- GET /contas?jogo={id}&preco_max=&ordem=menor_preco -> { contas: [{ id, titulo, subtitulo, numeros, precos: { revendedor, sugerido } }], proximo_cursor }
- GET /contas/{jogo}/{id} -> detalhe com abas de skins/itens
- POST /contas/{jogo}/{id}/verificar -> { disponivel, motivo }
- POST /pedidos body { jogo, conta, preco_maximo } + cabeçalho Idempotency-Key -> { id, status, entrega: { login, senha, email, senha_email } }
- GET /pedidos/{id} -> status: comprando | entregue | devolvido | em_analise
- POST /recargas body { valor } -> { id, status, pix: { copia_e_cola, qr_code } }
- GET /estatisticas?periodo=7d|30d|mes -> { vendidas, gasto, lucro_estimado, por_jogo }
Webhooks (opcional): POST na URL da loja com cabeçalho X-QuantumResell-Assinatura "t=..,v1=.." = HMAC-SHA256 de "t.corpo" com o segredo whsec_; eventos pedido.entregue, pedido.devolvido, pedido.em_analise, recarga.paga.

Requisitos:
- Busque GET /estatisticas?periodo=ontem e grave uma linha por dia: data, contas vendidas, gasto, lucro estimado e o jogo que mais vendeu (por_jogo[0]).
- Busque GET /pedidos e acrescente numa segunda aba os pedidos novos (id, jogo, valor pago, status, data), sem repetir os que já estão lá.
- Leia a chave de process.env.QUANTUMRESELL_KEY e explique como agendar (cron).

Pronto para a primeira venda automática?

Crie a sua chave no painel e faça o primeiro teste em minutos.

Criar minha chave

Webhooks

Com o webhook ligado, a sua loja não precisa ficar consultando o pedido: assim que algo muda, mandamos um POST com JSON para a URL que você cadastrou em Painel → API. Lá você escolhe os eventos, copia o segredo da assinatura, manda um teste e vê os últimos envios. Faz parte dos planos Starter, Pro e Elite.

EventoQuando
pedido.entregueA conta foi entregue. O pedido vem completo, com login e senha em entrega.
pedido.devolvidoNão deu para entregar e o valor voltou para o seu saldo (valor_devolvido).
pedido.em_analiseA compra saiu do normal e a equipe está olhando. O valor não se perde.
recarga.pagaUma recarga PIX caiu no seu saldo.

O pedido em dados.pedido tem o mesmo formato de GET /pedidos/{id}. Os cabeçalhos trazem o evento (X-QuantumResell-Evento), o id do aviso (X-QuantumResell-Id, igual em todas as tentativas: use para não processar duas vezes) e a assinatura (X-QuantumResell-Assinatura).

json
{
  "id": "evt_8Qm2fV7xKp1sZt4LbN0cRw9e",
  "tipo": "pedido.entregue",
  "criado_em": "2026-11-13T20:00:03.000Z",
  "dados": {
    "pedido": {
      "id": "AB12CD34",
      "status": "entregue",
      "jogo": "valorant",
      "valor_pago": 160.58,
      "…": "os mesmos campos de GET /pedidos/{id}",
      "entrega": { "login": "raze.main93", "senha": "••••••••", "email": "conta@outlook.com" }
    }
  }
}

Conferir a assinatura

A assinatura é t=<segundos>,v1=<hex>, onde v1 é o HMAC-SHA256 de t + "." + corpo com o segredo whsec_…. Confira com o corpo exatamente como chegou (antes de converter o JSON) e recuse avisos com mais de 5 minutos.

javascript
import crypto from "node:crypto";
import express from "express";

const SEGREDO = process.env.QUANTUMRESELL_WEBHOOK_SECRET; // whsec_…
const app = express();

app.post("/webhooks/quantumresell", express.raw({ type: "application/json" }), (req, res) => {
  const corpo = req.body.toString("utf8");
  const partes = Object.fromEntries(
    String(req.get("X-QuantumResell-Assinatura")).split(",").map((p) => p.split("=")),
  );
  const esperado = crypto.createHmac("sha256", SEGREDO).update(`${partes.t}.${corpo}`).digest("hex");
  const recente = Math.abs(Date.now() / 1000 - Number(partes.t)) < 300;
  const igual =
    partes.v1?.length === esperado.length &&
    crypto.timingSafeEqual(Buffer.from(partes.v1), Buffer.from(esperado));
  if (!recente || !igual) return res.status(400).send("assinatura inválida");

  const evento = JSON.parse(corpo);
  res.sendStatus(200); // responda logo; processe depois

  if (evento.tipo === "pedido.entregue") {
    // já processou este evento.id? ignore. Se não, envie evento.dados.pedido.entrega ao cliente
  }
});

Tentativas

Conta como entregue quando a sua loja responde 2xx em até 5 segundos. Redirecionamentos não são seguidos. Se falhar, tentamos de novo depois de cerca de 1, 10, 30, 60, 180 e 360 minutos (o reenvio roda a cada 10 minutos), num total de 7 tentativas em até 12 horas. Depois de 50 falhas seguidas o webhook pausa sozinho; salve de novo no painel para reativar. A URL precisa ser https:// com domínio público (sem IP ou localhost).

Mudanças

DataO que mudou
14/11/2026Status público (GET /api/v1), recarga PIX, estatísticas por período, verificar conta, busca de skins e código 2FA atual no pedido. Valorant: filtro por skin específica, nível, telefone, e-mail e dias sem uso. Exemplos em Node.js e Python, bot de Discord, loja e prompts para IA.
14/11/2026Webhooks assinados (pedido.entregue, pedido.devolvido, pedido.em_analise, recarga.paga). Steam: banners dos jogos, CS2 Prime, ranque e Premier, e filtros novos (vários jogos, nível, país, Premier, dias sem uso, com e-mail, não limitada).
13/11/2026v1: saldo, jogos, contas, detalhe da conta, compra com preco_maximo e Idempotency-Key, pedidos, código do e-mail e do Steam Guard. Jogos: Valorant, Fortnite, Roblox, Steam e Rainbow Six Siege.

Dúvidas? Fale com a gente pelo suporte do painel. O QuantumResell não é afiliado à Riot Games, Epic Games, Valve, Ubisoft ou Roblox Corporation.