REST API (HTTP)

API root route is at host/api

admin, friend, friend2, friend3, friend4

User Endpoints

endpoint remarks body response
post /signup {username, password, name}
non-200 responses (text in response body):

"Already logged in” "User exists” "Bad request” "Bad params” | | post /login | log in and set session cookie axios: withCredentials? for all requests

| {username, password} | non-200 responses (text in response body):

"Already logged in” ****”Invalid credentials” "Bad params” | | get /logged-in | check if logged in | | { loggedIn: true } |

Protected Endpoints (logged in only)

endpoint remarks body response
post /logout
get /user-stats get user’s results for the past week {results: [ {numGuesses, timeTaken, date}, … ]} (for the past week)
get /leaderboard get friends’ results for today {data: [ {name, username, numGuesses, timeTaken}, …] }
get /friends get all friends {friends: [ {name, username}… ]}
get /played-today {played: true}
post /add-friend {username}
non-200 responses (text in response body):

"No such user” "Friend exists” | | post /unfriend | | {username} | non-200 responses (text in response body):

"No such user” "No such friend” |

Singleplayer Endpoints

endpoint remarks body response
post /guess after every guess {guess} {score: “12021”}
post /end-game post game scores after end of game (server will ignore if not logged in)

”Result exists for today” | {scores : [], timeTaken: int (seconds) } | {word: “apple”} |

Multiplayer Endpoints

endpoint remarks body response
get /register get playerId before creating/joining room {playerId}
get /create-room {roomId}

WebSocket Connection

Socket: include playerId

Channel: include roomId

WebSocket Events

event payload → reply (pushing) message (receiving)
joined {playerId, playerName, roomId, players: [ {playerId, playerName, state} ], started, round}
ready null → null {playerId, playerName}
start_game
start_round
new_guess {guess} → {result, allFinished, row} {row, ****playerId, playerName}
finish {playerId, playerName, result}
end_round {gameOver, scores: {playerId: score}, word}