Integrando o voto no seu jogo
A integração funciona em duas partes: um link de voto que você abre a partir do seu jogo, e um webhook que avisamos quando o voto é confirmado.
1. O link de voto
No painel do seu jogo você encontra um link no formato abaixo. Troque PLAYER_ID pelo identificador do jogador no seu próprio sistema — não precisa ser nada especial, só algo que você reconheça depois.
https://idlerank.com/vote/seu-jogo?ref=SUA_CHAVE_PUBLICA&player=PLAYER_IDAbra esse link (num navegador embutido, numa nova aba, como preferir) quando o jogador clicar em "votar". Se ele ainda não tiver conta no IdleRank, pedimos login com Google ou Discord antes de confirmar — depois disso o voto é registrado e contabilizado no ranking.
2. O webhook
Assim que o voto é confirmado, se você tiver uma URL de webhook configurada no painel, enviamos um POST assinado para ela:
{
"event": "vote.created",
"gameId": "5b1e...",
"timestamp": "2026-08-08T20:14:03.000Z",
"data": {
"externalPlayerId": "player_123",
"voteId": "9f2a...",
"votedAt": "2026-08-08T20:14:03.000Z"
}
}A assinatura vai no header X-IdleRank-Signature, no formato sha256=<hmac hex>, calculada com o seu segredo de assinatura do webhook. Ele aparece separado da chave secreta da API e pode ser revelado no painel do proprietário. Sempre verifique a assinatura antes de confiar no payload:
// Node.js / Express — verificando a assinatura do webhook
import crypto from "crypto";
app.post("/api/idlerank-webhook", express.raw({ type: "application/json" }), (req, res) => {
const signature = req.headers["x-idlerank-signature"]; // "sha256=..."
const expected = "sha256=" + crypto
.createHmac("sha256", process.env.IDLERANK_WEBHOOK_SECRET)
.update(req.body) // Buffer cru, sem JSON.parse
.digest("hex");
const ok = signature?.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
if (!ok) return res.status(401).send("invalid signature");
const event = JSON.parse(req.body);
if (event.event === "vote.created") {
const { externalPlayerId } = event.data;
// credite a recompensa para externalPlayerId aqui
}
res.status(200).send("ok");
});Cada entrega inclui o mesmo voteId no payload, em X-IdleRank-Vote-Id e no header Idempotency-Key. Guarde esse identificador para não recompensar duas vezes caso um evento seja reenviado. Falhas transitórias são tentadas novamente com espaçamento crescente; eventos nunca entregues também podem ser reenviados pelo painel.
3. Consultando status (opcional)
Se quiser mostrar "você já votou hoje" dentro do seu próprio jogo, sem esperar o redirecionamento, use sua chave secreta para consultar:
GET https://idlerank.com/api/v1/games/seu-jogo/vote-status?player=PLAYER_ID
Authorization: Bearer SUA_CHAVE_SECRETAE para estatísticas públicas do jogo (sem autenticação), útil para mostrar sua colocação atual dentro do próprio jogo:
GET https://idlerank.com/api/v1/games/seu-jogoPor que não existe um endpoint para registrar voto direto pelo servidor?
De propósito. Se qualquer servidor pudesse creditar votos sem um jogador real passar pelo IdleRank, o ranking perderia sentido — e é o ranking que traz visibilidade pro seu jogo. O fluxo por link garante que cada voto corresponde a uma pessoa de verdade chegando até aqui.
Limites
- Cada jogador pode votar em cada jogo uma vez a cada 24 horas, ou a cada 12 horas quando Ouro ou Diamante estiver ativo.
- Webhooks têm timeout de 8 segundos e até 4 tentativas.
- URLs de webhook precisam ser HTTPS.