Developers
Products
Quickstart

Reference

API reference

Every AlloyMC API endpoint with its parameters and an example response, generated from the OpenAPI spec.

Updated · Markdown

Every endpoint, grouped by what it's about. Open one to see its parameters and an example answer. Endpoints marked token need a bearer token. The same information, machine-readable: openapi.json.

StatusUsersMeMinecraftAuth

Status

Is it up, and what's the newest Alloy.

GET/v1/launcher/releases/latestNewest Alloy release and its signed update files

200 The newest release

{
  "published": "2026-10-30T18:15:43Z",
  "updates": {
    "windows-x86_64": {
      "sha256": "…",
      "size": 5666631,
      "url": "https://github.com/…"
    }
  },
  "version": "0.2.1"
}
GET/v1/statusServer status

200 Up

{
  "launcher": "0.2.1",
  "ok": true,
  "version": "0.1.9"
}

Users

Public profiles and who follows whom.

GET/v1/users/{handle}A public profile
ParameterInAbout
handle requiredpath

200 The profile. Private profiles return only handle, displayName, avatarUrl and private: true.

GET/v1/users/{handle}/avatar.pngAvatar image

The linked Minecraft head or the person's sigil, as a crisp pixel PNG.

ParameterInAbout
handle requiredpath
squerySize in pixels, rounded down to a multiple of 8.

200 PNG

PUT/v1/users/{handle}/followFollow someonetoken
ParameterInAbout
handle requiredpath

204 Following (also if you already were)

DELETE/v1/users/{handle}/followUnfollow someonetoken
ParameterInAbout
handle requiredpath

204 Not following

GET/v1/users/{handle}/followersWho follows someone, newest first
ParameterInAbout
handle requiredpath
beforequeryCursor from the previous page's next.

200 Up to 50 people and a cursor

{
  "next": 0,
  "users": [
    {
      "accent": "lapis",
      "avatarUrl": "https://api.alloymc.dev/v1/users/someone/avatar.png",
      "displayName": "Someone",
      "handle": "someone"
    }
  ]
}
GET/v1/users/{handle}/followingWho someone follows, newest first
ParameterInAbout
handle requiredpath
beforequery

200 Up to 50 people and a cursor

Me

The signed-in account. Needs a bearer token.

GET/v1/meYour accounttoken

200 You, including your email

PATCH/v1/meChange your profiletoken

Send only the fields to change: handle, displayName, bio, pronouns, links, accent, avatar ("sigil" or "minecraft:<uuid>"), private.

Request body

{
  "accent": "amethyst",
  "bio": "Builds castles. Breaks modpacks."
}

200 The updated account

GET/v1/me/sessionsWhere you're signed intoken

200 Sessions, most recently used first

DELETE/v1/me/sessions/{id}Sign one session outtoken
ParameterInAbout
id requiredpath

204 Signed out

Minecraft

Link a Minecraft account with Mojang's own proof, and its skin renders.

POST/v1/me/minecraftFinish linkingtoken

AlloyMC asks Mojang's hasJoined who joined with that server ID. The Minecraft token never reaches AlloyMC.

Request body

{
  "serverId": "alloymc1f3a9c0d2e7b4",
  "username": "Notch"
}

200 Linked

POST/v1/me/minecraft/challengeStart linking a Minecraft accounttoken

Returns a server ID valid for two minutes. Pass it to Mojang's POST https://sessionserver.mojang.com/session/minecraft/join with the player's own access token, exactly as when joining a server; then call POST /v1/me/minecraft.

200 A server ID

{
  "expiresIn": 120,
  "serverId": "alloymc1f3a9c0d2e7b4"
}
DELETE/v1/me/minecraft/{uuid}Unlink a Minecraft accounttoken
ParameterInAbout
uuid requiredpath

204 Unlinked

GET/v1/minecraft/{uuid}Find the AlloyMC profile behind a player

Looks up a Minecraft account by UUID (with or without dashes). Answers only when the player is linked to a public AlloyMC profile and shown on it; otherwise 404, so hidden links stay hidden.

ParameterInAbout
uuid requiredpathMinecraft UUID, with or without dashes

200 The player and their AlloyMC profile

{
  "bodyUrl": "https://api.alloymc.dev/v1/minecraft/069a79f444e94726a5befca90e38aaf5/body.png",
  "headUrl": "https://api.alloymc.dev/v1/minecraft/069a79f444e94726a5befca90e38aaf5/head.png",
  "name": "Notch",
  "slim": false,
  "user": {
    "accent": "amethyst",
    "avatarUrl": "https://api.alloymc.dev/v1/users/kestrel/avatar.png?v=1a2b3c4d",
    "displayName": "Kestrel",
    "handle": "kestrel",
    "profileUrl": "https://alloymc.dev/@kestrel"
  },
  "uuid": "069a79f444e94726a5befca90e38aaf5"
}
GET/v1/minecraft/{uuid}/body.pngFull-body front render of a linked account
ParameterInAbout
uuid requiredpath
squeryWidth in pixels; the height is twice that.

200 PNG

GET/v1/minecraft/{uuid}/head.pngHead render of a linked account
ParameterInAbout
uuid requiredpath
squery

200 PNG with the hat layer

Auth

How Alloy turns a browser sign-in into a token.

POST/v1/auth/tokenTrade a sign-in code for a token

Alloy opens https://alloymc.dev/auth/app?challenge=…&state=…&device=… in the browser (PKCE S256). After the person allows it, the browser returns to alloy://auth?code=…&state=…; Alloy posts the code and its verifier here. Codes last five minutes and work once.

Request body

{
  "code": "…",
  "verifier": "…"
}

200 A token, valid 90 days and renewed while used

{
  "token": "…",
  "tokenType": "Bearer",
  "user": {
    "handle": "elchi"
  }
}
DELETE/v1/auth/tokenSign this token outtoken

204 The token no longer works