> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.wynncraft.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.wynncraft.com/_mcp/server.

# Get detailed character data

GET https://api.wynncraft.com/v3/player/{username}/characters/{uuid}

This endpoint is cached for 2 minutes in the USER cache source.   See [Caching](/welcome#caching).  This endpoint belongs to the PLAYER rate-limit bucket. See [Throttling and Rate Limits](/welcome#throttling-and-rate-limits).

Character 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.

It 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.

Returns the full stat payload for a single character.

Reference: https://docs.wynncraft.com/modules/player/get-player-character

## Request

### Path parameters

- `username` (string, required) — Username or UUID accepted by the player route.
- `uuid` (string, required)

## Response

### 200

Character detail.

- `type` (string, required)
- `reskin` (string, required, nullable)
- `nickname` (string, required, nullable)
- `level` (integer, required)
- `xp` (integer, required)
- `xpPercent` (integer, required)
- `totalLevel` (integer, required)
- `preEconomy` (boolean, required, nullable)
- `gamemode` (list of string, required)
- `contentCompletion` (integer, required)
- `wars` (integer, required)
- `playtime` (double, required)
- `mobsKilled` (integer, required)
- `chestsFound` (integer, required)
- `itemsIdentified` (integer, required)
- `blocksWalked` (integer, required)
- `logins` (integer, required)
- `deaths` (integer, required)
- `discoveries` (integer, required)
- `pvp` (PvpStats, required)
- `skillPoints` (map from string to integer, required, nullable)
- `professions` (Professions, required)
- `dungeons` (DungeonCountList, required, nullable)
- `raids` (RaidCountList, required, nullable)
- `worldEvents` (integer, required)
- `lootruns` (integer, required)
- `caves` (integer, required)
- `quests` (list of string, required)
- `restrictions` (map from string to boolean, required)
- `removedStat` (list of string, required)

## Errors

### 400 Bad Request Error

Unknown character UUID.

- `error` (string, required)
- `detail` (string, required)
- `code` (integer, required)

### 403 Forbidden Error

Character data visibility is restricted.

- `error` (string, required)
- `detail` (string, required)
- `code` (integer, required)

### 404 Not Found Error

No matching player was found.

- `error` (string, required)
- `detail` (string, required)
- `code` (integer, required)

### 500 Internal Server Error

Player payload construction failed.

- `error` (string, required)
- `detail` (string, required)
- `code` (integer, required)

## Types

### PvpStats

- `kills` (integer, optional)
- `deaths` (integer, optional)

### Professions

- `fishing` (ProfessionProgress, optional)
- `woodcutting` (ProfessionProgress, optional)
- `mining` (ProfessionProgress, optional)
- `farming` (ProfessionProgress, optional)
- `scribing` (ProfessionProgress, optional)
- `jeweling` (ProfessionProgress, optional)
- `alchemism` (ProfessionProgress, optional)
- `cooking` (ProfessionProgress, optional)
- `weaponsmithing` (ProfessionProgress, optional)
- `tailoring` (ProfessionProgress, optional)
- `woodworking` (ProfessionProgress, optional)
- `armouring` (ProfessionProgress, optional)

### DungeonCountList

- `total` (integer, required)
- `list` (DungeonList, required)

### RaidCountList

- `total` (integer, required)
- `list` (RaidList, required)

### ProfessionProgress

- `level` (integer, required)
- `xpPercent` (integer, required)

### DungeonList

- `Skeleton` (integer, optional)
- `Decrepit Sewers` (integer, optional)
- `Corrupted Decrepit Sewers` (integer, optional)
- `Spider` (integer, optional)
- `Infested Pit` (integer, optional)
- `Zombie` (integer, optional)
- `Timelost Sanctum` (integer, optional)
- `Underworld Crypt` (integer, optional)
- `Corrupted Underworld Crypt` (integer, optional)
- `Animal` (integer, optional)
- `Lost Sanctuary` (integer, optional)
- `Corrupted Lost Sanctuary` (integer, optional)
- `Silverfish` (integer, optional)
- `Sand-Swept Tomb` (integer, optional)
- `Corrupted Sand-Swept Tomb` (integer, optional)
- `Ice` (integer, optional)
- `Ice Barrows` (integer, optional)
- `Corrupted Ice Barrows` (integer, optional)
- `Jungle` (integer, optional)
- `Undergrowth Ruins` (integer, optional)
- `Corrupted Undergrowth Ruins` (integer, optional)
- `Ocean` (integer, optional)
- `Galleon's Graveyard` (integer, optional)
- `Corrupted Galleon's Graveyard` (integer, optional)
- `Fallen Factory` (integer, optional)
- `Eldritch Outlook` (integer, optional)

### RaidList

- `Nest of the Grootslangs` (integer, optional)
- `Orphion's Nexus of Light` (integer, optional)
- `The Canyon Colossus` (integer, optional)
- `The Nameless Anomaly` (integer, optional)
- `The Wartorn Palace` (integer, optional)

## Examples

**Response**

```json
{
  "type": "ASSASSIN",
  "reskin": "NINJA",
  "nickname": "Neplicopter",
  "level": 106,
  "xp": 53307528,
  "xpPercent": 100,
  "totalLevel": 369,
  "preEconomy": null,
  "gamemode": [],
  "contentCompletion": 1860,
  "wars": 6,
  "playtime": 2485.42,
  "mobsKilled": 470208,
  "chestsFound": 3033,
  "itemsIdentified": 42,
  "blocksWalked": 123456,
  "logins": 128,
  "deaths": 666,
  "discoveries": 120,
  "pvp": {
    "kills": 443,
    "deaths": 666
  },
  "skillPoints": {
    "strength": 0,
    "dexterity": 0,
    "intelligence": 0,
    "defence": 0,
    "agility": 0
  },
  "professions": {
    "fishing": {
      "level": 73,
      "xpPercent": 41
    },
    "woodcutting": {
      "level": 52,
      "xpPercent": 88
    },
    "mining": {
      "level": 68,
      "xpPercent": 17
    },
    "farming": {
      "level": 91,
      "xpPercent": 64
    },
    "scribing": {
      "level": 39,
      "xpPercent": 22
    },
    "jeweling": {
      "level": 57,
      "xpPercent": 79
    },
    "alchemism": {
      "level": 44,
      "xpPercent": 35
    },
    "cooking": {
      "level": 28,
      "xpPercent": 93
    },
    "weaponsmithing": {
      "level": 61,
      "xpPercent": 11
    },
    "tailoring": {
      "level": 34,
      "xpPercent": 58
    },
    "woodworking": {
      "level": 49,
      "xpPercent": 84
    },
    "armouring": {
      "level": 72,
      "xpPercent": 26
    }
  },
  "dungeons": {
    "total": 2,
    "list": {
      "Decrepit Sewers": 1,
      "Corrupted Decrepit Sewers": 1
    }
  },
  "raids": {
    "total": 1,
    "list": {
      "Nest of the Grootslangs": 1
    }
  },
  "worldEvents": 2,
  "lootruns": 1,
  "caves": 43,
  "quests": [
    "A Journey Beyond"
  ],
  "restrictions": {
    "characterDataAccess": false,
    "characterBuildAccess": false
  },
  "removedStat": [],
  "meta": {
    "died": false
  }
}
```

**SDK Code**

```python Detailed assassin character
import requests

url = "https://api.wynncraft.com/v3/player/username/characters/uuid"

response = requests.get(url)

print(response.json())
```

```javascript Detailed assassin character
const url = 'https://api.wynncraft.com/v3/player/username/characters/uuid';
const options = {method: 'GET'};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Detailed assassin character
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.wynncraft.com/v3/player/username/characters/uuid"

	req, _ := http.NewRequest("GET", url, nil)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Detailed assassin character
require 'uri'
require 'net/http'

url = URI("https://api.wynncraft.com/v3/player/username/characters/uuid")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
```

```java Detailed assassin character
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.wynncraft.com/v3/player/username/characters/uuid")
  .asString();
```

```php Detailed assassin character
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.wynncraft.com/v3/player/username/characters/uuid');

echo $response->getBody();
```

```csharp Detailed assassin character
using RestSharp;

var client = new RestClient("https://api.wynncraft.com/v3/player/username/characters/uuid");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
```

```swift Detailed assassin character
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://api.wynncraft.com/v3/player/username/characters/uuid")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```