Examples and recipes for Minecraft skin renders
Copy-paste recipes: profile pictures, Discord bot embeds, forum signatures, server list cards, textures by hash, perspective portraits and animation frames.
Each recipe shows the URL, the code that uses it and the live image that URL produces right now. Swap the identifier for your own and you are done; see libraries and snippets for URL-builder helpers in more languages.
Profile picture on a website
A square 3D head is the most recognisable avatar for a player, and at 96 px it stays under 10 KB. Give the image explicit dimensions and lazy loading, and store the UUID rather than the name.
https://skinrender.dev/render/069a79f444e94726a5befca90e38aaf5/head?size=96 <img src="/render/069a79f444e94726a5befca90e38aaf5/head?size=96" width="96" height="96"
alt="Notch" loading="lazy" decoding="async"
style="image-rendering:auto;border-radius:8px"> /headDiscord bot embed
Discord fetches the image itself, so all a bot needs is the URL. Use the thumbnail slot for a head and the main image for a posed body. Discord caches by URL, so change a parameter (or add a harmless one) if you want it to refetch.
https://skinrender.dev/render/853c80ef3c3749fdaa49938b674adae6/body?size=256&pose=wave import { EmbedBuilder } from "discord.js";
const uuid = "853c80ef3c3749fdaa49938b674adae6";
const embed = new EmbedBuilder()
.setTitle("jeb_ joined the server")
.setThumbnail(`https://skinrender.dev/render/${uuid}/head?size=128`)
.setImage("/render/853c80ef3c3749fdaa49938b674adae6/body?size=256&pose=wave")
.setColor(0x7ee787);
await channel.send({ embeds: [embed] }); /bodyForum signature
A wide, short banner made with an explicit width and height. The body is pushed to the left with offsetX and the rest of the canvas is left for text you overlay in CSS or leave empty.
https://skinrender.dev/render/61699b2ed3274a019f1e0ea8c3f06bc6/body?width=468&height=120&bg=12121a&yaw=-30&offsetX=-0.35&pose=point [img]/render/61699b2ed3274a019f1e0ea8c3f06bc6/body?width=468&height=120&bg=12121a&yaw=-30&offsetX=-0.35&pose=point[/img] /bodyServer list card
Render several players small and let the browser lay them out. Sizes of 64 to 96 px are cheap to serve and read fine; the URL is identical for every player except the id, so a template string is all you need.
https://skinrender.dev/render/steve/bust?size=96&yaw=-25 const online = ["069a79f444e94726a5befca90e38aaf5", "853c80ef3c3749fdaa49938b674adae6", "61699b2ed3274a019f1e0ea8c3f06bc6"];
list.innerHTML = online.map((uuid) => `
<img src="https://skinrender.dev/render/${uuid}/bust?size=96&yaw=-25"
width="96" height="96" alt="" loading="lazy">
`).join("");
// /render/steve/bust?size=96&yaw=-25 /bustCustom texture by hash
If you already know a texture hash from a textures.minecraft.net URL (a plugin, a database of skins, the /api/profile/ endpoint), render it directly. No profile lookup happens, the response is cached as immutable and the result does not change if the player later switches skin.
https://skinrender.dev/render/texture:d5c4ee5ce20aed9e33e866c66caa37178606234b3721084bf01d13320fb2eb3f/body?size=256&pose=cheer https://skinrender.dev/render/texture:d5c4ee5ce20aed9e33e866c66caa37178606234b3721084bf01d13320fb2eb3f/body?size=256&pose=cheer
# The same texture on a named profile's body, e.g. to preview a skin before applying it:
https://skinrender.dev/render/069a79f444e94726a5befca90e38aaf5/body?size=256&skin=d5c4ee5ce20aed9e33e866c66caa37178606234b3721084bf01d13320fb2eb3f /bodyDark background and crop for a card
bg fills the canvas with a colour, crop trims the transparent border the auto-framing leaves. Together they produce an image that sits flush inside a coloured card with no gap.
https://skinrender.dev/render/069a79f444e94726a5befca90e38aaf5/bust?size=200&bg=1e1e2e&crop=true&shading=0.8 <div style="background:#1e1e2e;padding:12px;display:inline-block">
<img src="/render/069a79f444e94726a5befca90e38aaf5/bust?size=200&bg=1e1e2e&crop=true&shading=0.8" alt="Notch" width="200" height="200">
</div> /bustPerspective portrait
The default camera is orthographic. A field of view of 30–50 plus a slightly negative pitch (camera below eye level) gives a heroic portrait; fov above 70 becomes a caricature.
https://skinrender.dev/render/853c80ef3c3749fdaa49938b674adae6/bust?size=320&pitch=-10&fov=40&pose=think https://skinrender.dev/render/853c80ef3c3749fdaa49938b674adae6/bust?size=320&pitch=-10&fov=40&pose=think /bustAnimation frames
The animated poses accept frame from 0 to 1. Keep fit=false so the camera does not re-frame each frame, render as many steps as you want and assemble them into a GIF or a CSS sprite.
https://skinrender.dev/render/61699b2ed3274a019f1e0ea8c3f06bc6/body?size=256&fit=false&pose=run&frame=0.3&capeAngle=40 for i in $(seq 0 9); do
curl -s -o "run-$i.png" \
"https://skinrender.dev/render/61699b2ed3274a019f1e0ea8c3f06bc6/body?pose=run&fit=false&size=256&capeAngle=40&frame=0.$i"
done
# one of them: /render/61699b2ed3274a019f1e0ea8c3f06bc6/body?size=256&fit=false&pose=run&frame=0.3&capeAngle=40 /bodyThe full recipe, including a Python version, is on the poses page.
Slim or classic override
Arm width follows the profile’s own setting by default (model=auto). Force it with model=slim or model=classic, for example when you render a texture by hash and the API cannot know which model it was made for.
https://skinrender.dev/render/steve/body?size=256&model=slim&pose=tpose https://skinrender.dev/render/steve/body?size=256&model=slim&pose=tpose
https://skinrender.dev/render/alex/body?size=256&model=classic&pose=tpose /bodyDownload link
download=1 adds a Content-Disposition: attachment header so a browser saves the file instead of showing it. filename sets the name; .png is appended.
https://skinrender.dev/render/069a79f444e94726a5befca90e38aaf5/skin?size=64&download=true&filename=notch-skin <a href="/render/069a79f444e94726a5befca90e38aaf5/skin?size=64&download=true&filename=notch-skin">Download Notch's skin</a> /skin