Skip to content

API and webhooks

Reward your players when they vote for your game, and show your GameVote stats in your game, website or bot.

  1. Claim or create your game's page.
  2. Get your API token from My games.
  3. 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.

RequestAccessPurpose
GET /api/v1/games/{id|slug}PublicPage, votes, average rating
GET /api/v1/games/{id|slug}/check?user=<discord_id>TokenHas the player voted in the last 12 hours?
GET /api/v1/games/{id|slug}/votesTokenLast 100 valid votes
POST /api/v1/games/{id|slug}/statsTokenSend {"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.

Add the bot to DiscordYou need the "Manage Server" permission on the chosen server.
/voteDirect vote, with a reminder 12 h later
/game · /top · /trendingGame page and rankings
/profileA member's GameVote profile
/followAnnounces your new posts in a channel ("Manage Server")
/dealsCurrent Steam sales and free Epic games
/releasesUpcoming releases
/voter-roleRole given automatically to your game's voters ("Manage Server")
/recapWeekly 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.

  1. Invite the GameVote bot to your server.
  2. Create a role (e.g. "Voter") and put the bot's role above it in the server settings.
  3. Type /voter-role set with your game and that role ("Manage Roles" permission required).

/voter-role status to check, /voter-role off to stop.