CEEJAYDocs

Confirm a connect session

Approve or decline a connect session from your own server, for a game that holds no session secret.

POST /v1/games/{game}/connect/sessions/{sessionId}/confirm · requires players:connect

Read the session with Get a connect session, show your player the Discord name it returns, and send the player's decision. A game that holds the session secret sends Confirm connect itself.

Path parameters

Prop

Type

Body parameters

Prop

Type

Returns

The session, in the same shape that Get a connect session returns.

Prop

Type

connection holds:

Prop

Type

statusThe session
pendingWaiting for the member to approve on the connect page
needs_game_confirmationThe member approved, or the game attached a member's code. Waiting for the game to confirm
needs_confirmationA session a member started in Discord that the game has confirmed. The member confirms in Discord
approvedBoth approved. The connection is saved
declinedThe member pressed Cancel, or kept the player they were connected to
cancelledThe game declined, or a newer session for the same player superseded it
expiredThe 10 minutes have passed
lockedThe code was entered incorrectly five times
refusedThe connection could not be made: see reason

This list may grow: handle unknown values.

reasonWhy the session ended
member_cancelledThe member pressed Cancel, or kept the player they had
game_declinedThe game declined
bannedThe Discord account is banned from the server
player_blockedThe community blocked the player
player_already_connectedThe player is connected to another Discord account, and could not be moved
expiredThe 10 minutes passed
too_many_triesThe code was entered incorrectly five times
under_ageThe player is under age
nullThe session is open or approved, a newer session for the same player superseded it, or the member connected another player in the meantime

Example

Request
curl -X POST https://ceejay.communitystudios.xyz/api/v1/games/rugby_manager/connect/sessions/kT3v9QmZ1xY7bLw2RfA8cN/confirm \
  -H "Authorization: Bearer $CEEJAY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accept": true
  }'

The TypeScript tab calls ceejay.connect.confirmSession from the TypeScript SDK. It returns the data of the response below.

200 OK
{
  "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
    }
  }
}

What accepting and declining do

accept: true is accepted only while status is needs_game_confirmation.

  • For a session your server or the game started, the member has approved by then: the session is finished, the connection is saved and status becomes approved.
  • For a session a member started in Discord, status becomes needs_confirmation, and the member confirms there.

accept: false ends an open session in any state. Its status becomes cancelled and its reason game_declined. A paused game can still decline.

Retrying safely

The request is safe to repeat and takes no idempotencyKey. Confirming twice returns the session as it is. Declining a session that has ended changes nothing and returns the session as it is.

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

StatuscodeerrorWhen
400bad_requestThe request body must be a JSON objectThe body is null, text, a number or a list. A request with no Content-Type header is read as text, so it gets this response too
400bad_requestaccept must be true or falseaccept is missing or is not true or false
404not_availableThis 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
403community_not_activeThis community is no longer active on CEEJAYThe community removed CEEJAY from its server
404game_not_foundGame not foundThe 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
403game_not_allowedThis API key is limited to other gamesThe key is limited to other games of the community
403audience_not_allowedA game made for children cannot connect players or send player dataThe game is set up as made for children. Such a game connects nobody
404session_not_foundConnect session not foundThe game has no session with this ID. A session of another game or community is not found either
409nothing_to_confirmThere is nothing to confirm on this request right nowaccept is true and the session is not waiting for the game's confirmation: the member has not approved, or the session has ended
409session_changedThis request changed since it was shown. Read it againThe session changed between the member's approval and this request: another account connected this player, or the member connected another player. Read the session again. When it has ended, start a new one, and the member is shown what changed
409player_blockedThis player cannot be connected until the community lifts a blockThe community blocked this player. The session has ended
409player_takenThis player is connected to another Discord account. Connect from the game the player is signed in toThe player is connected to another Discord account and cannot be moved to this one: that connection is verified and this one is not. The session has ended
409game_pausedThis game is pausedaccept is true and the game is paused or suspended. A decline is still accepted

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.

On this page

Community StudiosPrivacyTerms