- A webhook needs no bot and no hosting: POST a JSON message to the webhook URL whenever the server changes state.
- Ready-made status bots on GitHub edit one message every 30 seconds or so; DiscordSRV can show the count in the bot's presence and a channel topic.
- Our free API returns
online,players,maxPlayers,versionand votes for your server, no key needed, so a bot never has to reach your game port. - Discord lets a channel be renamed about twice per ten minutes, so a channel-name counter is never live. Edit a message instead.
The fastest honest answer: if all you want is a Discord post when the server goes down or comes back, use a webhook and skip the bot entirely. If you want a live "37 players online" line that updates itself, run a small status bot that edits one message on a timer, or turn on DiscordSRV's presence status. A channel name that shows the count looks slick but Discord throttles renames to roughly two every ten minutes, so it will always lag.
This guide covers all four routes with the exact payloads and config keys, then a small bot you can build on our public API so it works even when your server's ports are closed to the outside. On our list, servers with a Discord link have a median of 43 players online against 9 for those without. That is a correlation, but a status channel is the first thing a new member looks at, so it is worth doing well. For the Discord itself (channels, roles, DiscordSRV setup), see the Discord guide; this one is only about status.
What players want from a status channel
Three things, in this order: is it up, how many people are on, and what version do I need. Everything else (MOTD, ping, TPS graphs) is for you, not them. A good status channel answers those three in one glance and stays quiet the rest of the time. A bad one posts every five minutes, pings everyone, and gets muted within a day, at which point it stops working as a status channel at all.
A pinned message or a short channel name. Change it only when the state changes.
A number that updates every minute or so. Message edits, not channel renames.
Static text in the same message, so nobody has to ask.
Option 1: a webhook that posts state changes
A webhook is a URL Discord gives you for one channel. Anything that can make an HTTP request can post there, with no bot account and no hosting. In Discord: channel settings, Integrations, Webhooks, New Webhook, copy the URL. Then, per Discord's webhook docs, POST JSON to it. content takes up to 2,000 characters, embeds up to 10 embed objects, and you can override username and avatar_url per message.
POST https://discord.com/api/webhooks/{id}/{token}
Content-Type: application/json
{
"username": "Server status",
"content": "play.example.net is back online",
"embeds": [{
"title": "37 of 200 players online",
"description": "Version 26.3. Vote: https://9minecraftserver.com/server/your-server/vote",
"color": 5763719
}]
}
Add ?wait=true to the URL if you want the created message back in the response (you need its id to edit it later). What calls the webhook is up to you: a start script on the server box, an uptime monitor's Discord integration, or the bot in option 4. The rule is the same either way: post when something changes, not on every check.
Option 2: a ready-made status bot
These are open source, free, and need somewhere to run 24/7 (the game server machine is fine, a tiny VPS is fine, free hosts that sleep are not). All three below query the server directly, so your game port has to be reachable from wherever the bot runs.
| Bot | What it does | Notes |
|---|---|---|
| mc-status-bot | Edits one permanent message every 30 seconds with online state, MOTD, version, ping and player count, plus a player sample | Node.js 18+, Discord.js v14, Java and Bedrock, MIT license, SQLite for state |
| minecraft-discord-bot (NooberPro) | A dynamic status message with the player list, an auto-updating player-count channel, and slash commands for IP, MOTD, players, status and version | Node.js, Discord.js, Java and Bedrock, seven languages, MIT license |
| minecraft-discord-bot (Androz2091) | Two voice channels whose names show the player count and online state, plus a stats command | Updates every 10 minutes, which its README says is the minimum Discord allows for renames |
Pick the message-editing style (the first two) unless you specifically want the voice-channel look. Whichever you pick, read the config before you run it: most want your server address, a channel id, and a bot token from the Discord Developer Portal, and the token deserves the same care as the webhook URL.
Option 3: DiscordSRV's presence and channel topic
If you already run DiscordSRV (version 1.30.5 shipped April 24, 2026) you can get status with no extra bot. In plugins/DiscordSRV/config.yml:
DiscordGameStatussets the bot's "Playing" text and accepts a list it rotates through.%online%is the number of online players, so["%online% online", "play.example.net"]shows the count next to the bot in the member list.- Channel topic updater.
ChannelTopicUpdaterRateInMinutescontrols how often DiscordSRV rewrites your linked channels' topics, with placeholders including%playercount%,%playermax%and%totalplayers%.ChannelTopicUpdaterChannelTopicsAtShutdownEnabledlets it write an "offline" topic when the server stops cleanly. - Channel names. The config's own comment on the channel-name updater says the minimum is 10 minutes "due to rate limits". That is the Discord limit from the next section, not a DiscordSRV choice.
The catch with all of this: it runs inside your server. When the server crashes, nothing updates, and the presence keeps showing the last count until Discord drops the bot. That is exactly the moment players want accurate status, which is why an outside check (option 1 or 4) is worth adding even with DiscordSRV.
Option 4: a tiny bot on our free API
We already check every listed server at least every five minutes, and every minute while its page is open. The public API exposes that, with no key, up to 120 requests a minute per address, and it allows browser calls from any site. Replace your-server with the name in your server's page address:
GET /api/v1/servers/your-server
{
"name": "Your Server",
"address": "play.example.net",
"edition": "java",
"online": true,
"players": 37,
"maxPlayers": 200,
"version": "26.3",
"votesThisMonth": 412,
"votesTotal": 9031,
"lastCheckedUtc": "2026-09-28T18:04:11Z",
"countFlag": null,
"url": "https://9minecraftserver.com/server/your-server",
"voteUrl": "https://9minecraftserver.com/server/your-server/vote"
}
Because the numbers come from our pinger, the bot can run anywhere and never needs your game port open to it. The whole bot is a timer, a fetch, and a webhook post. In Node:
const r = await fetch("https://9minecraftserver.com/api/v1/servers/your-server");
const s = await r.json();
const text = s.online
? `Online: ${s.players} of ${s.maxPlayers} players, version ${s.version}`
: "Offline right now";
await fetch(process.env.WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ content: text })
});
Run it once a minute, remember the last online value, and only post when it flips (or edit one message with the count, using the message id you got back from ?wait=true). Two more fields are useful: votesThisMonth lets a /vote command show progress, and the /voted?username= endpoint tells a bot whether a specific player has voted today (the day resets at midnight UTC), which the NuVotifier guide covers. Our own server page polls a minute-fresh variant, /api/v1/servers/your-server/live, which pings the server first if our last check is over a minute old and returns online, players, maxPlayers, countFlag, checkedUtc and ageSeconds. Use that one when a stale minute matters.
Channel-name counters and Discord's rename limit
The "Players: 37" voice channel is popular because it shows in the sidebar without anyone opening a channel. The problem is documented only by people hitting it: a discord-api-docs issue describes an unlisted limit of two channel renames per ten minutes, after which the API returns a rate-limit error. DiscordSRV's config and the Androz2091 bot both settle on ten-minute updates for that reason. So treat a channel-name counter as a slow indicator, never as live status, and keep the real number in a message that a bot edits.
Message edits are cheap by comparison. A bot editing one status message every 30 to 60 seconds is normal use, and members see the current number the moment they open the channel.
What not to spam
- Post on change, not on schedule. "Online" once, "offline" once. Never a fresh message every check.
- No @everyone for status. Save it for a real outage announcement written by a person.
- Keep joins and leaves out of the status channel. DiscordSRV can post them; put them in a separate feed people can mute.
- Do not rename channels more than twice in ten minutes. You will hit the limit, and a stuck name is worse than no name.
- Do not broadcast a flagged count. If our pinger flags your number, players will notice too.
- One bot, not three. Every bot you invite can read your server. Fewer, better-known bots is the safer setup.
Once the channel works, put the same numbers where players outside Discord can see them: your listing here shows the live count and a 7-day chart, and the status page guide covers embedding it on your own site. Claim your listing from its server page so the Discord link, description and address stay yours to edit.
Quick questions
Can a webhook read my Minecraft server?
No. A webhook only receives messages. Something else (a script, an uptime monitor, a bot) has to check the server and post to it.
Does the status bot have to run on the server machine?
No. It needs internet and a place that stays on. If it reads our API instead of pinging your server directly, it does not even need your game port to be reachable from where it runs.
Why is the count in Discord behind the real one?
Channel names update at most every ten minutes because of Discord's rename limit. Our API reflects a check made at least every five minutes, or every minute while your page is open; the /live endpoint re-checks when the data is over a minute old. Message edits every minute are as close to live as Discord gets.
Does this work for a Bedrock server?
Yes. The three bots above support Java and Bedrock, and our API returns an edition field with the same status fields for Bedrock listings.
