Skip to content
All documentation pages

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.

url
https://skinrender.dev/render/069a79f444e94726a5befca90e38aaf5/head?size=96
html
<img src="/render/069a79f444e94726a5befca90e38aaf5/head?size=96" width="96" height="96"
     alt="Notch" loading="lazy" decoding="async"
     style="image-rendering:auto;border-radius:8px">
Notch’s head as a 96 px profile picture
Live: /head

Discord 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.

url
https://skinrender.dev/render/853c80ef3c3749fdaa49938b674adae6/body?size=256&pose=wave
js
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] });
jeb_ waving, the image a Discord embed would show
Live: /body

Forum 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.

url
https://skinrender.dev/render/61699b2ed3274a019f1e0ea8c3f06bc6/body?width=468&height=120&bg=12121a&yaw=-30&offsetX=-0.35&pose=point
bbcode
[img]/render/61699b2ed3274a019f1e0ea8c3f06bc6/body?width=468&height=120&bg=12121a&yaw=-30&offsetX=-0.35&pose=point[/img]
Dinnerbone pointing, laid out as a 468×120 forum signature banner
Live: /body

Server 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.

url
https://skinrender.dev/render/steve/bust?size=96&yaw=-25
js
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
Steve as a 96 px bust for a server list card
Live: /bust

Custom 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.

url
https://skinrender.dev/render/texture:d5c4ee5ce20aed9e33e866c66caa37178606234b3721084bf01d13320fb2eb3f/body?size=256&pose=cheer
text
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
A skin rendered from its texture hash, cheering
Live: /body

Dark 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.

url
https://skinrender.dev/render/069a79f444e94726a5befca90e38aaf5/bust?size=200&bg=1e1e2e&crop=true&shading=0.8
html
<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>
Notch as a bust on a dark background, cropped to the model
Live: /bust

Perspective 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.

url
https://skinrender.dev/render/853c80ef3c3749fdaa49938b674adae6/bust?size=320&pitch=-10&fov=40&pose=think
text
https://skinrender.dev/render/853c80ef3c3749fdaa49938b674adae6/bust?size=320&pitch=-10&fov=40&pose=think
jeb_ as a perspective portrait, thinking, camera slightly below eye level
Live: /bust

Animation 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.

url
https://skinrender.dev/render/61699b2ed3274a019f1e0ea8c3f06bc6/body?size=256&fit=false&pose=run&frame=0.3&capeAngle=40
bash
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
Dinnerbone running, frame 0.3 of the cycle
Live: /body

The 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.

url
https://skinrender.dev/render/steve/body?size=256&model=slim&pose=tpose
text
https://skinrender.dev/render/steve/body?size=256&model=slim&pose=tpose
https://skinrender.dev/render/alex/body?size=256&model=classic&pose=tpose
Steve rendered with slim, 3 pixel wide arms in a T-pose
Live: /body

Download 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.

url
https://skinrender.dev/render/069a79f444e94726a5befca90e38aaf5/skin?size=64&download=true&filename=notch-skin
html
<a href="/render/069a79f444e94726a5befca90e38aaf5/skin?size=64&download=true&filename=notch-skin">Download Notch's skin</a>
Notch’s raw 64×64 skin texture
Live: /skin