Skip to content
All documentation pages

Mob renders: every mob from one URL

Render any Minecraft mob as a transparent PNG from the /render/mob/ path: body or head, every pose and variant, camera angles, parameters, errors and caching.

The URL

Mobs are rendered by the same rasteriser as players, from a path of their own. There is no identifier to resolve: a mob is a model in this codebase, not a person with a profile, so the name in the URL is the whole subject.

http
GET https://skinrender.dev/render/mob/<mob>/<type>?<parameters>
→ 200 OK, Content-Type: image/png

GET /render/mob/<mob> without a type redirects to the body render, the way /render/<id> does for a player. HEAD and OPTIONS work; nothing accepts POST.

text
https://skinrender.dev/render/mob/creeper/body
https://skinrender.dev/render/mob/creeper/head?size=128
https://skinrender.dev/render/mob/creeper/body?pose=hiss&bg=1e1e2e
A Minecraft creeper rendered with the body type. The default body render.
/render/mob/creeper/body?size=320 The default body render.
A Minecraft creeper rendered with the head type. The head alone, square.
/render/mob/creeper/head?size=128 The head alone, square.
A Minecraft creeper rendered with the body type. A named pose: reared up an instant before the bang, head tipped back.
/render/mob/creeper/body?size=320&pose=hiss A named pose: reared up an instant before the bang, head tipped back.

Render types

Two, both drawn in 3D. There is no flat layout of a mob texture, because a mob's texture is an implementation detail of this renderer rather than a file anyone owns.

TypeWhat you getDefault canvas
bodyThe whole model, posed, with an optional drop shadow.512 px high; the width follows the mob's own aspect ratio.
headThe head alone, square, for icons and lists.256 × 256 px.

size is the height in pixels, from 8 to 1024. A body render is as wide as the mob is, so the canvas size=512 produces is not the same shape from one mob to the next; the table at the bottom gives every mob's ratio. Pass width and height to set both yourself.

Parameters

A mob render is the same camera, the same output settings and the same lighting as a player render, so those parameters are not copies of the player ones — they are the same specifications, parsed by the same code, with the same defaults and the same error messages. The parameter reference is therefore authoritative for all of them.

Two parameters, pose and variant, accept values that depend on which mob is being rendered, so they are documented per mob: every mob's page carries its own table. They are also the reason the parser reads them before anything else — the shared table cannot say what a valid value is.

Everything a mob has no notion of is ignored, not rejected: the skin layer toggles, cape and capeAngle, model, default and the per-joint rotations mean nothing here, so sending them changes nothing and their names come back in the X-Ignored-Params response header. That is deliberate: a template that builds player URLs can point at a mob without being rewritten first.

A mob has no joints you can address individually. The rigs differ from mob to mob — four legs here, wings there — so there is no fixed set of names to expose; pose is the whole posing interface.

Angles are the camera's job instead. Each mob sets its own default yaw and pitch, the three-quarter view it reads best from, and any value you pass replaces it: yaw=90&pitch=0 is a flat side profile, yaw=0 the front and yaw=180 the back. Every mob's page shows those three views.

text
https://skinrender.dev/render/mob/creeper/body?yaw=90&pitch=0

pose

Every mob answers to default and walk, so a URL written for one mob keeps working when you point it at another. Beyond those two the names belong to the mob, and the inventory lists each one's. A name another mob owns is a 400 listing the ones this mob accepts, never a silently wrong picture.

Poses marked as cycles take frame=0..1 to pick the phase, exactly as a player's walk does, and fit=false should go with it so the camera does not rescale between frames. See animation.

text
https://skinrender.dev/render/mob/creeper/body?pose=walk&frame=0.25&fit=false&size=256

variant

A colour or breed of the same rig. The first name in a mob's list is what a URL without the parameter renders. A mob with a single look has no variant at all, and passing one is a 400 saying so rather than being quietly ignored — a misspelt variant that rendered the default would be a picture that looks right and is wrong.

