API and webhooks
Reward your players when they vote for your game, and show your GameVote stats in your game, website or bot.
- Claim or create your game's page.
- Get your API token from My games.
- Connect your webhook URL: every vote is sent to you in real time.
Vote webhook
On every valid vote, GameVote sends a JSON POST to your URL. Reply 200 within 5 seconds, otherwise delivery is retried twice (after 30 s, then 5 min). Use id to ignore duplicates.
{
"id": "0b5c…",
"type": "vote.create",
"game": { "id": 12, "slug": "my-game" },
"user": { "discord_id": "123456789012345678" },
"weekend": false,
"created_at": "2026-10-09T12:00:00.000Z"
}Headers: X-GameVote-Timestamp, X-GameVote-Signature (sha256= followed by the HMAC-SHA256 of timestamp.body with your secret) and X-GameVote-Event-Id.
Receiving example (Node.js)
// Node.js: receive a vote and reward the player
import crypto from "node:crypto";
app.post("/hooks/vote", express.raw({ type: "application/json" }), (req, res) => {
const ts = req.header("x-gamevote-timestamp");
const sig = req.header("x-gamevote-signature");
const expected = "sha256=" + crypto.createHmac("sha256", process.env.GAMEVOTE_SECRET)
.update(ts + "." + req.body.toString()).digest("hex");
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return res.sendStatus(400); // replay
if (!ts || !sig) return res.sendStatus(400);
if (sig.length !== expected.length || !crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
return res.sendStatus(401);
}
res.sendStatus(200); // reply fast
const event = JSON.parse(req.body.toString());
giveReward(event.user.discord_id, event.weekend ? 2 : 1); // then process
});REST API
Authentication: header Authorization: Bearer <token>. Limit: 120 requests per minute per token.
| Request | Access | Purpose |
|---|---|---|
GET /api/v1/games/{id|slug} | Public | Page, votes, average rating |
GET /api/v1/games/{id|slug}/check?user=<discord_id> | Token | Has the player voted in the last 12 hours? |
GET /api/v1/games/{id|slug}/votes | Token | Last 100 valid votes |
POST /api/v1/games/{id|slug}/stats | Token | Send {"players":1200,"servers":15} |
Embeddable badge
An always up-to-date image for your website, Steam page or README: it shows your votes or monthly rank and links to your page. Your game's exact code is in its page management panel.
<a href="https://www.gamevote.fr/games/YOUR-GAME">
<img src="https://www.gamevote.fr/badge/YOUR-GAME.svg" alt="Vote on GameVote">
</a>Variants: ?style=votes (monthly votes, default), ?style=rank (monthly rank), ?style=vote ("Vote for us"). Add lang=en for the English version. The image refreshes every 10 minutes.
GameVote Discord bot
Add the bot to your community's server: your players vote without leaving Discord, get a DM reminder when they can vote again, and your news is announced automatically.
/vote | Direct vote, with a reminder 12 h later |
/game · /top · /trending | Game page and rankings |
/profile | A member's GameVote profile |
/follow | Announces your new posts in a channel ("Manage Server") |
/deals | Current Steam sales and free Epic games |
/releases | Upcoming releases |
/voter-role | Role given automatically to your game's voters ("Manage Server") |
/recap | Weekly recap every Monday: top of the week, releases and deals ("Manage Server") |
Voter role on your server
Reward your community: the bot gives a role to members of your server who voted for your game this month (on the website or on Discord), and removes it the following month. Updated every 10 minutes, instantly for votes made with the bot.
- Invite the GameVote bot to your server.
- Create a role (e.g. "Voter") and put the bot's role above it in the server settings.
- Type /voter-role set with your game and that role ("Manage Roles" permission required).
/voter-role status to check, /voter-role off to stop.