Get a connect session
Read one connect session: its status, who approved, and the connection once it is approved.
GET /v1/games/{game}/connect/sessions/{sessionId} · requires players:connect
Use it to check how a session your server started ended, and to get the Discord name to show your player before the game approves.
Path parameters
Prop
Type
Returns
Prop
Type
connection holds:
Prop
Type
status | The session |
|---|---|
pending | Waiting for the member to approve on the connect page |
needs_game_confirmation | The member approved, or the game attached a member's code. Waiting for the game to confirm |
needs_confirmation | A session a member started in Discord that the game has confirmed. The member confirms in Discord |
approved | Both approved. The connection is saved |
declined | The member pressed Cancel, or kept the player they were connected to |
cancelled | The game declined, or a newer session for the same player superseded it |
expired | The 10 minutes have passed |
locked | The code was entered incorrectly five times |
refused | The connection could not be made: see reason |
This list may grow: handle unknown values.
reason | Why the session ended |
|---|---|
member_cancelled | The member pressed Cancel, or kept the player they had |
game_declined | The game declined |
banned | The Discord account is banned from the server |
player_blocked | The community blocked the player |
player_already_connected | The player is connected to another Discord account, and could not be moved |
expired | The 10 minutes passed |
too_many_tries | The code was entered incorrectly five times |
under_age | The player is under age |
null | The session is open or approved, a newer session for the same player superseded it, or the member connected another player in the meantime |
Example
curl "https://ceejay.communitystudios.xyz/api/v1/games/rugby_manager/connect/sessions/kT3v9QmZ1xY7bLw2RfA8cN" \
-H "Authorization: Bearer $CEEJAY_API_KEY"The TypeScript tab calls ceejay.connect.getSession from the TypeScript SDK. It returns the data of the response below.
{
"success": true,
"data": {
"sessionId": "kT3v9QmZ1xY7bLw2RfA8cN",
"status": "approved",
"reason": null,
"expiresAt": "2026-10-08T18:14:11.000Z",
"member": {
"displayName": "Nova",
"avatarUrl": "https://cdn.discordapp.com/avatars/409876543210987654/a1b2c3d4e5f60718293a4b5c6d7e8f90.png"
},
"connection": {
"discordId": "409876543210987654",
"playerId": "p_19",
"proof": "verified",
"connectedAt": "2026-10-08T18:06:40.000Z",
"moved": false,
"previousPlayerId": null
}
}
}{
"success": true,
"data": {
"sessionId": "kT3v9QmZ1xY7bLw2RfA8cN",
"status": "needs_game_confirmation",
"reason": null,
"expiresAt": "2026-10-08T18:14:11.000Z",
"member": {
"displayName": "Nova",
"avatarUrl": "https://cdn.discordapp.com/avatars/409876543210987654/a1b2c3d4e5f60718293a4b5c6d7e8f90.png"
},
"connection": null
}
}Reading a session
A session a member's code was attached to is read by the same ID. A session past its 10 minutes reads expired. A paused game can still be read.
member is present from needs_game_confirmation onwards: it is the name your game shows its player before Confirm a connect session. connection is present once the session is approved, and contains the member's Discord ID, which is never sent to the game.
The scope
players:connect lets a server act for a player: it can create a pass, and with a pass any player who is already connected at the verified level can be signed in. Keep it on your own server. It is never part of *: a Full Access key returns 403 here. Tick Act for a player when you make the key.
Limits
The Connect requests of a server have a limit of their own: 600 requests a minute for each game, across all five Connect endpoints. They are not counted against the key's own requests per minute. One API key is also capped at 6,000 requests a minute across all five Connect endpoints. The three X-RateLimit headers report the game's limit of 600 once the request has resolved its game, and the key's limit of 6,000 on a response returned before that: see Rate limits.
Errors
| Status | code | error | When |
|---|---|---|---|
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 |
403 | community_not_active | This community is no longer active on CEEJAY | The community removed CEEJAY from its server |
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 |
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 |
404 | session_not_found | Connect session not found | The game has no session with this ID. A session of another game or community is not found either |
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.

