Developer Guides
Data Storage

How SkinsRestorer stores data

SkinsRestorer stores skin data in a file or database (depending on your configuration).

Why does SR need to store skins?

SkinsRestorer stores skin data to keep a cached version of the skin on your server. It contains the same data that Mojang would send to your server when you are in online mode. We cache the information in a file/the database for you, so we need to make fewer requests to the Mojang API and can provide skins even when Mojang servers are down.

What type of data is stored?

If you run /skin Dinnerbone, SkinsRestorer will keep the skin data of Dinnerbone in a file/the database. When Dinnerbone changes his skin, SkinsRestorer will automatically update the skin data in the file/the database. If you run /sr createcustom, SkinsRestorer will generate a skin that will never change and store it in a file/the database.

What is skin data?

Skin data is a Base64 encoded string that contains information about the skin/cape textures. We can get player skin data from the Mojang API using their UUID. Skin data is signed by Mojang, which allows the Minecraft client to verify that the skin data is approved by Mojang. Skin data is initially Base64 encoded as it's transported as a profile property. You can use a Base64 decoder (opens in a new tab) on the skin data to read it.

The decoded data should look like this:

  "timestamp" : 1705586820658,
  "profileId" : "61699b2ed3274a019f1e0ea8c3f06bc6",
  "profileName" : "Dinnerbone",
  "signatureRequired" : true,
  "textures" : {
    "SKIN" : {
      "url" : ""
    "CAPE" : {
      "url" : ""
  1. timestamp → shows the generation date in epoch time see epochconverter (opens in a new tab)
  2. profileId → The unique player Mojang UUID see Mojang API (opens in a new tab)
  3. profileName → shows the player name that this skin belongs to
  4. signatureRequired → this MUST be true (as Mojang signs the skin data)
  5. url → the URL to the skin/cape texture

How we request the skin data

We use two Mojang APIs to request the skin data. Firstly we need to get the unique player id from the player name. Using the player name endpoint (opens in a new tab) After we retrieve the unique player id we can use it to get the profile properties (opens in a new tab), which include the Base64 encoded skin data.


Mojang has an API ratelimit, so we can't request skin data too often. For that, we use third-party APIs that cache the skin data for us as well as use a set of proxies to bypass the ratelimit.

Other resources