For example, creeper has normal and charged:

text
https://skinrender.dev/render/mob/creeper/body?variant=charged

Animated mobs

A body render of a pose the mob declares as a cycle can be returned as one animated PNG rather than a still, with format=apng or a .apng ending, and the same frames, fps and loop a player animation takes.

text
https://skinrender.dev/render/mob/creeper/body.apng?pose=walk
https://skinrender.dev/render/mob/creeper/body?pose=walk&format=apng&frames=24&fps=24

Which of a mob's poses cycle is listed on its own page and in the table below. A head render cannot be animated. Animated renders covers the parameters in full.

Errors

Plain text with a status code, never a PNG that looks like an error.

StatusWhen
404The mob does not exist. The body names every mob that does, and points out that a player whose name happens to sit there is rendered from /render/<uuid>/<type> instead.
400An unknown render type, a pose this mob does not have, a variant it does not have (or any variant when it has none), or a shared parameter outside its range.

There is no fallback for a mob and there cannot be one: an unknown name has no sensible substitute, and rendering some other mob instead would be worse than an error. Unlike a player render, which falls back to Steve rather than break an <img>, a mob URL is either right or a 404.

Caching

A mob render depends on nothing but its URL — no profile, no texture fetched from anywhere, nothing that can change underneath it — so it is immutable in the strict sense of the word, and is served that way:

http
Cache-Control: public, max-age=31536000, immutable
ETag: "…"
X-Mob: <mob>/<variant>
Access-Control-Allow-Origin: *
  • Cache-Control: public, max-age=31536000, immutable — a year, and browsers will not revalidate it at all. Player renders get an hour, because a player can change their skin; a mob cannot.
  • An ETag over everything that affects the pixels. Send it back as If-None-Match for a 304 with no body.
  • X-Mob reports which mob and which variant were drawn, which is how you check that a variant you passed was the one that arrived.
  • X-Cache is HIT or MISS and X-Render-Ms is the render time, as on every other image on this site.

Because the URL is the cache key end to end, the honest advice is the same as everywhere else here: store the URL, not the file.

Every mob

12 mobs, each with its own page of live renders and its own parameter table. The list is generated from the registry, so it is the list the server will answer to. Aspect is width ÷ height of a body render; height is the model standing in its default pose, in model pixels and in blocks of 16.

MobPathPosesVariantsAspectHeight
Creeper /render/mob/creeper/ default, walk, hiss, look normal, charged 0.5 26 px, 1.63 blocks
Zombie /render/mob/zombie/ default, walk, lunge, look normal, husk, drowned 0.56 32 px, 2 blocks
Skeleton /render/mob/skeleton/ default, walk, aim, look normal, wither 0.38 32 px, 2 blocks
Spider /render/mob/spider/ default, walk, rear, look normal, cave 1.88 12.6 px, 0.79 blocks
Enderman /render/mob/enderman/ default, walk, scream, carry normal, holding 0.33 46 px, 2.88 blocks
Slime /render/mob/slime/ default, walk, hop, squash normal, magma 1.1 12 px, 0.75 blocks
Pig /render/mob/pig/ default, walk, graze, look normal, saddled 1.15 16 px, 1 block
Cow /render/mob/cow/ default, walk, graze, look normal, mooshroom 0.85 26 px, 1.63 blocks
Sheep /render/mob/sheep/ default, walk, graze, look white, black, pink, sheared 0.87 22.6 px, 1.41 blocks
Chicken /render/mob/chicken/ default, walk, flap white, brown 0.74 15 px, 0.94 blocks
Wolf /render/mob/wolf/ default, walk, sit, look wild, tamed, angry 1.07 15.5 px, 0.97 blocks
Villager /render/mob/villager/ default, walk, trade, look normal, farmer 0.38 34 px, 2.13 blocks

The mob gallery shows them all rendered, and the mob renderer guide is the shorter, less formal version of this page.