Guides / Commands & Data

Player heads by username: how the profile component works and why heads go blank

A head stores a skin snapshot, not a live link. Here is the profile component, why an old head shows the wrong skin, and how UUID lookup fits in.

Giving a player's head sounds like it should be one argument. It is, but what gets stored is not what people expect, and that explains most head-related oddities.

The command

/give @p player_head[profile="Notch"]

The profile component replaced the old SkullOwner NBT. Snippets using {SkullOwner:"Notch"} are pre-1.20.5 and do nothing now.

What actually gets stored

A head does not store a username and fetch the skin later. When the head is created, the server resolves the name to a UUID and a texture snapshot, and bakes that into the item:

"profile": {
  "name": "Notch",
  "id": [I; …],
  "properties": [{ "name": "textures", "value": "<base64>" }]
}

Two consequences:

  • A head made a year ago shows that year's skin. The player changing their skin does

not update heads already in the world. This is not a bug and there is no refresh.

  • Heads work offline. Once baked, no Mojang API call is needed to render one, which

is why heads survive on offline-mode servers while /give ... profile="Name" does not resolve there.

Why a head is blank or shows Steve

In order of likelihood:

  1. The name did not resolve. Offline-mode server, or the API was unreachable when the

command ran. Nothing to bake, so you get a default.

  1. The name does not exist. Mojang returns nothing for deleted or never-registered

accounts.

  1. Chunk not reloaded. The head resolves asynchronously; occasionally you need to look

away and back.

Waiting rarely helps — if the profile was not baked at creation, it stays empty. Re-give the head.

Custom heads use the texture, not a name

Decorative heads — furniture, food, mob heads from catalogues — have no owner. They carry only the properties texture value with a base64 blob pointing at a texture URL. That is why they are shareable as a single long give command and why they never break when a player renames.

The base64 decodes to a small JSON containing a textures.SKIN.url on textures.minecraft.net. Nothing else in it matters for rendering.

UUID formats

Two forms exist and they are not interchangeable in every context:

trimmed   069a79f444e94726a5befca90e38aaf5
dashed    069a79f4-44e9-4726-a5be-fca90e38aaf5

Commands and NBT generally want the dashed form or an integer array. Web APIs usually return trimmed. Converting between them is mechanical — insert dashes after 8, 12, 16 and 20 characters.

Give a head from a username, browse decorative head catalogues, or convert between UUID formats in the Player Head & Username Tools.

Open the Player Head & Username Tools →

More guides

Browse all →

Looking for more Minecraft tools?

A suite of client-side generators, viewers and converters — all free, all in your browser.