Wynncraft

Wynncraft — keyless JSON API

🎮 GamesUNMONITORED
AUTH NONECORS AGENT ?HTTPS COMMERCIAL ?

Wynncraft. Wynncraft Information

HOW IT'S SCORED ⓘ
Status badge · for your READMEshipapis health badge: — · unmonitored
ON PROBE SCHEDULE

We probe a documented GET and expect 2xx JSON — full uptime and health score. Open provider docs ↗

Uptime historystarts after first probe

On our probe schedule. Uptime charts appear after the first check lands.

Example responsefrom provider docs — not verified by us
GET https://docs.wynncraft.com/openapi.json

{
  "openapi": "3.1.0",
  "info": {
    "title": "Modules",
    "version": "1.0.0"
  },
  "paths": {
    "/player": {
      "get": {
        "operationId": "list-online-players",
        "summary": "List online players",
        "description": "<Note>\nThis endpoint is cached for <Badge intent=\"success\" minimal>30 seconds</Badge> in the <Badge intent=\"warning\" minimal>USER</Badge> cache source.   See [Caching](/welcome#caching). <Indent></Indent> This endpoint belongs to the <Badge intent=\"warning\" minimal>PLAYER</Badge> rate-limit bucket. See [Throttling and Rate Limits](/welcome#throttling-and-rate-limits).\n</Note>\n\n<Warning>\nOnline player list is subject to [Access Rules](/privacy), which can hide some players from the list. Rely on the field `total` to have the accurate player count.\n</Warning>",
        "tags": [
          "player"
        ],
        "parameters": [
          {
            "name": "identifier",
            "in": "query",
            "description": "Switches player descriptor between either their username or their uuid.",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/PlayerGetParametersIdentifier"
            }
          },
          {
            "name": "server",
            "in": "query",
            "description": "Filter online players to a specific world such as `WC1` or `1`.",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/PlayerGetParametersServer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Online player summary.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OnlinePlayerList"
                }
              }
            }
          }
        }
      }
    },
    "/player/whoami": {
      "get": {
        "operationId": "get-player-identity",
        "summary": "Who Am I",
        "description": "<Note>\nThis endpoint is not cached.   See [Caching](/welcome#caching). <Indent></Indent> This endpoint belongs to the <Badge intent=\"warning\" minimal>PLAYER</Badge> rate-limit bucket. See [Throttling and Rate Limits](/welcome#throttling-and-rate-limits).\n</Note>\n\n<Warning>\nTry it will not return usable data for this route. It depends on authentication and IP-aware context, so test it against the live API outside the docs.\n</Warning>\n\nData returned here depends on the accounts you used to join Wynncraft. Those accounts represent who we think you are and are used for account-aware features such as store auto-login and map live position viewing.",
        "tags": [
          "player"
        ],
        "responses": {
          "200": {
            "description": "Identity mapping keyed by player UUID.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/components/schemas/PlayerIdentity"
                  }
                }
              }
            }
          },
          "403": {
            "description": "No eligible online identity could be resolved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/player/{username}": {
      "get": {
        "operationId": "get-player",
        "summary": "Get player profile",
        "description": "<Note>\nThis endpoint is cached for <Badge intent=\"success\" minimal>2 minutes</Badge> in the <Badge intent=\"warning\" minimal>USER</Badge> cache source.   See [Caching](/welcome#caching). <Indent></Indent> This endpoint belongs to the <Badge intent=\"warning\" minimal>PLAYER</Badge> rate-limit bucket. See [Throttling and Rate Limits](/welcome#throttling-and-rate-limits).\n</Note>\n\n<Warning>\nPlayer stats are subject to [Access Rules](/privacy), which can hide some of the stats. Check the `restrictions` object to see which access rules affected the response.\n</Warning>\n<Info>\nIt is recommended to request players by UUID. Username lookups can return `300 MultipleObjectsReturned` with a multi-selector response when more than one player matches the query.\n</Info>\n`previousRanking` is stored daily based on player activity. Subtracting `previousRanking` from the current ranking gives the player's leaderboard progression.\n\n<Info>\nUse `fullResult` to include full character data. The `characters` object uses the same structure as [GET /player/{username}/characters/{uuid}](api:GET/player/{username}/characters/{uuid}).\n</Info>",
        "tags": [
          "player"
        ],
        "parameters": [
          {
            "name": "username",
            "in": "path",
            "description": "Username or UUID accepted by the player route.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "fullResult",
            "in": "query",
            "description": "Presence-based flag that expands responses. Send it without a value as `?fullResult`. Using `?fullResult=true` or `?fullResult=false` is not accepted.",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/PlayerUsernameGetParametersFullResult"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Player profile.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Player"
                }
              }
            }
          },
          "404": {
            "description": "No matching player was found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Player payload construction failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/player/{username}/characters": {
      "get": {
        "operationId": "list-player-characters",
        "summary": "List a player's characters",
        "description": "<Note>\nThis endpoint is cached for <Badge intent=\"success\" minimal>2 minutes</Badge> in the <Badge intent=\"warning\" minimal>USER</Badge> cache source.   See [Caching](/welcome#caching). <Indent></Indent> This endpoint belongs to the <Badge intent=\"warning\" minimal>PLAYER</Badge> rate-limit bucket. See [Throttling and Rate Limits](/welcome#throttling-and-rate-limits).\n</Note>\n\n<Warning>\nThis response can be restricted by player [Access Rules](/privacy).\n</Warning>\n<Info>\nIt is recommended to request players by UUID. Username lookups can return `300 MultipleObjectsReturned` with a multi-selector response when more than one player matches the query.\n</Info>\n\nReturns the player's characters keyed by character UUID.",
        "tags": [
          "player"
        ],
        "parameters": [
          {
            "name": "username",
            "in": "path",
            "description": "Username or UUID accepted by the player route.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Character map keyed by character UUID.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/components/schemas/LightCharacter"
                  }
                }
              }
            }
          },
          "400": {
            "description": "The player has no characters.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Character list visibility is restricted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No matching player was found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Player payload construction failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/player/{username}/characters/{uuid}": {
      "get": {
        "operationId": "get-player-character",
        "summary": "Get detailed character data",
        "description": "<Note>\nThis endpoint is cached for <Badge intent=\"success\" minimal>2 minutes</Badge> in the <Badge intent=\"warning\" minimal>USER</Badge> cache source.   See [Caching](/welcome#caching). <Indent></Indent> This endpoint belongs to the <Badge intent=\"warning\" minimal>PLAYER</Badge> rate-limit bucket. See [Throttling and Rate Limits](/welcome#throttling-and-rate-limits).\n</Note>\n\n<Warning>\nCharacter data is subject to [Access Rules](/privacy), which can hide some stats. Check the `restrictions` object to see which access rules affected the response. You can also check the `removedStat` field to check when the character skeleton customization affect the response.\n</Warning>\n<Info>\nIt is recommended to request players by UUID. Username lookups can return `300 MultipleObjectsReturned` with a multi-selector response when more than one player matches the query.\n</Info>\n\nReturns the full stat payload for a single character.",
        "tags": [
          "player"
        ],
        "parameters": [
          {
            "name": "username",
            "in": "path",
            "description": "Username or UUID accepted by the player route.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Character detail.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Character"
                }
              }
            }
          },
          "400": {
            "description": "Unknown character UUID.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Character data visibility is restricted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No matching player was found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Player payload construction failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/player/{username}/characters/{uuid}/abilities": {
      "get": {
        "operationId": "get-player-character-abilities",
        "summary": "Get character ability map",
        "description": "<Note>\nThis endpoint is cached for <Badge intent=\"warning\" minimal>10 minutes</Badge> in the <Badge intent=\"warning\" minimal>USER</Badge> cache source.   See [Caching](/welcome#caching). <Indent></Indent> This endpoint belongs to the <Badge intent=\"warning\" minimal>PLAYER</Badge> rate-limit bucket. See [Throttling and Rate Limits](/welcome#throttling-and-rate-limits).\n</Note>\n<Warning>\nAbility Tree is subject to [Access Rules](/privacy), which can make it unavailable.\n</Warning>\n<Info>\nIt is recommended to request players by UUID. Username lookups can return `300 MultipleObjectsReturned` with a multi-selector response when more than one player matches the query.\n</Info>\nThis endpoint only lists abilities the player has enabled and performs pathfinding on the fly.\n\nTo render a full in-game style ability tree, combine this response with:\n- [GET /ability/tree/{tree}](api:GET/ability/tree/{tree})\n- [GET /ability/map/{tree}](api:GET/ability/map/{tree}) ",
        "tags": [
          "player"
        ],
        "parameters": [
          {
            "name": "username",
            "in": "path",
            "description": "Username or UUID accepted by the player route.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Ability tree nodes grouped by page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AbilityMapPages"
                }
              }
            }
          },
          "400": {
            "description": "Unknown character UUID.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Ability tree visibility is restricted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No matching player was found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "The character ability tree could not be rendered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/oauth/me": {
      "get": {
        "operationId": "get-oauth-identity",
        "summary": "Get OAuth2 identity",
        "description": "<Warning>\nTry it will not return usable data for this route. It depends on a live OAuth2 authentication context outside the docs.\n</Warning>\n\n<Info>\nGet started with OAuth by reading [our guide](/oauth2/creating-an-application).\n</Info>\n\nThis endpoint returns the authenticated OAuth2 application context and the linked player profiles available to the authorized user.\n\n<Info>\nThe `profiles` object contains the player profiles that belong to the authorizing user. Access-rule bypass through OAuth2 only applies to those linked profiles when the user granted permission for it.\n</Info>",
        "tags": [
          "oAuth2"
        ],
        "responses": {
          "200": {
            "description": "OAuth2 application context and linked profiles.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OAuthMeResponse"
                }
              }
            }
          }
        }
      }
    },
    "/oauth/token": {
      "post": {
        "operationId": "exchange-oauth-token",
        "summary": "Exchange OAuth2 token",
        "description": "<Warning>\nThis endpoint expects `application/x-www-form-urlencoded`.\n</Warning>\n<Warning>\nTry it will not return usable data for this route. It depends on a live OAuth2 authentication context outside the docs.\n</Warning>\n<Info>\nGet started with OAuth by reading [our guide](/oauth2/creating-an-application).\n</Info>\n<Info>\nOnly the `authorization_code` grant type is supported. Authorization codes are one-time use and expire after 5 minutes.\n</Info>\n\nPKCE is supported for both Private and Public applications but Public applications must send `code_verifier` and must not send `client_secret`.\n\nPrivate applications must send `client_secret`.\n\nOnly `S256` PKCE is supported.",
        "tags": [
          "oAuth2"
        ],
        "responses": {
          "200": {
            "description": "OAuth2 access token exchange result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OAuthTokenResponse"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OAuthTokenExchangeRequest"
              }
            }
          }
        }
      }
    }
  },
  "servers": [
    {
      "url": "https://api.wynncraft.com/v3",
      "description": "The Wynncraft Public API"
    }
  ],
  "components": {
    "schemas": {
      "PlayerGetParametersIdentifier": {
        "type": "string",
        "enum": [
          "username",
          "uuid"
        ],
        "title": "PlayerGetParametersIdentifier"
      },
      "PlayerGetParametersServer": {
        "oneOf": [
          {
            "type": "string"
          },
          {
            "type": "integer"
          }
        ],
        "title": "PlayerGetParametersServer"
      },
      "OnlinePlayerListPlayers": {
        "type": "object",
        "properties": {
          "identifier": {
            "type": "string",
            "format": "server"
          }
        },
        "title": "OnlinePlayerListPlayers"
      },
      "OnlinePlayerList": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer"
          },
          "players": {
            "$ref": "#/components/schemas/OnlinePlayerListPlayers"
          }
        },
        "required": [
          "total",
          "players"
        ],
        "title": "OnlinePlayerList"
      },
      "LegacyRankColour": {
        "type": "object",
        "properties": {
          "main": {
            "type": "string"
          },
          "sub": {
            "type": "string"
          }
        },
        "required": [
          "main",
          "sub"
        ],
        "title": "LegacyRankColour"
      },
      "PlayerIdentity": {
        "type": "object",
        "properties": {
          "username": {
            "type": "string"
          },
          "online": {
            "type": "boolean"
          },
          "nickname": {
            "type": [
              "string",
              "null"
            ]
          },
          "rank": {
            "type": "string"
          },
          "supportRank": {
            "type": [
              "string",
              "null"
            ]
          },
          "shortenedRank": {
            "type": "string"
          },
          "legacyRankColour": {
            "$ref": "#/components/schemas/LegacyRankColour"
          },
          "rankBadge": {
            "type": "string"
          }
        },
        "required": [
          "username",
          "online"
        ],
        "title": "PlayerIdentity"
      },
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "integer"
          }
        },
        "required": [
          "error",
          "detail"
        ],
        "title": "Error"
      },
      "PlayerUsernameGetParametersFullResult": {
        "type": "string",
        "enum": [
          ""
        ],
        "title": "PlayerUsernameGetParametersFullResult"
      }
    }
  }
}
Call itcurl · fetch · python
curl "https://docs.wynncraft.com/openapi.json"
const res = await fetch("https://docs.wynncraft.com/openapi.json");
const data = await res.json();
console.log(data);
import requests

