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 with no code at all. 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.
- Install NuVotifier on your server (or proxy) and restart it once so it writes its config.
- Open TCP port
8192(or the port in itsconfig.yml) to the internet. Your hosting panel may call this an extra port allocation. - In your listing's dashboard, open Integrations → Votifier rewards, enter the host and port, and paste the token from
plugins/Votifier/config.yml(undertokens: default). Classic Votifier v1 works too: choose v1 and pastersa/public.keyinstead. - 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: a real vote for the player you name goes to your server, and the dashboard shows whether it was accepted, and why not if it was not.
0.0.0.0: Discordium never shares voters' IP addresses. Votes that name no player are still counted, just not sent to Votifier.| Vote field | Type | Required | Description |
|---|---|---|---|
| serviceName | string | - | Discordium, always. |
| username | string | - | The Minecraft name the voter entered. Bedrock players via Floodgate may carry its prefix. |
| address | string | - | 0.0.0.0, always. |
| timestamp | number | - | When the vote was cast, in milliseconds since the epoch. |
Delivery is at most once per vote: a vote is never sent twice, so a reward is never granted twice. A delivery that fails (your server was offline) is shown in the dashboard and not retried later. If you need a guarantee, check votes from your plugin as well; the next section shows how.
Vote checks by player name
A plugin knows players, not Discord accounts. On a Minecraft listing, the vote check takes the player name a voter entered, as well as the Discord user ID every listing supports. 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"
}
}| Field | Type | Required | Description |
|---|---|---|---|
| data.game | string | - | minecraft, fivem, roblox or hytale. |
| data.playerName | string | null | - | The Minecraft player to reward; null when the voter named none, and for other games. |
| data.nextVoteAt | string | - | 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.