List players
List the players of a game who are connected to a Discord member, newest connection first, a page at a time.
GET /v1/games/{game}/players · requires players:read
Call it to walk through the players of a game: to see who is connected, or to keep a copy of the connections on your own server. The list contains each player's connection, not the member summary or the fields: read one player with Get a player for those. A player who has not connected is not in the list.
Path parameters
Prop
Type
Query parameters
Prop
Type
Returns
data is the list of the players of this page, newest connection first. page is returned alongside it: page.nextCursor is the text to send as cursor for the next page, or null when this is the last page, and page.limit is the page size that was used.
Prop
Type
Example
curl "https://ceejay.communitystudios.xyz/api/v1/games/rugby_manager/players?limit=2" \
-H "Authorization: Bearer $CEEJAY_API_KEY"The TypeScript tab calls ceejay.players.list from the TypeScript SDK. It returns the whole response below, with the list in data.
{
"success": true,
"data": [
{
"playerId": "p_19",
"discordId": "409876543210987654",
"playerName": "Nova77",
"proof": "verified",
"origin": "connect",
"connectedAt": "2026-10-08T18:06:40.000Z",
"membership": "member"
},
{
"playerId": "p_77",
"discordId": "521776109822345216",
"playerName": null,
"proof": "basic",
"origin": "connect",
"connectedAt": "2026-10-08T17:41:12.000Z",
"membership": "pending"
}
],
"page": {
"nextCursor": "WzQyXQ",
"limit": 2
}
}Paging
Send page.nextCursor back as cursor for the next page, and stop when it is null. The list is ordered by the number of the connection, newest first, so a player who connects while you are paging may appear on the page you already read, and is not skipped. A cursor is not a secret and is not signed, but it only starts a page somewhere else in your own game's list.
A paused game can still be read.
The scope
players:read is part of *, so a Full Access key can call this.
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_request | limit must be a whole number of 0 or more | limit is not a whole number of 0 or more written in digits, or is sent more than once |
400 | bad_request | cursor is not one this list gave | cursor is empty, cannot be read, or is sent more than once. Send page.nextCursor exactly as returned |
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 |
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.

