Get a member
Returns a member's profile, activity totals, currency balance and linked platform accounts in one call.
GET /v1/members/{discordId} · requires members:read
Path parameters
Prop
Type
Returns
Prop
Type
economy contains balance, totalEarned and totalSpent, all zero when the member has no balance yet. Each entry of connections is an account that is linked now (a link that was disconnected is left out). A game account the member connected themselves through Connect is listed only for a key that has the players:read scope, which a * key does. An account your own server linked with Link an account is always listed. A secret key that is limited to some games lists the connections to those games only, and the accounts that belong to no game:
Prop
Type
proof tells you how far a game's playerId can be trusted:
proof | What it means |
|---|---|
verified | The player was verified: by the game, with a pass from your server or a sign-in token, or by your own server linking it with Link an account |
basic | The member connected through Connect with a player ID the game supplied and CEEJAY did not verify. Anyone with the public key a game ships with can supply any ID, so nothing confirms that the player is theirs. Do not grant rewards for a basic connection |
null | The account is not a connection to a game set up for Connect, or Connect is not enabled on this instance |
The response also includes the original field names. They contain the same values, and remain for as long as version 1 exists.
| Deprecated field, still sent | Same value as |
|---|---|
platformUserId | playerId |
platformUsername | playerName |
Example
curl "https://ceejay.communitystudios.xyz/api/v1/members/409876543210987654" \
-H "Authorization: Bearer $CEEJAY_API_KEY"The TypeScript example uses ceejay.members.get from the TypeScript SDK. It returns the data of the response below.
{
"success": true,
"data": {
"discordId": "409876543210987654",
"displayName": "nova",
"avatarUrl": "https://cdn.discordapp.com/avatars/409876543210987654/a1b2c3d4e5f6.png",
"xp": 8450,
"level": 12,
"totalMessages": 3411,
"totalVoiceMinutes": 862,
"joinedAt": "2025-11-04T18:22:07.000Z",
"lastUpdated": "2026-10-01T09:14:22.118Z",
"economy": {
"balance": 2450,
"totalEarned": 9100,
"totalSpent": 6650
},
"connections": [
{
"platform": "twitch",
"platformUserId": "123456789",
"platformUsername": "novaplays",
"playerId": "123456789",
"playerName": "novaplays",
"connectedAt": "2026-03-12T16:40:11.000Z",
"proof": null
}
]
}
}Errors
| Status | code | error | When |
|---|---|---|---|
400 | bad_request | discordId must be a valid Discord snowflake (17-20 digits) | The Discord ID in the path is not 17 to 20 digits |
404 | member_not_found | Member not found | CEEJAY has no profile for this ID on your server. CEEJAY does not query Discord |
Every error body also includes requestId, and a 400 with the code bad_request identifies the invalid field in field. Match on code; message text can change.
The errors every request shares (401, 403, 405, 429, 500) are on the Errors page.
404 versus empty
A member CEEJAY has no profile for returns 404. A member who exists but has no currency
returns 200 with a zeroed economy object, so a 404 always means "unknown member",
never "no activity".

