Get a player
Read one player of a game: who they are connected to, the member summary, and the approved fields of the game.
GET /v1/games/{game}/players/{playerId} · requires players:read
Call it when your server needs to know who a player is in the community: the member they are connected to, the member's level and coins, and the values CEEJAY stores for the player. A player is found by the game's own ID. Connect explains how a player is connected, and Player data how values get onto them.
Path parameters
Prop
Type
Returns
Prop
Type
player holds:
Prop
Type
Example
curl https://ceejay.communitystudios.xyz/api/v1/games/rugby_manager/players/p_19 \
-H "Authorization: Bearer $CEEJAY_API_KEY"The TypeScript tab calls ceejay.players.get from the TypeScript SDK. It returns the data of the response below.
{
"success": true,
"data": {
"player": {
"playerId": "p_19",
"discordId": "409876543210987654",
"playerName": "Nova77",
"proof": "verified",
"origin": "connect",
"connectedAt": "2026-10-08T18:06:40.000Z",
"membership": "member",
"sharing": {
"agreed": ["progress", "activity"],
"needed": []
}
},
"member": {
"displayName": "Nova",
"avatarUrl": "https://cdn.discordapp.com/avatars/409876543210987654/a1b2c3d4e5f60718293a4b5c6d7e8f90.png",
"level": 12,
"xp": 5420,
"coins": 1450
},
"fields": {
"std.level": 14,
"std.last_played": "2026-10-07",
"league_position": 3,
"club": "Harbour Town"
}
}
}The fields
fields is keyed by the fixed key of each field in the field map: std.level for a standard field, or the key of a field of the game's own. Number fields return numbers and yes or no fields return true or false. A field with no value yet is left out, not null. When the member is not in the server (player.membership is not_member or left), fields is empty and member is null: consent covers server members only.
A sensitive field is never returned, to any key: no scope adds it. Your game already has these values. The same goes for a field that is still proposed or that the community's team marked unused.
Where the numbers come from
The member's name, avatar, level, XP and coins are read from the data CEEJAY's bot stores, not from Discord at the time of the request, so the request does not call Discord's API and can be made often. The data is as current as the bot's last event for that member. membership is read the same way.
A player who has not connected is not found here. When the game holds data for players who have not connected (the community's team enables this), and some is held for this ID, the response is still 404 with the code player_not_found, and its body adds held: true. The held data is not returned: it is attached to the member only when the player connects and is verified.
A paused game can still be read.
The scope
players:read is part of *, so a Full Access key can call this. It also decides whether Get a member lists the game accounts a member connected themselves.
Limits
This request is counted against the key's own requests per minute: 60 unless a higher limit was set on it, and never more than 600. Rate limits has the numbers and the headers.
Errors
| Status | code | error | When |
|---|---|---|---|
400 | bad_player_id | playerId must be 1 to 128 characters: letters, digits and . _ : @ | + = -, starting with a letter or a digit | The player ID in the URL path is longer than 128 characters, or contains a character that is not allowed (letters, digits and . _ : @ | + = -, starting with a letter or a digit) |
403 | community_not_active | This community is no longer active on CEEJAY | The community removed CEEJAY from its server |
403 | game_not_allowed | This API key is limited to other games | The key is limited to other games of the community |
403 | audience_not_allowed | A game made for children cannot connect players or send player data | The game is set up as made for children. Such a game connects nobody and takes no player data |
404 | not_available | This is not available on this instance yet. | Connect is not enabled for this instance. It is enabled per instance. The body adds feature, which is players. Retrying will not change the response |
404 | game_not_found | Game not found | The community has no game with this slug, or the game was removed. A slug that is not 2 to 32 lower-case letters, digits and underscores, starting with a letter, gets this response too |
404 | player_not_found | No connected player has this playerId | No active connection exists for this player ID. When the game holds data for players who have not connected and has some for this ID, the body adds held: true |
Every error body also carries requestId, and a 400 with the code bad_request names the invalid field in field. Match on code, not on the message text, which can change.
The errors every request shares (401, 403 for a missing scope, 405, 429, 500) are on the Errors page.

