Skip to content

Minecraft UUID lookup

One GET turns a username into a UUID, or a UUID into the current username. JSON, open to browser code, with the skin and cape hashes in the same answer.

Notch’s face rendered from the username
Notch
The same face rendered from the UUID
069a79f444e94726a5befca90e38aaf5
The same face rendered from the texture hash
texture:292009a4925b…
One player, three identifiers. The lookup below is what gets you from the first to the other two.

The endpoint

http
GET https://skinrender.dev/api/profile/Notch

{
  "uuid": "069a79f444e94726a5befca90e38aaf5",
  "name": "Notch",
  "model": "classic",
  "skinUrl": "https://textures.minecraft.net/texture/292009a4925b58f02c77dadc3ecef07ea4c7472f64e0fdc32ce5522489362680",
  "skinHash": "292009a4925b58f02c77dadc3ecef07ea4c7472f64e0fdc32ce5522489362680",
  "capeUrl": null,
  "capeHash": null
}

That is the whole API. GET /api/profile/<username or uuid>, no key, no login, no query parameters to learn. HEAD works if you only want the status, and OPTIONS answers the browser’s preflight.

What goes in the path

A username (1–16 letters, digits or underscores) or a UUID, dashed or not — 069a79f444e94726a5befca90e38aaf5 and the hyphenated form are the same request. Case does not matter going in, and the name that comes back is the profile’s own capitalisation, which is the one to display: ask for dinnerbone and you are told Dinnerbone.

The steve, alex and texture:… identifiers that the render API accepts are not profiles and answer 400 here — there is no account behind a default skin or a bare texture. Everything else about the fields: model is classic or slim (the three-pixel arms) exactly as Mojang’s profile records it, which is not always what a render draws — a body render uses slim anyway when the texture is a slim one — and skinUrl, skinHash, capeUrl and capeHash are null for a player who has never set one.

Calling it from a browser

Every response sends Access-Control-Allow-Origin: *, so page JavaScript can call this directly. That is worth spelling out, because it is the usual reason a name lookup ends up behind a proxy of your own. Mojang’s own profile service sends no Access-Control-Allow-Origin header at all, so a browser refuses to hand the response to your code, and people write a tiny backend whose only job is to forward the request. You do not need one.

js
async function uuidOf(name) {
  const r = await fetch(`https://skinrender.dev/api/profile/${name}`);
  if (r.status === 404) return null;
  if (!r.ok) throw new Error(await r.text());
  return (await r.json()).uuid;
}

Errors are plain text with an honest status: 400 for something that is not a username or a UUID (the message says what was expected), 404 for a name nobody owns, 502 when Mojang is unreachable. Never a 200 with an error inside it.

From a hash to a URL that never changes

The reason the hashes are in the answer: they turn a render URL into a permanent one. A render addressed by UUID follows the player, so the image changes the day they change their skin — usually what you want on a live profile card. A render addressed by texture:<hash> is pinned to that exact texture, skips the profile lookup entirely and is served with Cache-Control: immutable, which is what you want for a leaderboard snapshot, a forum post or anything archived.

js
const { uuid, skinHash } = await fetch("https://skinrender.dev/api/profile/jeb_").then((r) => r.json());

// follows the player: changes the day they change their skin
const live = `https://skinrender.dev/render/${uuid}/body?size=256`;

// pinned to this exact texture, cached as immutable, safe to hotlink forever
const pinned = `https://skinrender.dev/render/texture:${skinHash}/body?size=256`;

Caching and rate limits

Mojang limits how often a name can be resolved, and every third-party skin service shares that ceiling, so the answer is cached at three levels: the name-to-UUID result for an hour, the profile behind it for 15 minutes, and the HTTP response itself with Cache-Control: public, max-age=600. A page that looks up the same handful of players repeatedly never leaves the cache. If you are resolving hundreds of names in a loop, store the UUIDs once — they are permanent, which is the entire point of them — and stop asking.

The caching and limits page has the rest, including what a first, uncached request costs.

What this is not

It is a profile lookup, not a Mojang mirror. There is no name history (Mojang retired that endpoint in 2022, so nobody has it), no bulk endpoint that takes a list of names, no authentication, no writes. If you need the rendered player rather than the JSON, the render API takes the very same identifiers and hands back a PNG: faces, heads, bodies and the raw skin file.

Frequently asked questions

How do I get a Minecraft player’s UUID?

Send a GET to https://skinrender.dev/api/profile/<username>. The JSON that comes back has the uuid field, along with the profile’s canonical spelling of the name and its skin and cape hashes.

Can I go the other way, UUID to username?

Yes. The same path takes a UUID, with or without dashes, and answers with the current name. One endpoint does both directions; you never have to pick.

Does it work from browser JavaScript?

Yes. Every response carries Access-Control-Allow-Origin: *, so a fetch from a page on your own domain just works. That is usually the reason a name lookup needs a server-side proxy at all.

Can I look up a player’s previous names?

No. Mojang retired the name-history endpoint in 2022 and the data is no longer served to anyone, so no third-party API can honestly offer it either. What you can rely on is that the UUID never changes when a name does.

Is there a rate limit?

Nothing you will meet by hand. Mojang rate-limits the name lookups behind this, so answers are cached — a name for an hour, the profile for 15 minutes, and the response itself for 10 minutes — which means a page that looks up the same players over and over costs almost nothing.

  • Getting started: Render a Minecraft skin from one URL: UUID or username, all eight render types, copy-paste examples, caching and error handling. Free API docs, no key.
  • Render types: Every render type of the Minecraft skin API (face, head, bust, full body, front, back, skin and cape) with its default size, parameters and live example URLs.
  • Libraries & snippets: Use the Minecraft skin render API from HTML, JavaScript, TypeScript, Python, Java (Bukkit, Paper), PHP, Go and curl, with ETag handling for cheap revalidation.
  • Caching & limits: How the skin cache works: profiles for 15 minutes, textures for a day, rendered PNGs for an hour. Plus the headers to rely on, Mojang rate limits and errors.
  • Playground: build any of these URLs by clicking.