Scope
Social APIs power locker room activity and user-to-user interactions.Endpoint map
- Locker room:
/api/locker-room,/api/locker-room/stream,/api/locker-room/{id},/api/locker-room/{id}/comments,/api/locker-room/{id}/react - Likes and polls:
/api/locker-room/{id}/like,/api/locker-room/{id}/poll/vote,/api/locker-room/comments/{commentId}/like - Comment react and edit:
GET/POST /api/locker-room/comments/{commentId}/react,PUT/DELETE /api/locker-room/{id}/comments/{commentId} - Drafts and discovery:
/api/locker-room/posts/draft,/api/locker-room/hot-takes,/api/discovery/teams,/api/discovery/fans - Social graph:
/api/user/follow,/api/user/followers,/api/user/search,/api/user/recommended,/api/user/top-users - Follow requests:
GET /api/user/follow-requests,DELETE /api/user/follow-requests/{id},POST /api/user/follow-requests/{id}/approve,POST /api/user/follow-requests/{id}/deny - Pins and prompts:
GET /api/pins,GET /api/prompts - News:
GET /api/news,GET /api/news/{id} - Contact match:
POST /api/v1/users/contacts/match(hashed values only) - Safety:
/api/user/mutes,/api/user/blocks - Reports:
POST /api/moderation/reports
Per-post contract
GET /api/locker-roomis public. Send an optional Bearer token so viewer filters (analyticsPersonalization) apply.GET /api/locker-room/{id}is public and returns a single post.PUT /api/locker-room/{id}updates post content (bearer auth, owner).DELETE /api/locker-room/{id}deletes the post (bearer auth, owner).
Authoring as a team
POST /api/locker-roomacceptsteamIdas the about-tag (LockerRoomPost.teamId).authorTeamId(native aliaspostAsTeamId) is who the post is authored as. It is distinct fromteamId.- If
authorTeamIdis set, the caller must be allowed to manage that team or be a super-admin. Otherwise the route returns403. - An unknown
authorTeamIdreturns400. contentmay be empty whenmedia,poll,collectible, orlineupis present.lineupis persisted as{ presetKey, assignments, faces }and echoed on subsequent reads.POST /api/locker-room/{id}/likeis additive and returns{ liked, likeCount }. It does not replace/react.GET/PUT/DELETE /api/locker-room/posts/draftis the authenticated composer draft. GET is404when none exists. DELETE is204even if none existed.- Comment create may include
mentionedUserIds. Responses echomentions[]. Edit must sendmentionedUserIds: []to clear; omitting the field leaves mentions unchanged. GET /api/user/searchis authenticated. Send requiredq. Default scope matches handle, name, and (whenqis at least 2 characters) location.scope=mentionmatches handle and name only and drops users without a handle.limitis 1–50 (default 20). Each row usesprofileUrl(notavatar) and has nolevel.TeamFollowstays social-only. Following a team does not grant post-as-team.
Mute vs block
GET/POST/DELETE /api/user/mutesis a one-way hide. The muted user is not notified and can still see the muter’s content. Game chat list/serialize filters mutes.GET/POST/DELETE /api/user/blocksis stronger. Blocked users are excluded from social surfaces the blocker sees.- Both accept a
User.idor display handle (mutedUserId/blockedUserId, orhandleon POST). Self-mute and self-block return400. - Unmute/unblock accept
mutedUserId/blockedUserIdas a query param, or the same target (id orhandle) in a JSON body.
Integration notes
- Read endpoints support pagination/query parameters; always pass explicit paging when available.
- Mutations should handle auth failures and stale target IDs gracefully.
- Prefer server mute/block IDs from message
authorIdwhen chat only displays a handle.
