La actualización para creadores - Etiqueta LIVE, Streamer Mode, partner tags y 1.000 $ para streamers

Render API

Minecraft skins, capes, LabyMod cosmetics and emotes as images - for your website, bot or app.
Try it with any player

Type a Minecraft name - every preview and snippet below switches to that player.

Getting started

Quickstart#

Every render is a plain GET that answers with the image itself. No key, no sign-up, no SDK - put the URL into an <img> and you are done.
<img src="https://laby.net/api/v3/render/player/34e57efa-5783-46c7-a9fc-890296aaba1f.webp" alt="LabyStudio" />
LabyStudio

Basics#

A handful of rules that hold for every endpoint.

Base URL

https://laby.net/api/v3/render

All routes are public GET requests. The file extension picks the format: /player/{uuid}.webp, .png or .gif.

Players are UUIDs

Player routes take the Minecraft UUID, with or without dashes. Names are not accepted (400 Invalid user) - they change hands, UUIDs do not. Resolve a name first, for example with Mojang's profile API.

laby.net needs to have seen the player once; a UUID without any skin on record answers 404.

Formats

ExtensionOutput256 px
.webpTransparent, compressed. Use this on the web.≈ 9 KB
.pngLossless, transparent. Emotes: animated PNG.≈ 21 KB
.gif1-bit transparency. Emotes: animated GIF.≈ 9 KB

Emote .webp is sized as a WhatsApp sticker (512 × 512) unless you pass size.

Size & quality

width and height go from 32 to 1024 px, default 256. Every render is supersampled for smooth edges (antiAliasing), as far as a budget of 2048 sub-pixels along the longer edge allows: 4× up to 512 px, 3× up to 682 px, 2× up to 1024 px.

That is the default - there is nothing to set. Pass antiAliasing=1 for hard pixel edges.

Caching

EndpointCached for
/player/{uuid}7 days
/bust/{uuid}7 days
/player/{uuid}/cosmetics1 hour
/player/{uuid}/cosmetic/{cosmetic}1 hour
/player/{uuid}/emote/{emote}1 hour
/skin/{hash}1 year
/cape/{hash}1 year
/cosmetic/{cosmetic}24 hours
/outfit/{code}24 hours
/emote/{emote}24 hours

Player renders follow the latest skin but may lag behind a change by up to their cache time. Need it always current? Look up the active skin hash and render /skin/{hash} - hashes never change their image.

Rate limits

Limit per IPEndpoints
200 / 2 sPlayer, Bust, Player with cosmetics, Try on a cosmetic, Skin, Cosmetic, Outfit
30 / 10 sPlayer emote, Emote
100 / minuteCape

Limits count per IP and route, and only for requests that reach the renderer - CDN hits are free. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (Unix ms); past the limit you get 429.

Errors

Failures answer with JSON instead of an image: {"error": "Texture not found"}.

StatusMeaning
400Malformed input: a name instead of a UUID, a bad hex color, an unsupported extension.
404Unknown player skin, texture hash, cosmetic, emote or outfit.
429Rate limit exceeded - wait for X-RateLimit-Reset.
500The render failed; emotes that exceed their time budget end here.

In the browser

<img>, CSS backgrounds, Discord embeds and Markdown work from anywhere. Reading the pixels from another site - fetch(), a <canvas> - is blocked by CORS, which only admits laby.net itself.

Need the bytes in your app? Download the render on your server, cache it there, and serve it from your own origin.

Finding IDs#

Where the hashes, ids and codes the routes take come from. All public, all JSON.
Skin and cape hashes of a player
https://laby.net/api/v3/user/34e57efa-5783-46c7-a9fc-890296aaba1f/textures

The entry with active: true is the one they wear. image_hash is what /skin and /cape take.

Cosmetic ids and their options
https://dl.labymod.net/cosmetics/index.json

options is the order of the comma-separated data values; default_data is what an omitted value falls back to.

Emote ids
https://neo.labymod.net/emotes/index.json

Entries with draft: true are not released yet.

Outfit share codes
https://laby.net/api/v3/outfits/featured

Or take the code from any shared outfit link.

Endpoints

Players#

Everything keyed by a Minecraft UUID: the player as they look right now.
GET/api/v3/render/player/{uuid}.{format}

Full body of a player with their current skin and Minecraft cape.

Renders the player's latest skin in the classic idle pose. The Minecraft cape they wear is added automatically; pass cape to swap it for any other cape hash.

Slim (Alex) skins are detected from the texture, so the arms always match.