res = requests.get("https://docs.wynncraft.com/openapi.json")
print(res.json())

BROWSER CALLS BLOCKED (NO CORS/HTTPS) — USE THE CURL SNIPPET

Endpoints · 6On scheduleFULL DOCS ↗
On schedule — GET /openapi.json awaits first probe
GET/openapi.jsonPROBED

Wynncraft — keyless JSON API

GET/openapi.json?limit=5

Paginated variant with limit parameter.

GET/player

List online players

GET/player/whoami

Who Am I

GET/player/{username}

Get player profile

GET/player/{username}/characters

List a player's characters

Machine-readable spec

We probe a documented GET and expect 2xx JSON — full uptime and health score. Export includes every documented route below.

Response-shape history

Not tracked yet. Shape-change history starts once this API joins our probe schedule.

Wynncraft: common questions

Is Wynncraft free to use?

Yes — Wynncraft is a free games API. Free tier: Free — limits not published. Whether the free tier allows commercial use is unclear — check the provider docs.

Does Wynncraft need an API key?

No — Wynncraft needs no API key or signup. You can call it straight away; rate limits still apply (Unpublished).

Can I call Wynncraft from the browser?

Not directly — Wynncraft doesn't send browser-friendly CORS headers, so call it from a server or proxy instead. Copy the curl or Python snippet on this page to get started.

Is Wynncraft up right now?

Wynncraft is catalogued but not yet on our probe schedule, so we don't publish a live status for it. Check the provider's own status page or docs for its current state.