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.
- 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. It sends a real vote for the player you name to your server and shows whether it was accepted, and if not, why.
0.0.0.0. Discordium never shares voters' IP addresses. Votes that name no player still count but are 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. |
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"
}
}| 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.