Minecraft server status API: fields, caching, and evidence windows
Treat each response as bounded evidence, branch on the canonical evidenceCode, and turn expired or ambiguous results into Unknown.
- Last verified
- Evidence cutoff
Direct answer: evidenceCode is the canonical machine-readable meaning of a server observation. verdict is the closed display class derived from that code. Keep observedAt and validUntil with the result, and after validUntil show Unknown until fresh evidence arrives. Latency, player counts, MOTD text, and unknownReason do not override that rule.
This page describes the public MinecraftStatus API as reviewed on 2026-07-21. The field tables below follow the same response shapes served by the API; when a contract changes, the live API protocol sheet is the current reference.
Public endpoint register and limits
The API protocol sheet and the response examples below use the same endpoint register.
Use the interactive checker when a person needs the same server observation with interpretation rather than raw JSON.
| Methods | Path | Output | Limit |
|---|---|---|---|
GET, OPTIONS | /api/status/java/{address} | minecraftstatus-server-status/java-unversioned | 20 requests per 60 seconds per client |
GET, OPTIONS | /api/status/bedrock/{address} | minecraftstatus-server-status/bedrock-unversioned | 20 requests per 60 seconds per client |
GET, OPTIONS | /api/services | minecraftstatus-service-view/v2 | 60 requests per 60 seconds per client |
GET | /api/health | minecraftstatus-health/v2 | Unlimited |
GET | /api/v1/community/status | minecraftstatus-community-status/v1 | Unlimited |
Java and Bedrock consume one shared server-probe budget. A server-route 429 means no outbound check ran for that rejected request; it does not mean the target server is Offline. /api/services, /api/health, and the community heartbeat read local state on the request path rather than probing an upstream service.
Server evidence fields
Every successful Java or Bedrock server response includes these common fields:
| Field | Contract |
|---|---|
verdict | online, offline, or unknown; derived from evidenceCode |
evidenceCode | Canonical closed transport meaning; branch integrations on this field |
host, port | Parsed public request identity, not a private resolved address or connect target |
latency | Completed observation time in milliseconds, or null when not applicable |
observedAt | RFC 3339 timestamp for the observation |
validUntil | RFC 3339 evidence boundary; after it passes, the effective state is Unknown |
method | Network action that produced the observation |
unknownReason | Deprecated human compatibility copy, present only for Unknown and derived from evidenceCode |
The closed server evidence mapping is:
evidenceCode | verdict |
|---|---|
status_response | online |
connection_refused | offline |
timeout | unknown |
closed_without_status | unknown |
connection_reset | unknown |
dns_unresolved | unknown |
outbound_capacity | unknown |
invalid_frame | unknown |
invalid_payload | unknown |
rate_limited | unknown |
internal_error | unknown |
Only connection_refused from an admitted target means Offline. Silence, timeouts, resets, malformed data, DNS ambiguity, capacity limits, and internal failures remain Unknown. unknownReason is display copy, not a second taxonomy.
Java response shape
Java adds:
| Field | Contract |
|---|---|
version.name, version.protocol | Advertised Java version name and protocol number |
players.online, players.max, players.sample | Advertised counts and bounded sample array |
motd.raw, motd.clean, motd.html | Raw, plain, and sanitized presentation forms |
favicon | Sanitized PNG data URL or null |
{
"verdict": "online",
"evidenceCode": "status_response",
"host": "java.example",
"port": 25565,
"latency": 42,
"observedAt": "2026-07-21T12:00:00.000Z",
"validUntil": "2026-07-21T12:00:30.000Z",
"method": "java-status-handshake",
"version": { "name": "1.21.8", "protocol": 772 },
"players": { "online": 12, "max": 100, "sample": [] },
"motd": { "raw": "Contract fixture", "clean": "Contract fixture", "html": "Contract fixture" },
"favicon": null
}The version, player, MOTD, and favicon values are server advertisements. Read the Java status response guide before presenting them as more than that.
Bedrock response shape
Bedrock has the same common evidence fields, version object, player object, and MOTD forms. It adds gamemode and serverId; it does not include the Java favicon field.
{
"verdict": "online",
"evidenceCode": "status_response",
"host": "bedrock.example",
"port": 19132,
"latency": 42,
"observedAt": "2026-07-21T12:00:00.000Z",
"validUntil": "2026-07-21T12:00:30.000Z",
"method": "bedrock-raknet-unconnected-ping",
"version": { "name": "1.21.100", "protocol": 776 },
"players": { "online": 12, "max": 100, "sample": [] },
"motd": { "raw": "Contract fixture", "clean": "Contract fixture", "html": "Contract fixture" },
"gamemode": "Survival",
"serverId": "123456789"
}Caching and validUntil
Apply these rules in order:
Cache the complete observation, including
evidenceCode,observedAt, andvalidUntil.While the evidence window is current, branch on
evidenceCodeor the derivedverdict.After
validUntil, treat Online, Offline, and every other prior state as Unknown until a fresh response arrives.Do not poll faster than the returned evidence window. Repeated callers can share one bounded cache entry and one in-flight check.
Keep edition and address identity in the cache key. Java and Bedrock are different protocols even though they share a client quota.
Treat
429, capacity failure, malformed timestamps, and failed refreshes as Unknown—not Offline and not proof of an outage.
The Online, Offline, and Unknown guide covers the display meaning. The latency guide explains why a status round trip is not gameplay tick performance.
HTTP response policy
| Path | GET status | Cache-Control | CORS origin | OPTIONS |
|---|---|---|---|---|
/api/status/java/{address} | 200 | private, no-store | * | 204 |
/api/status/bedrock/{address} | 200 | private, no-store | * | 204 |
/api/services | 200 | private, no-store | * | 204 |
/api/health | 200 | no-store | none | none |
/api/v1/community/status | 200 | private, no-store | none | none |
Successful server and service responses emit X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. Rejected quota requests emit Retry-After; these headers describe the client budget and never change a target verdict.
Local health and community response shapes
/api/health uses the response shape below. The live release, uptime, and time values change at runtime.
{
"schemaVersion": 2,
"contract": "minecraftstatus-health/v2",
"status": "ok",
"domain": "minecraftstatus.com",
"service": "minecraftstatus",
"release": "contract-fixture",
"uptimeSeconds": 42,
"time": "2026-07-21T12:00:00.000Z",
"components": {
"website": { "status": "online", "release": "contract-fixture" },
"discordBot": { "status": "unknown", "release": null, "observedAt": null }
}
}/api/v1/community/status fails closed to this private, no-store Unknown envelope when no admitted local heartbeat exists:
{
"schemaVersion": 1,
"contract": "minecraftstatus-community-status/v1",
"status": "unknown",
"release": null,
"observedAt": null,
"validUntil": null
}/api/services: 13 scoped rows
/api/services returns minecraftstatus-service-view/v2 with snapshotStatus, generatedAt, validUntil, and exactly 13 ordered components. Each component exposes id, label, sourceKind, outcome, state, evidenceCode, timestamps, latency, evidence scope, limitation, and an optional reference URL.
Four evidence sources are enabled:
| Row | Source | Evidence window | Evidence scope | Limitation |
|---|---|---|---|---|
launcher_versions | Launcher version distribution | 180 seconds | The official manifest endpoint returned a coherent current version manifest to this host. | Distribution metadata only; no game version was downloaded or launched. |
minecraft_public_keys | Minecraft public keys | 180 seconds | The public-key endpoint delivered the required parseable key sets to this host. | Key delivery and parseability do not establish an arbitrary signature or trust chain. |
microsoft_identity_discovery | Microsoft identity discovery | 180 seconds | The consumer OIDC discovery document advertised the pinned issuer and endpoints. | No authorization, consent, login, device code, or token exchange occurred. |
playfab_official_status | PlayFab official status | 120 seconds | This row repeats the fresh official PlayFab summary and pinned Authentication and Xbox Live component states. | This is the official PlayFab report, not a global Minecraft verdict. |
The other 9 explicit not-collected rows return state: "not-collected", outcome: "not-collected", and evidenceCode: "collector_disabled" with null observation timestamps:
| Row | Evidence scope | Limitation |
|---|---|---|
mojang_identity_lookup | The versioned anonymous contract exists, but no public identity is approved or loaded. | No identity lookup is scheduled. |
java_signed_profile | The versioned contract exists, but no approved identity is queried. | Signature presence is not signature verification. |
skin_texture_delivery | No identity-derived texture reference is fetched. | No player texture availability claim is made. |
xbox_network_status | Nothing is inferred; the first-party status page is linked only. | The support page is not scraped or converted into evidence. |
microsoft_xbox_minecraft_auth | No OAuth, Xbox user-token, XSTS, or Minecraft-token work is performed. | Authenticated flows are outside this anonymous collector. |
minecraft_entitlement_profile | No entitlement or authenticated account profile is read. | No account-level conclusion is made. |
java_authenticated_join | No controlled login, play-state packet, acknowledgment, or clean disconnect is attempted. | Third-party servers are never joined for service monitoring. |
minecraft_realms_metadata | No authenticated Realm list or metadata is read. | An absent collection is not a Realms outage. |
bedrock_authenticated_join | No Bedrock entitlement, RakNet, login, encryption, resource-pack, or play-state flow is attempted. | No Bedrock platform conclusion is made. |
Anonymous synthetic failures stay Unknown. They cannot publish degraded or outage. Only the official PlayFab row can provide a scoped degraded or outage state, and that state describes the official PlayFab report within the row's stated scope. The services array is not an overall Minecraft health verdict, and clients must not aggregate it into one.
If the local service snapshot is missing, invalid, stale, or belongs to another release, enabled rows fail closed to Unknown while disabled rows remain explicitly not collected.
Integration checklist
Call the endpoint for the correct edition and retain the address form used for the request.
Branch server UI on canonical
evidenceCode; useverdictas its closed display class.Store and display
observedAtandvalidUntilbeside any status badge.Replace expired evidence with Unknown before rendering or alerting.
Treat service rows independently and retain each row's
evidenceScopeandlimitation.Respect the shared 20-per-60-second server budget and the 60-per-60-second services budget.
Keep private resolution and connect targets out of logs and public responses.
Contract version
This guide covers contract version 1, reviewed on 2026-07-21. Use the live API protocol sheet for current endpoint schemas and limits.