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.
curl https://quantumresell.lovable.app/api/v1/saldo \ -H "Authorization: Bearer qr_live_SUA_CHAVE"
{
"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ê | Limite | Por quê |
|---|---|---|
| Requisições por chave | 60 por minuto | Protege a sua conta e o painel. |
| Buscas no catálogo (GET /contas) | 12 por minuto por revendedor | O 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ção | 1 leitura a cada 15 s e 30 por dia por pedido | Dentro dos 15 s a resposta repete a última leitura (do_cache: true). |
| Compras | 15 a cada 10 minutos | Evita 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):
{ "erro": { "codigo": "saldo_insuficiente", "mensagem": "Saldo insuficiente: esta conta custa R$ 160,58. Recarregue no PIX." } }| Código | Status | Quando |
|---|---|---|
chave_invalida | 401 | Chave ausente, errada ou apagada. |
plano_sem_api | 403 | O seu plano não inclui a API. |
jogo_bloqueado | 403 | O jogo não está liberado no seu plano. |
parametro_invalido | 400 | Algum parâmetro está faltando ou errado. |
nao_encontrado | 404 | Conta ou pedido não encontrado. |
saldo_insuficiente | 409 | Falta saldo para a compra. |
preco_mudou | 409 | O preço passou do preco_maximo que você mandou. Busque de novo. |
conta_indisponivel | 409 | A conta foi vendida, está sendo comprada por outra pessoa ou o fornecedor está recusando. Escolha outra. |
conflito | 409 | Outro impedimento (ex.: cadastro da loja incompleto). Leia a mensagem. |
limite_de_requisicoes | 429 | Passou de um dos limites acima. |
fornecedor_ocupado | 503 | Muita gente buscando ao mesmo tempo. Tente de novo em alguns segundos. |
erro_interno | 500 | Falha nossa. Tente de novo; se repetir, fale com o suporte. |
Fluxo de compra recomendado
GET /contas?jogo=…com os filtros do pedido do seu cliente. Guarde oide oprecos.revendedorda conta escolhida.POST /pedidoscompreco_maximoigual ao preço que você viu (se o preço subir, a compra não acontece) e umIdempotency-Keyúnico por venda (se a sua requisição cair e você repetir, não compra duas vezes).- A resposta normalmente já vem com
status: "entregue"e os dados ementrega. A compra pode levar até 1 minuto; se a sua conexão cair antes, consulteGET /pedidos/{id}a cada 5 segundos até sair decomprando. 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.- Se o jogo pedir um código no primeiro login, use
POST /pedidos/{id}/codigo-email(oucodigo-steamem 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.
{
"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âmetro | Exemplo | O que faz |
|---|---|---|
jogo | valorant | Obrigatório. Veja GET /jogos. |
preco_min | 50 | Preço do revendedor mínimo, em reais. |
preco_max | 150 | Preço do revendedor máximo, em reais. |
ordem | menor_preco | recentes (padrão), menor_preco ou maior_preco. |
busca | vandal | Texto no título do anúncio (até 60 caracteres). |
cursor | … | Próxima página: use o proximo_cursor da resposta anterior. |
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"
{
"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.
{
"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çalho | Obrigatório | O que faz |
|---|---|---|
jogo | sim | Id do jogo (valorant, fortnite…). |
conta | sim | O id da conta que veio na busca. |
preco_maximo | não (recomendado) | Não compra se o preço do revendedor tiver subido acima disso. |
Idempotency-Key | não (recomendado) | Cabeçalho de 8 a 80 caracteres. Repetir a mesma chave devolve o mesmo pedido em vez de comprar de novo. |
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 }'{
"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.
{ "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.
{ "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=.
{
"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.
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 }'{
"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.
{
"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.
{ "nome": "QuantumResell API", "versao": "1", "status": "no_ar", "moeda": "BRL", "documentacao": "https://quantumresell.lovable.app/docs", "recursos": { "…": "…" } }Filtros por jogo
| Jogo (id) | Filtros | Valores |
|---|---|---|
valorant | regiao, ranque_min, faca, skins_min, skins, nivel_min, telefone, com_email, inativa_dias | regiao: 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. |
fortnite | skins_min, vbucks_min | Números inteiros. |
roblox | robux_min, inventario_min | Só contas com acesso ao e-mail. |
steam | tem_jogo, jogos_min, jogos_max, nivel_min, pais, premier_min, inativa_dias, com_email, sem_vac, nao_limitada, steam_guard | tem_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. |
r6 | r6_ranque_min, r6_nivel_min, r6_operadores_min, r6_skins_min | r6_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. |
lol | regiao, elo_min, nivel_min, skins_min, campeoes_min, skins, telefone, com_email, inativa_dias | regiao: 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. |
genshin | regiao, nivel_min, cinco_estrelas_min, armas_5_min, personagens_min, constelacoes_min, gemas_min, personagens, com_email, inativa_dias | regiao (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). |
brawlstars | trofeus_min, brawlers_min, lendarios_min, hipercargas_min, ranqueado_min, brawlers, telefone, com_email, inativa_dias | ranqueado_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). |
clashroyale | trofeus_min, nivel_min, campeoes_min, evolucoes_min, telefone, com_email, inativa_dias | nivel_min: nível do Rei. campeoes_min: cartas campeão. evolucoes_min: cartas evoluídas. |
rocketleague | horas_min, jogos_min, compras_rl, troca_email, com_email, inativa_dias | Contas 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. |
ea | nivel_min, apex_ranque_min, jogos_min, assinatura, com_email | nivel_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
| status | O que significa | O que fazer |
|---|---|---|
comprando | Estamos comprando a conta no fornecedor. | Consulte de novo em 5 s. |
entregue | Pronto: os dados estão em entrega. | Envie ao seu cliente. |
devolvido | Não deu para entregar; o valor voltou para o seu saldo (valor_devolvido). | Escolha outra conta. |
em_analise | Algo saiu do normal e a equipe está olhando. O valor não se perde. | Aguarde ou fale com o suporte. |
cancelado | A compra não começou (ex.: saldo insuficiente). | Nada foi cobrado. |
Exemplo completo (Node.js 18+)
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.
// 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.
// 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
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
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
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.
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.
| Evento | Quando |
|---|---|
pedido.entregue | A conta foi entregue. O pedido vem completo, com login e senha em entrega. |
pedido.devolvido | Não deu para entregar e o valor voltou para o seu saldo (valor_devolvido). |
pedido.em_analise | A compra saiu do normal e a equipe está olhando. O valor não se perde. |
recarga.paga | Uma 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).
{
"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.
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
| Data | O que mudou |
|---|---|
| 14/11/2026 | Status 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/2026 | Webhooks 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/2026 | v1: 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.