Minecraft API for player, skin and server data
One REST API for Java and Bedrock Edition. Resolve a profile, UUID or XUID, render a skin, or ping a server - try it right here, then copy the request into your code.
Look up a player profile, UUID and XUID
API requests served
Java & Bedrock
Both editions, one set of endpoints
12 endpoints
Profiles, renders, server status
What the API gives you
One HTTP call replaces the Mojang session server, the Xbox Live lookup and a server pinger.
High availability
Every document is cached and timestamped. Cached lookups keep answering while Mojang or Xbox Live is slow, and the API reports upstream trouble as 503 instead of guessing.
Java and Bedrock in one API
The same routes serve both editions - edition is a path parameter, not a second product. Bedrock results carry the XUID next to the UUID.
Callable from anywhere
Plain GET endpoints with open CORS, so a Discord bot, a server plugin and a browser page can all read from the same URL.
Skin renders as PNG
Face, head, bust and full-body renders straight from a URL. Drop it into an img tag, size it from 8 to 1024 pixels, done.
Server status and favicons
Ping any Java or Bedrock address for MOTD, version, protocol, player counts and the server icon. Offline hosts answer with a result, not an error.
Described by OpenAPI
The whole surface is published as an OpenAPI 3.1 document. This site's reference is generated from that file, so it cannot drift.
Two minutes to your first request
No client library to install. Point any HTTP client at the base URL and read the JSON. Every endpoint in the reference ships the same four samples.
Browse all 12 endpoints or grab the OpenAPI document.
curl -s "https://mc-api.io/profile/bef1d0a8-e281-4f69-9200-64e07c235c96"const response = await fetch("https://mc-api.io/profile/bef1d0a8-e281-4f69-9200-64e07c235c96");
if (!response.ok) { const { message } = await response.json(); throw new Error(message);}
const profile = await response.json();console.log(profile);import requests
response = requests.get("https://mc-api.io/profile/bef1d0a8-e281-4f69-9200-64e07c235c96", timeout=10)response.raise_for_status()
profile = response.json()print(profile)HttpClient client = HttpClient.newHttpClient();HttpRequest request = HttpRequest.newBuilder(URI.create("https://mc-api.io/profile/bef1d0a8-e281-4f69-9200-64e07c235c96")).build();
HttpResponse<String> response = client.sendAsync(request, BodyHandlers.ofString()).join();System.out.println(response.body());Every endpoint at a glance
Generated from the live OpenAPI document. Base URL https://mc-api.io.
Profile
Get profile information for a player by their uuid, xuid or name.
Render
Render a player's skin by their uuid, xuid or name. A player without a usable skin is served the fallback render of the requested type, so these endpoints always answer with an image.
Server
Get information about a server by host and port.
Frequently asked questions
Still stuck? The endpoint reference documents every parameter and status code.
Can I call the API from the browser?
Yes. Every endpoint is a plain GET request and CORS is open, so browser code can read from it directly. The render endpoints answer with an image, which means a URL can go straight into an img tag.
Does it work for Bedrock players?
Yes. Pass BEDROCK as the edition path parameter, or look a player up by their XUID. Bedrock results include both the XUID and the UUID derived from it, and skin renders work for Bedrock players too.
What is an XUID and how does it relate to a UUID?
An XUID is the numeric Xbox Live account id every Bedrock player has. The API also derives a Minecraft-style UUID from it, which always starts with a long run of zeros - that is how you tell a Bedrock UUID from a Java one.
How fresh is the data?
Every JSON document carries a cachedAt timestamp in epoch milliseconds telling you exactly when the API last fetched it upstream. Renders are served with a one day cache header.
What happens when a Minecraft server is offline?
The server endpoint answers with HTTP 200 and online set to false, together with the hostname and port it tried. An offline server is a result, not an error, so you do not need to treat it as a failed request.
What do the error responses look like?
Failures return a JSON body with error set to true, a human readable message and, where available, a cause such as ProfileNotFoundException. A 503 means an upstream service such as Mojang or Xbox Live is unavailable, not that your request was wrong.