Skip to main content

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-room is 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-room accepts teamId as the about-tag (LockerRoomPost.teamId).
  • authorTeamId (native alias postAsTeamId) is who the post is authored as. It is distinct from teamId.
  • If authorTeamId is set, the caller must be allowed to manage that team or be a super-admin. Otherwise the route returns 403.
  • An unknown authorTeamId returns 400.
  • content may be empty when media, poll, collectible, or lineup is present.
  • lineup is persisted as { presetKey, assignments, faces } and echoed on subsequent reads.
  • POST /api/locker-room/{id}/like is additive and returns { liked, likeCount }. It does not replace /react.
  • GET/PUT/DELETE /api/locker-room/posts/draft is the authenticated composer draft. GET is 404 when none exists. DELETE is 204 even if none existed.
  • Comment create may include mentionedUserIds. Responses echo mentions[]. Edit must send mentionedUserIds: [] to clear; omitting the field leaves mentions unchanged.
  • GET /api/user/search is authenticated. Send required q. Default scope matches handle, name, and (when q is at least 2 characters) location. scope=mention matches handle and name only and drops users without a handle. limit is 1–50 (default 20). Each row uses profileUrl (not avatar) and has no level.
  • TeamFollow stays social-only. Following a team does not grant post-as-team.

Mute vs block

  • GET/POST/DELETE /api/user/mutes is 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/blocks is stronger. Blocked users are excluded from social surfaces the blocker sees.
  • Both accept a User.id or display handle (mutedUserId / blockedUserId, or handle on POST). Self-mute and self-block return 400.
  • Unmute/unblock accept mutedUserId / blockedUserId as a query param, or the same target (id or handle) 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 authorId when chat only displays a handle.

Deep-dive documentation