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:
- 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.
- The name does not exist. Mojang returns nothing for deleted or never-registered
accounts.
- 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.