Game Servers

Minecraft, FiveM, Roblox and Hytale listings get the same developer platform as bots: an API token, vote checks and signed vote webhooks. Minecraft listings add Votifier, so a reward plugin can pay out votes without custom code. Everything is set up from your listing's dashboard, under Integrations.

Votifier (Minecraft, no code)

When someone votes for your Minecraft listing and enters the name they play under, Discordium delivers the vote to your server's Votifier listener, the same way every Minecraft server list does. Your reward plugin (VotingPlugin, SuperbVote, GAListener, …) then rewards that player.

  1. Install NuVotifier on your server (or proxy) and restart it once so it writes its config.
  2. Open TCP port 8192 (or the port in its config.yml) to the internet. Your hosting panel may call this an extra port allocation.
  3. In your listing's dashboard, open Integrations → Votifier rewards, enter the host and port, and paste the token from plugins/Votifier/config.yml (under tokens: default). Classic Votifier v1 works too: choose v1 and paste rsa/public.key instead.
  4. Tell your reward plugin about Discordium. The service name is Discordium:
# plugins/VotingPlugin/VoteSites.yml
VoteSites:
  Discordium:
    Enabled: true
    ServiceSite: 'Discordium'
    VoteURL: 'https://discordium.org/minecraft/YOUR_LISTING_ID'
    VoteDelay: 24
    Rewards:
      Commands:
        - 'eco give %player% 100'

Then press Send test vote in the dashboard. It sends a real vote for the player you name to your server and shows whether it was accepted, and if not, why.

Each player can be rewarded once per 24 hours per server, whichever Discord account votes for them. The vote's address field is always 0.0.0.0. Discordium never shares voters' IP addresses. Votes that name no player still count but are not sent to Votifier.
Vote fieldTypeRequiredDescription
serviceNamestring-Discordium, always.
usernamestring-The Minecraft name the voter entered. Bedrock players via Floodgate may carry its prefix.
addressstring-0.0.0.0, always.
timestampnumber-When the vote was cast, in milliseconds since the epoch.

Each vote is sent at most once, and failed sends are not retried. A failed send (for example, because your server was offline) shows in the dashboard. If you need every vote to arrive, also check votes from your plugin as shown in the next section.

Vote checks by player name

Minecraft listings can check by the player name a voter entered, as well as by Discord user ID. Create a token with the votes:read scope in the dashboard; it identifies your listing, so there is no “which server” parameter.

GET/webhooks/votes/check?playerName=<name>

// Has this player voted in the last 24 hours? (Paper/Spigot, Java 17+)
HttpRequest request = HttpRequest.newBuilder(URI.create(
        "https://api.discordium.org/api/v1/webhooks/votes/check?playerName="
            + URLEncoder.encode(player.getName(), StandardCharsets.UTF_8)))
    .header("Authorization", "Bearer " + System.getenv("DISCORDIUM_API_TOKEN"))
    .build();

HttpClient.newHttpClient()
    .sendAsync(request, HttpResponse.BodyHandlers.ofString())
    .thenAccept(response -> {
        JsonObject body = JsonParser.parseString(response.body()).getAsJsonObject();
        if (body.get("voted").getAsBoolean()) {
            // Bukkit API calls belong on the main thread.
            Bukkit.getScheduler().runTask(plugin, () -> giveReward(player));
        }
    });

The answer has the usual shape: voted, votedAt, nextVoteAt. Game servers use a 24-hour voting window, so voted: true means a vote in the last 24 hours. Names compare case-insensitively.

POST/webhooks/votes/check

# Up to 50 players at once, e.g. everyone online
curl -X POST -H "Authorization: Bearer $DISCORDIUM_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"playerNames": ["Notch", "jeb_"]}' \
  "https://api.discordium.org/api/v1/webhooks/votes/check"

Up to 50 names per request, answered under the names you sent. Every other game (FiveM, Roblox, Hytale) checks by Discord user ID exactly as Vote Checking describes. The budget is the same 120 checks per minute per listing.

Vote webhooks

Webhooks work as described in Vote Webhooks: signed, retried, deduplicated on eventId. For a game listing, listingType is "game" and two fields are added:

{
  "event": "vote.created",
  "version": 1,
  "eventId": "2048",
  "timestamp": "2026-08-24T18:42:03.000Z",
  "test": false,
  "data": {
    "listingId": "a7180e77-6b31-4d8a-a2b0-10619a6fffef",
    "listingType": "game",
    "userId": "876543210987654321",
    "votedAt": "2026-08-24T18:42:00.000Z",
    "nextVoteAt": "2026-08-25T18:42:00.000Z",
    "weight": 1,
    "game": "minecraft",
    "playerName": "Notch"
  }
}
FieldTypeRequiredDescription
data.gamestring-minecraft, fivem, roblox or hytale.
data.playerNamestring | null-The Minecraft player to reward; null when the voter named none, and for other games.
data.nextVoteAtstring-24 hours after votedAt.

Tokens for game listings

A game listing's token can carry votes:read and webhooks:write. stats:write is for bots: a game server's player count is read from the server itself every few minutes, so there is nothing to report. The owner and invited managers can create and rotate it; the token is shown once.