Formats
.png .webp .gif
CDN cache
7 days
Rate limit
200 / 2 s
Auth
none

A skin change can take up to a week to show. For always-current images, render the skin hash instead.

Path
{uuid}

Minecraft UUID, with or without dashes.

{format}

webp is transparent and a fraction of the size - the best pick for the web.

Query parameters

Tick a parameter to send it, or just move its control. Unticked ones use the server default.

Image width in pixels. Clamped to 32 - 1024.

Default: 256

px

Image height in pixels. Clamped to 32 - 1024.

Default: 256

px

Which side faces the camera. both puts a front and a back view side by side.

Default: front

Soft drop shadow under the model.

Default: false

Background fill as hex, RRGGBB or AARRGGBB (alpha first, no #). Transparent when left out.

Default: transparent

Alpha

Second background color: together with backgroundColor1 it paints a 20 px checkerboard.

Default: transparent

Alpha
Response
loading…
Request
https://laby.net/api/v3/render/player/34e57efa-5783-46c7-a9fc-890296aaba1f.webp?width=256&height=256&shadowBlur=true
<img
  src="https://laby.net/api/v3/render/player/34e57efa-5783-46c7-a9fc-890296aaba1f.webp?width=256&height=256&shadowBlur=true"
  alt="LabyStudio · Player"
  loading="lazy"
/>
GET/api/v3/render/bust/{uuid}.{format}

Head and shoulders, turned slightly - made for avatars.

A close-up of the player's upper body with the head turned towards the viewer. This is what laby.net uses for profile avatars, Discord embeds and Snapchat stickers.

Formats
.png .webp .gif
CDN cache
7 days
Rate limit
200 / 2 s
Auth
none
Path
{uuid}

Minecraft UUID, with or without dashes.

{format}

webp is transparent and a fraction of the size - the best pick for the web.

Query parameters

Tick a parameter to send it, or just move its control. Unticked ones use the server default.

Image width in pixels. Clamped to 32 - 1024.

Default: 256

px

Image height in pixels. Clamped to 32 - 1024.

Default: 256

px

Soft drop shadow under the model.

Default: false

Background fill as hex, RRGGBB or AARRGGBB (alpha first, no #). Transparent when left out.

Default: transparent

Alpha

Second background color: together with backgroundColor1 it paints a 20 px checkerboard.

Default: transparent

Alpha
Response
loading…
Request
https://laby.net/api/v3/render/bust/34e57efa-5783-46c7-a9fc-890296aaba1f.webp?width=256&height=256
<img
  src="https://laby.net/api/v3/render/bust/34e57efa-5783-46c7-a9fc-890296aaba1f.webp?width=256&height=256"
  alt="LabyStudio · Bust"
  loading="lazy"
/>
GET/api/v3/render/player/{uuid}/cosmetics.{format}

The player exactly as others see them in LabyMod: skin, every enabled cosmetic and the cape.

Renders every cosmetic the player has switched on, in their chosen colors and textures. The Minecraft cape is shown unless a Laby cloak is worn - the cloak wins, like in game.

Uses the cosmetic renderer, so all pose and camera parameters apply. The camera fits itself to the geometry, which keeps tall wings and pets in frame.

Players without a skin on record are rendered with the default skin instead of failing.

Formats
.png .webp .gif
CDN cache
1 hour
Rate limit
200 / 2 s
Auth
none
Path
{uuid}

Minecraft UUID, with or without dashes.

{format}

webp is transparent and a fraction of the size - the best pick for the web.

Query parameters

Tick a parameter to send it, or just move its control. Unticked ones use the server default.

Image width in pixels. Clamped to 32 - 1024.

Default: 256

px

Image height in pixels. Clamped to 32 - 1024.

Default: 256

px

back turns the camera behind the player, which is where wings and capes live.

Default: front

Where in their idle loop animated cosmetics (wings, auras, pets) are caught, in percent. 50 is mid-loop and usually the most interesting pose. Left out, the resting pose is used.

Default: resting pose

%

gallery switches to one fixed camera for every render, so a grid of outfits keeps the player the same size in every tile.

Default: none

Multiplier on both lights, 0.1 - 2. Emissive cosmetics stay full-bright, so dimming makes glowing parts pop.

Default: 1.0

Response
loading…
Request
https://laby.net/api/v3/render/player/34e57efa-5783-46c7-a9fc-890296aaba1f/cosmetics.webp?width=256&height=256&frame=50
<img
  src="https://laby.net/api/v3/render/player/34e57efa-5783-46c7-a9fc-890296aaba1f/cosmetics.webp?width=256&height=256&frame=50"
  alt="LabyStudio · Player with cosmetics"
  loading="lazy"
/>
GET/api/v3/render/player/{uuid}/cosmetic/{cosmetic}.{format}

One cosmetic on a player's skin - whether they own it or not.

By default the player wears only this one cosmetic. With cosmetics=true it goes on top of everything they already wear, which is what trying it on looks like; if they wear the same cosmetic already, it is drawn once with the requested data.

Formats
.png .webp .gif
CDN cache
1 hour
Rate limit
200 / 2 s
Auth
none
Path
{uuid}

Minecraft UUID, with or without dashes.

{cosmetic}

Cosmetic id from the cosmetic index.

{format}

webp is transparent and a fraction of the size - the best pick for the web.

Query parameters

Tick a parameter to send it, or just move its control. Unticked ones use the server default.

Add the cosmetic on top of the player's enabled cosmetics and cape.

Default: false

The cosmetic's options as comma-separated values, in the order of its options list in the cosmetic index (textures, RRGGBB colors, x;y;z offsets, …). Positions left out fall back to the cosmetic's defaults.

Default: cosmetic defaults

Image width in pixels. Clamped to 32 - 1024.

Default: 256

px

Image height in pixels. Clamped to 32 - 1024.

Default: 256

px

back turns the camera behind the player, which is where wings and capes live.

Default: front

Where in their idle loop animated cosmetics (wings, auras, pets) are caught, in percent. 50 is mid-loop and usually the most interesting pose. Left out, the resting pose is used.

Default: resting pose

%

gallery switches to one fixed camera for every render, so a grid of outfits keeps the player the same size in every tile.

Default: none

Multiplier on both lights, 0.1 - 2. Emissive cosmetics stay full-bright, so dimming makes glowing parts pop.

Default: 1.0

Response
loading…
Request
https://laby.net/api/v3/render/player/34e57efa-5783-46c7-a9fc-890296aaba1f/cosmetic/1768.webp?width=256&height=256&pose=back&frame=50
<img
  src="https://laby.net/api/v3/render/player/34e57efa-5783-46c7-a9fc-890296aaba1f/cosmetic/1768.webp?width=256&height=256&pose=back&frame=50"
  alt="LabyStudio · Try on a cosmetic"
  loading="lazy"
/>
GET/api/v3/render/player/{uuid}/emote/{emote}.{format}

The player performing an emote, wearing their cosmetics, as a looping animation.

An infinitely looping animation of the player doing the emote, cosmetics included. .png is an animated PNG, .gif exists for places that only animate GIFs (iOS notifications), .webp is sized as a WhatsApp sticker (512 × 512).

Rendering an animation is expensive; the stricter rate limit reflects that. For grids and pickers ask for frame=50 - one frame instead of a hundred.

Formats
.png .gif .webp
CDN cache
1 hour
Rate limit
30 / 10 s
Auth
none

24 h when the skin is pinned with skin.

Path
{uuid}

Minecraft UUID, with or without dashes.

{emote}

Emote id from the emote index.

{format}

png is an animated PNG, gif for places that only animate GIFs, webp for stickers.

Query parameters

Tick a parameter to send it, or just move its control. Unticked ones use the server default.

Returns one still frame at this position of the loop (percent) instead of the animation - a normal PNG of a few KB instead of a ~250 KB APNG. frame=50 is the thumbnail pose; frame 0 is the same neutral pose for every emote.

Default: animated

%

Square output size in pixels, clamped to 64 - 512.

Default: 256 (512 for .webp)

px

Frame rate of the animation, 6 - 48.

Default: 12

Wear the player's enabled cosmetics. false renders the bare skin.

Default: true

Pins the skin by hash instead of using the player's current one. Pinned renders are immutable, so the CDN keeps them 24 h instead of 1 h - chat messages use this so old stickers never change.

Default: current skin

Response
loading…
Request
https://laby.net/api/v3/render/player/34e57efa-5783-46c7-a9fc-890296aaba1f/emote/49.png
<img
  src="https://laby.net/api/v3/render/player/34e57efa-5783-46c7-a9fc-890296aaba1f/emote/49.png"
  alt="LabyStudio · Player emote"
  loading="lazy"
/>
Endpoints

Textures#

Keyed by texture hash. A hash never changes its image, so these are cached for a year.
GET/api/v3/render/skin/{hash}.{format}

Any skin texture by its laby.net hash.

Renders a skin texture on its own. Hashes are content-addressed, so the image behind a URL never changes - that is why this is cached for a year, and why it is the right choice when you want a render that is always up to date: look up the current hash, then render it.

Default-parameter renders are additionally kept in object storage, so the most common URL is the fastest one.

Get a player's skin hashes from GET https://laby.net/api/v3/user/{uuid}/textures - the entry with active: true is the one they wear.

Formats
.png .webp .gif
CDN cache
1 year
Rate limit
200 / 2 s
Auth
none
Path
{hash}

laby.net skin hash (32 hex digits).

{format}

webp is transparent and a fraction of the size - the best pick for the web.

Query parameters

Tick a parameter to send it, or just move its control. Unticked ones use the server default.

Image width in pixels. Clamped to 32 - 1024.

Default: 256

px

Image height in pixels. Clamped to 32 - 1024.

Default: 256

px

Which side faces the camera. both puts a front and a back view side by side.

Default: front

Soft drop shadow under the model.

Default: false

Background fill as hex, RRGGBB or AARRGGBB (alpha first, no #). Transparent when left out.

Default: transparent

Alpha

Second background color: together with backgroundColor1 it paints a 20 px checkerboard.

Default: transparent

Alpha

Hang a cape on the skin.

Default: no cape

Response
loading…
Request
https://laby.net/api/v3/render/skin/670f9d318cefb8f7d61e21a5afb767e9.webp?width=256&height=256
<img
  src="https://laby.net/api/v3/render/skin/670f9d318cefb8f7d61e21a5afb767e9.webp?width=256&height=256"
  alt="Skin"
  loading="lazy"
/>
GET/api/v3/render/cape/{hash}.{format}

A Minecraft cape on the default skin, seen from behind.

Renders a cape texture on the default Steve body, turned around by default so the cape faces the camera.

Formats
.png .webp .gif
CDN cache
1 year
Rate limit
100 / minute
Auth
none
Path
{hash}

laby.net cape hash (32 hex digits).

{format}

webp is transparent and a fraction of the size - the best pick for the web.

Query parameters

Tick a parameter to send it, or just move its control. Unticked ones use the server default.

Image width in pixels. Clamped to 32 - 1024.

Default: 256

px

Image height in pixels. Clamped to 32 - 1024.

Default: 256

px

Which side faces the camera.

Default: back

Soft drop shadow under the model.

Default: false

Background fill as hex, RRGGBB or AARRGGBB (alpha first, no #). Transparent when left out.

Default: transparent

Alpha

Second background color: together with backgroundColor1 it paints a 20 px checkerboard.

Default: transparent

Alpha
Response
loading…
Request
https://laby.net/api/v3/render/cape/de4a8ad0267f4fc0f41a732ebcf10ec9.webp?width=256&height=256
<img
  src="https://laby.net/api/v3/render/cape/de4a8ad0267f4fc0f41a732ebcf10ec9.webp?width=256&height=256"
  alt="Cape"
  loading="lazy"
/>
Endpoints

Cosmetics & Outfits#

Any LabyMod cosmetic or saved outfit, on any skin - ownership does not matter.
GET/api/v3/render/cosmetic/{cosmetic}.{format}

A single cosmetic on a skin of your choice - made for shop previews.

Renders one cosmetic in the given options. Without skin it is worn by the default skin. Unlike the player route, an unknown cosmetic id does not fail - it renders the bare player.

Formats
.png .webp .gif
CDN cache
24 hours
Rate limit
200 / 2 s
Auth
none
Path
{cosmetic}

Cosmetic id from the cosmetic index.

{format}

webp is transparent and a fraction of the size - the best pick for the web.

Query parameters

Tick a parameter to send it, or just move its control. Unticked ones use the server default.

The cosmetic's options as comma-separated values, in the order of its options list in the cosmetic index (textures, RRGGBB colors, x;y;z offsets, …). Positions left out fall back to the cosmetic's defaults.

Default: cosmetic defaults

A laby.net skin hash to render with. Defaults to the LabyMod default skin.

Default: see description

Image width in pixels. Clamped to 32 - 1024.

Default: 256

px

Image height in pixels. Clamped to 32 - 1024.

Default: 256

px

back turns the camera behind the player, which is where wings and capes live.

Default: front

Where in their idle loop animated cosmetics (wings, auras, pets) are caught, in percent. 50 is mid-loop and usually the most interesting pose. Left out, the resting pose is used.

Default: resting pose

%

gallery switches to one fixed camera for every render, so a grid of outfits keeps the player the same size in every tile.

Default: none

Multiplier on both lights, 0.1 - 2. Emissive cosmetics stay full-bright, so dimming makes glowing parts pop.

Default: 1.0

Response
loading…
Request
https://laby.net/api/v3/render/cosmetic/1768.webp?width=256&height=256&pose=back&frame=50
<img
  src="https://laby.net/api/v3/render/cosmetic/1768.webp?width=256&height=256&pose=back&frame=50"
  alt="Cosmetic"
  loading="lazy"
/>
GET/api/v3/render/outfit/{code}.{format}

A saved outfit by its share code.

Renders a saved outfit with all of its cosmetics. The skin it was saved with is used when there is one (about a quarter of all outfits), otherwise the default skin; skin overrides both.

Outfits are addressed by share code only - numeric ids are not accepted.

Use preset=gallery for grids: every tile shares one camera, so players line up.

Formats
.png .webp .gif
CDN cache
24 hours
Rate limit
200 / 2 s
Auth
none
Path
{code}

Outfit share code, e.g. from an outfit link.

{format}

webp is transparent and a fraction of the size - the best pick for the web.

Query parameters

Tick a parameter to send it, or just move its control. Unticked ones use the server default.

A laby.net skin hash to render with. Defaults to the outfit's own skin, then the default skin.

Default: see description

Image width in pixels. Clamped to 32 - 1024.

Default: 256

px

Image height in pixels. Clamped to 32 - 1024.

Default: 256

px

back turns the camera behind the player, which is where wings and capes live.

Default: front

Where in their idle loop animated cosmetics (wings, auras, pets) are caught, in percent. 50 is mid-loop and usually the most interesting pose. Left out, the resting pose is used.

Default: resting pose

%

gallery switches to one fixed camera for every render, so a grid of outfits keeps the player the same size in every tile.

Default: none

Multiplier on both lights, 0.1 - 2. Emissive cosmetics stay full-bright, so dimming makes glowing parts pop.

Default: 1.0

Response
loading…
Request
https://laby.net/api/v3/render/outfit/T4wJqYMR.webp?width=256&height=256&preset=gallery
<img
  src="https://laby.net/api/v3/render/outfit/T4wJqYMR.webp?width=256&height=256&preset=gallery"
  alt="Outfit"
  loading="lazy"
/>
Endpoints

Emotes#

Emotes as looping animations or single frames.
GET/api/v3/render/emote/{emote}.{format}

An emote without a player context.

The LabyMod skin performs the emote, without cosmetics. Immutable per emote, skin and frame, so the CDN keeps it for a day.

Formats
.png .gif .webp
CDN cache
24 hours
Rate limit
30 / 10 s
Auth
none
Path
{emote}

Emote id from the emote index.

{format}

png is an animated PNG, gif for places that only animate GIFs, webp for stickers.

Query parameters

Tick a parameter to send it, or just move its control. Unticked ones use the server default.

Returns one still frame at this position of the loop (percent) instead of the animation - a normal PNG of a few KB instead of a ~250 KB APNG. frame=50 is the thumbnail pose; frame 0 is the same neutral pose for every emote.

Default: animated

%

Square output size in pixels, clamped to 64 - 512.

Default: 256 (512 for .webp)

px

Frame rate of the animation, 6 - 48.

Default: 12

Skin hash that performs the emote. Defaults to the LabyMod skin.

Default: LabyMod skin

Response
loading…
Request
https://laby.net/api/v3/render/emote/49.png
<img
  src="https://laby.net/api/v3/render/emote/49.png"
  alt="Emote"
  loading="lazy"
/>
More

Legacy URLs#

Old skin.laby.net/api/render/… links keep working: they answer 301 with the matching v3 URL, parameters translated. New integrations should call v3 directly - it saves the redirect and the old default size of 135 × 257.
skin.laby.netlaby.net
/api/render/user/{uuid}/api/v3/render/player/{uuid}
/api/render/user/{uuid}?bust=true/api/v3/render/bust/{uuid}
/api/render/skin/{hash} · /texture/{hash}/api/v3/render/skin/{hash}
/api/render/cape/{hash} · /cloak/{hash}/api/v3/render/cape/{hash}
both_sides=truepose=both
shadow=trueshadowBlur=true
bg_color1 / bg_color2 (decimal ARGB)backgroundColor1 / backgroundColor2 (hex)
no width / heightwidth=135&height=257