- NuVotifier listens on port 8192 (TCP) and receives votes from server lists.
- Give lists the v2 token from
config.yml(tokens, default) when they support it, or the v1 public key fromrsa/public.keywhen they don't. - NuVotifier only receives votes. A rewards plugin such as VotingPlugin decides what players get.
- On a Velocity or BungeeCord network, receive votes on the proxy and forward them with
pluginMessaging.
NuVotifier is a free plugin that receives votes from Minecraft server lists and passes them to your server as an event, so a rewards plugin can give the voter diamonds, crate keys or whatever you choose. It runs on Paper, Spigot and other Bukkit-based servers, on Sponge, and on BungeeCord, Waterfall and Velocity proxies, all from one jar. It's a drop-in replacement for the original Votifier (any vote listener that supports Votifier also supports NuVotifier) and speaks both the old protocol (v1, an RSA key) and the newer one (v2, a shared token).
This guide goes from an empty plugins folder to a test vote landing in game, then covers networks, reward plugins and the problems that stop votes arriving.
What happens when a player votes
It helps to picture the path, because every "votes aren't working" problem breaks one specific link in it.
- The player votes on a list. On 9MinecraftServer that's your vote page, where they type their Minecraft username. One vote per username (and per IP) every 24 hours, with no account needed.
- The list opens a connection to your server's vote port. It uses the address and port you gave it, not your game port.
- NuVotifier checks the vote is genuine. With v2, the list signs the vote with your token. With v1, it encrypts the vote with your public key.
- NuVotifier fires a vote event. It carries four things: the list's service name, the username, the voter's address and a timestamp.
- Your rewards plugin reacts. NuVotifier itself gives nothing. VotingPlugin (or a similar listener) matches the service name and runs your reward commands.
Install NuVotifier on Paper or Spigot
- Download the jar from the project's GitHub releases page (the latest release there is 2.7.3; the same universal jar covers every platform). Fabric servers have a separate community port, NuVotifier-Fabric, on Modrinth.
- Drop it into
plugins/and start the server once. NuVotifier createsplugins/Votifier/config.yml(the folder may be namedNuVotifierdepending on platform), a random token, and anrsa/folder holdingpublic.keyandprivate.key. - Open the vote port. Forward TCP 8192 on your router, or on a host, add an extra port allocation in the panel and put that number in
port. Many hosts only give you one port per server by default; you may have to ask for a second. - Restart or run
/nvreloadafter any config change. - Install a rewards plugin if you want players to get anything. More on that below.
The NuVotifier config.yml, key by key
The Bukkit and BungeeCord versions use config.yml; Velocity uses config.toml with the same settings in TOML syntax.
| Key | Default | What to set |
|---|---|---|
host | The server's own bind IP, or 0.0.0.0 | Leave as 0.0.0.0 (all interfaces) unless your host tells you to bind a specific IP |
port | 8192 | Any free port your host or router lets through. -1 turns the listener off (used on network backends) |
disable-v1-protocol | false | Keep false on a normal server so lists that only speak v1 still work. Set true on backends behind proxy forwarding |
tokens then default | A random string | The v2 token you give to lists. You can add extra lines named after a list's service name to give that list its own token |
forwarding then method | none | none on a single server; pluginMessaging or proxy on a network |
forwarding then pluginMessaging then channel | nuvotifier:votes | Leave it. Proxy and backends must match |
NuVotifier v2 token or v1 public key?
Both still exist because server lists support different things. NuVotifier accepts both at once on the same port, so you don't have to choose server-side. You choose per list.
| v1 (original Votifier) | v2 (NuVotifier) | |
|---|---|---|
| What you give the list | The contents of rsa/public.key | The token from tokens, default |
| How the vote is protected | Encrypted with your RSA public key; the only check is a "VOTE" marker after decryption | Signed with HMAC-SHA256 using your token, plus a one-time challenge from your server to stop replays |
| Security | Older; NuVotifier's own config calls it "not secure" | Better; use it wherever a list offers it |
| Common mistake | Copying the key with line breaks or extra spaces | Copying the token before the first restart, then regenerating it |
On 9MinecraftServer you pick in your listing's Vote rewards box: "NuVotifier (token)" or "Votifier (public key)". Then fill in the Votifier address (usually the same host as your game address), the Votifier port, and paste the token or key. We sign our votes with the service name 9MinecraftServer.
NuVotifier on Velocity and BungeeCord networks
On a network, players connect to the proxy and move between backend servers, but your rewards plugin usually lives on the backends. So the proxy receives the vote, then hands it to the right backend. NuVotifier supports two ways to do that.
Plugin messaging (the recommended way)
- Proxy: install NuVotifier in the proxy's
pluginsfolder. Keepporton a free port such as 8192 and forward it. Setforwarding.methodtopluginMessaging. - Every backend: install NuVotifier, set
portto-1so it doesn't listen publicly, and setforwarding.methodtopluginMessaging. - Choose what happens when the voter is offline. On Velocity,
cache = "file"saves votes to disk and delivers them later;onlySendToJoinedServerandjoinedServerFallback(for example"Hub") decide which backend gets a vote;excludedServersskips servers that shouldn't receive votes at all. - Give lists the proxy's address, port and token. Backends are never contacted directly.
The catch: plugin messages travel over a player's connection, so a backend can only receive a forwarded vote while someone is on it. That's what the cache is for.
Proxy forwarding (for complex networks)
Here the proxy re-sends each vote to other NuVotifier listeners over the network. Each backend gets its own unused port, sets disable-v1-protocol to true, and you copy each backend's default token into the proxy's forwarding.proxy section with its address, port and token. Keep those backend ports firewalled from the internet; only the proxy should reach them.
Test before you tell anyone to vote
Test in two stages so you know which half is broken.
- Local test (skips the network): run
/testvote YourNameon the server, or/ptestvote YourNameon a proxy. It needs thenuvotifier.testvotepermission, which ops have by default. You can pass a service name too:/testvote YourName serviceName=9MinecraftServer. If your rewards plugin pays out, the in-game half works. - Real test (goes over the internet): in your 9MinecraftServer listing, type your in-game name under "Test with username" and press Send a test vote. That sends a genuine vote packet from our servers to your Votifier address and port and tells you whether it got through.
If the local test works but ours fails, the problem is the port, the address or the token. If both fail, it's the rewards plugin or its service name.
Pairing NuVotifier with a voting plugin
VotingPlugin is the most common rewards plugin. Each list you're on becomes an entry in its VoteSites.yml, and the one field that has to be exactly right is ServiceSite, which must match the service name the list sends. For us, an entry looks like this:
NineMC:(the entry key; VotingPlugin wants no spaces or dots)Enabled: trueName: '9MinecraftServer'ServiceSite: '9MinecraftServer'VoteURL: 'https://9minecraftserver.com/server/your-server/vote'VoteDelay: 24hRewards:with yourCommandsandMessages
Not sure what name a list sends? Vote once and read the console: VotingPlugin logs a warning when it gets a vote whose service name doesn't match any site. On a network, the plugin's own config comments recommend receiving votes on the proxy and processing rewards on the backends, with the same VoteSites.yml on each backend.
Don't want a full rewards plugin, or building your own? Our free API has a vote check: /api/v1/servers/your-server/voted?username=Steve returns whether that player voted in the last 24 hours and when they can vote next. It's handy for a Discord bot or a custom reward script, but for normal in-game rewards NuVotifier is simpler.
Votes not arriving? Check these in order
| What you see | Likely cause | Fix |
|---|---|---|
| List says it can't connect, times out | Vote port not open, or you gave the game port instead | Forward or allocate the port from config.yml (TCP); check the list has that number, not 25565 |
| Connects, but console shows a signature or token error | Token mismatch | Copy tokens.default again after a restart; no quotes, no spaces |
| Console: "Could not decrypt data (is your key correct?)" | The v1 public key on the list doesn't match yours | Paste the whole of public.key again as one line, with no extra spaces |
/testvote works, real votes do nothing | Service name doesn't match ServiceSite | Read the console after a real vote; copy the name exactly |
| Votes arrive only when someone's online (network) | Plugin messaging needs a player on the backend | Use cache = "file" and a fallback server |
NuVotifier breaks after /reload or PlugMan | Hot-reloading plugins | Use /nvreload for config changes and a full restart for anything else |
| Nothing in console at all | host bound to the wrong IP, or a host firewall | Set host: 0.0.0.0; ask the host to open the port |
The project's own troubleshooting guide also notes that NuVotifier itself doesn't cause lag: if votes make the server stutter, profile the reward commands with spark instead.
If your server is down when a player votes on 9MinecraftServer, the vote isn't lost immediately: we retry delivery several times over a few hours (at the time of writing, after 1, 5 and 15 minutes, then 1 hour and 3 hours) before giving up. The vote still counts toward your monthly rank either way. Ranks reset on the 1st of each month, UTC.
Once rewards work, the next job is getting people to vote at all. Our guides on getting more votes and choosing server lists and vote sites pick up from here, and how we rank explains what a vote is worth on our list.
Quick questions
Is NuVotifier still maintained?
It changes rarely. The latest GitHub release is 2.7.3 and the last code change on the main branch was in 2023. It's a small plugin that touches very little of the game, so it doesn't need frequent releases, but check the project's issues page after a big Minecraft update before you blame your config.
Do I need NuVotifier to be on a server list?
No. Votes still count for ranking without it. You only need it if you want players rewarded in game automatically.
Is NuVotifier the same as Votifier?
It's a fork of the original Votifier that keeps the v1 protocol for compatibility and adds v2 tokens, network forwarding and the test commands. Rewards plugins written for Votifier's vote event work with it.
Can I use one token for every list?
Yes, that's what default is for. For tighter control, add a separate token line named after each list's service name, so one leaked token doesn't expose the others.
