Public API

Free REST API for live Minecraft server data — status, player counts, version trends, and history. Build Discord bots, status widgets, dashboards, or launcher integrations. JSON everywhere, CORS enabled, no authentication needed to start.

REST · JSONCORS enabledNo auth requiredFree
https://minecraft-java-servers.com/api/v1

Run a hosting company? There's a separate authenticated endpoint for declaring which servers sit on your infrastructure, so your uptime gets measured independently on our hosting report — see the Fleet API docs.

Endpoints

GET/servers60s cache

Paginated list of all tracked servers with status, players, votes, version, tags, banner and description.

?type=?version=?min_players=?max_players=?requires_mods=?language=?online=?page=?per_page= (max 500)
GET/server/{id}60s cache

Everything about one server: name, IP, port, version, players, votes, types, country, uptime, banner, website, description.

GET/server/{id}/status30s cache

Live online/offline status and current player count. The right endpoint for status widgets and bots.

GET/server/{id}/history5m cachefree key required

Player-count history for charts. Needs a free key — we have watched these servers since June, and it is the one thing a live-status API cannot reproduce. Generate one below; it takes a minute.

?period=24h (5-min raw)?period=7d?period=30d (hourly buckets)
GET/trending5m cache

Top 25 fastest-growing servers by 7-day average player change.

GET/stats/versions1h cache

Minecraft version adoption across all tracked servers — server count and total players per version.

Quickstart

cURL
curl "https://minecraft-java-servers.com/api/v1/servers?type=Skyblock&per_page=10"
curl  https://minecraft-java-servers.com/api/v1/server/245/status
curl "https://minecraft-java-servers.com/api/v1/server/245/history?period=7d"
JavaScript
const res = await fetch('https://minecraft-java-servers.com/api/v1/server/245/status');
const { data } = await res.json();
console.log(`${data.players_online} players online`);
Python
import requests
r = requests.get('https://minecraft-java-servers.com/api/v1/trending')
for s in r.json()['data']:
    print(s['name'], s.get('growth_pct', '-'))

Adding a vote button for launchers & browsers

Every server object includes vote_url, a direct link to that server's vote form. If you're building a launcher, server browser or Discord bot, rendering it as a Vote button next to each server is usually worth doing for your own users: most servers pay out in-game rewards — crate keys, currency, cosmetics — for a daily vote, and players generally want them. Nothing to register for, and no key required.

JavaScript
const res = await fetch('https://minecraft-java-servers.com/api/v1/servers?per_page=10');
const { data } = await res.json();

for (const server of data) {
  console.log(server.name, server.players_online);
  // Send the player straight to the vote form for their in-game reward:
  // <a href="${server.vote_url}" target="_blank">Vote</a>
}

One vote per player per server per 1 hour. Rewards are delivered by the server's own Votifier plugin, so payout depends on the server having it configured.

Server capabilities no key required

Every server object carries what we observed in its status ping. These answer the question a launcher or server browser actually has — can this player connect, and what will they need?

requires_modsboolean or null

Branch on this, not on mod_loader. Proxies routinely advertise a Forge/FML handshake while requiring no client mods at all — of 201 servers here that announced one, only 4 needed mods. A loader claim on its own is not actionable; requires_mods is.

version_minversion_max

The client range the server accepts. Over half of all listings accept a range rather than one version, which the single version field cannot express — check a player's client against these before offering a join.

mod_list/server/{id} only

Full required-mod list with versions, from the ping's forgeData/modinfo. Up to several hundred entries on a modpack server, so it is on the detail endpoint rather than in every list response.

softwarelanguageprevents_chat_reportsenforces_secure_chat

Proxy/server software (Velocity, Paper, BungeeCord…), a best-effort ISO-639-1 guess at the MOTD language, and the chat-report flags players filter on.

activity

Whether a server is busier or quieter than its own normal for this hour of day — { "state": "hot"|"quiet", "ratio": 1.53, "expected_players": 5510 }, or null when we have no opinion.

A raw player count cannot tell you this: 50 players is thriving for one server and a collapse for another, and 4 players at 04:00 is healthy while 4 at peak means the community left. We compare against a 28-day average for that server at that hour, so the comparison is the server against itself. It is computed from months of our own snapshots, which is why a live-status API cannot produce it.

null is common and deliberate — shared-count platforms, servers under 5 players, or no baseline yet. It means "no opinion", never "normal".

null never means "no". It means we have not observed that field — a server we have not reached yet, or one that does not advertise it. Treat null as unknown, not as a negative.

Examples
# Servers a vanilla client can join, 10-50 players, online right now
curl "https://minecraft-java-servers.com/api/v1/servers?requires_mods=false&min_players=10&max_players=50&online=true"

# Modpack servers, then the exact mods one requires
curl "https://minecraft-java-servers.com/api/v1/servers?requires_mods=true"
curl  https://minecraft-java-servers.com/api/v1/server/259

# Russian-speaking communities
curl "https://minecraft-java-servers.com/api/v1/servers?language=ru"

Response format

Successful responses wrap results in data; lists add meta pagination. Errors return error.code and error.message. Rate-limit headers (X-RateLimit-Limit, X-RateLimit-Remaining, Retry-After) accompany every response.

Limits are a token bucket, not a fixed window. You hold up to 40 requests anonymously (192 with a key) and earn more back continuously at the hourly rate. So an app that opens, pulls the catalogue and checks twenty servers at once is fine — that is a burst, and bursts are what real clients do. Only sustained hammering hits the limit. If you have been idle, your bucket is full.

200 OK
{
  "data": [
    {
      "id": 245, "name": "PikaNetwork", "players_online": 8421, "status": "online",
      "url": "https://minecraft-java-servers.com/server-pikanetwork.245",
      "vote_url": "https://minecraft-java-servers.com/server-pikanetwork.245/vote?src=api",
      "activity": { "state": "hot", "ratio": 1.53, "expected_players": 5510 }, ...
    }
  ],
  "meta": { "page": 1, "per_page": 25, "total": 283, "total_pages": 12 }
}
200 success 400 bad request 404 not found 429 rate-limited 500 server error

Rate limits & keys

Anonymous
25 req/hour per IP
Nothing needed — just call the API. Bursts of up to 40 are fine (see below).
Free key
120 req/hour per IP
Create a free account, generate a key below. Unlocks /history. Counted per key and IP, so shipping one key inside an app never pools your users together.
Premium key
600 req/hour
$4.99/mo or $39/yr — your existing key upgrades automatically. Get premium access →
Partner
Custom
Need more? Talk to us — generous limits for attribution.

Create a free account or log in to generate your key.

Authenticated request
curl -H "X-API-Key: mjs_yourkeyhere" https://minecraft-java-servers.com/api/v1/servers

Build ideas

Discord status botPost live player counts to your community channel with /server/{id}/status.
Embedded widgetA card on your site with current players, ping, and a join button.
Trends tickerSurface the day's fastest-growing servers using /trending.
Version chartsVisualize /stats/versions on your launcher or hosting site.

Building something cool? Tell us — we feature community projects here.