Files
CC-Framework.BriskGameServer/服务参考_临时/openapi.yaml

1927 lines
51 KiB
YAML

openapi: 3.0.3
info:
title: Brisk Game Service API
version: 0.2.0
description: Current implemented Brisk server API for internal integration.
servers:
- url: /api
tags:
- name: time
- name: bootstrap
- name: auth
- name: player
- name: config
- name: announcements
- name: ranks
- name: archives
- name: spaces
- name: admin-auth
- name: admin-audit
- name: admin-projects
- name: admin-configs
- name: admin-announcements
- name: admin-rank-groups
- name: admin-ranks
- name: admin-archives
- name: admin-players
- name: admin-spaces
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: token
schemas:
SuccessEnvelope:
type: object
properties:
code:
type: integer
example: 0
message:
type: string
example: ok
data:
type: object
ErrorEnvelope:
type: object
properties:
code:
type: integer
message:
type: string
data:
nullable: true
ClientTimePayload:
type: object
properties:
server_time:
type: string
format: date-time
example: 2026-04-11T08:12:30Z
server_unix:
type: integer
format: int64
example: 1775895150
server_unix_ms:
type: integer
format: int64
example: 1775895150123
ExchangeRequest:
type: object
required: [game_key, login_provider]
properties:
game_key:
type: string
login_provider:
type: string
example: tap
code:
type: string
description: Optional for code-based login.
login_user_id:
type: string
description: Stable user identifier from client-verified provider login.
device_id:
type: string
client_version:
type: string
nickname:
type: string
description: Optional profile nickname to sync into project account.
avatar_url:
type: string
description: Optional profile avatar URL to sync into project account.
profile_json:
type: object
additionalProperties: true
description: Optional extra profile payload to sync into project account.
AdminLoginRequest:
type: object
required: [username, password]
properties:
username:
type: string
password:
type: string
CreateProjectRequest:
type: object
required: [name]
properties:
name:
type: string
current_version:
type: string
status:
type: string
maintenance_mode:
type: boolean
maintenance_message:
type: string
min_client_version:
type: string
max_archive_size_bytes:
type: integer
format: int64
max_archive_slots:
type: integer
UpdateProjectRequest:
type: object
properties:
name:
type: string
current_version:
type: string
status:
type: string
maintenance_mode:
type: boolean
maintenance_message:
type: string
min_client_version:
type: string
max_archive_size_bytes:
type: integer
format: int64
max_archive_slots:
type: integer
UpsertCurrentConfigRequest:
type: object
required: [project_id]
properties:
project_id:
type: integer
format: int64
feature_flags:
type: object
additionalProperties: true
dynamic_config:
type: object
additionalProperties: true
status:
type: string
CreateAnnouncementRequest:
type: object
required: [project_id, title, content, start_at, end_at]
properties:
project_id:
type: integer
format: int64
title:
type: string
content:
type: string
content_type:
type: string
start_at:
type: string
format: date-time
end_at:
type: string
format: date-time
status:
type: string
UpdateAnnouncementRequest:
type: object
properties:
title:
type: string
content:
type: string
content_type:
type: string
start_at:
type: string
format: date-time
end_at:
type: string
format: date-time
status:
type: string
BanPlayerRequest:
type: object
properties:
reason:
type: string
ban_until:
type: string
format: date-time
permanent:
type: boolean
CreateRankRequest:
type: object
required: [project_id, name]
properties:
project_id:
type: integer
format: int64
name:
type: string
status:
type: string
group_id:
type: integer
format: int64
rank_mode:
type: string
timezone:
type: string
snapshot_enabled:
type: boolean
update_strategy:
type: string
sort_order:
type: string
reset_hour:
type: integer
reset_minute:
type: integer
weekly_reset_day:
type: integer
monthly_reset_day:
type: integer
blacklist_player_ids:
type: array
items:
type: string
UpdateRankRequest:
type: object
properties:
name:
type: string
status:
type: string
group_id:
type: integer
format: int64
clear_group:
type: boolean
rank_mode:
type: string
timezone:
type: string
snapshot_enabled:
type: boolean
update_strategy:
type: string
sort_order:
type: string
reset_hour:
type: integer
reset_minute:
type: integer
weekly_reset_day:
type: integer
monthly_reset_day:
type: integer
blacklist_player_ids:
type: array
items:
type: string
AdminRankLeaderboardItem:
type: object
properties:
rank:
type: integer
format: int64
player_id:
type: string
project_account_id:
type: string
login_provider:
type: string
login_user_id:
type: string
score:
type: integer
format: int64
nickname:
type: string
avatar_url:
type: string
AdminRankLeaderboardResult:
type: object
properties:
rank_key:
type: string
leaderboard_key:
type: string
total:
type: integer
format: int64
page:
type: integer
page_size:
type: integer
filter_player_id:
type: string
items:
type: array
items:
$ref: '#/components/schemas/AdminRankLeaderboardItem'
AdminRankDeletePlayerRecordResult:
type: object
properties:
rank_key:
type: string
player_id:
type: string
leaderboard_key:
type: string
removed:
type: integer
format: int64
AdminRankResetLeaderboardResult:
type: object
properties:
rank_key:
type: string
leaderboard_key:
type: string
removed:
type: integer
format: int64
CreateRankGroupRequest:
type: object
required: [project_id, name]
properties:
project_id:
type: integer
format: int64
name:
type: string
sort_order:
type: integer
UpdateRankGroupRequest:
type: object
properties:
name:
type: string
sort_order:
type: integer
ScoreRequest:
type: object
required: [score]
properties:
score:
type: integer
format: int64
SpaceContentUploadRequest:
type: object
required: [file]
properties:
base_version:
type: integer
format: int64
description: Optimistic lock base version. Use 0 for the first upload.
content_type:
type: string
description: Optional MIME type. Defaults to application/octet-stream when omitted.
checksum:
type: string
description: Optional SHA-256 hex checksum. When provided, the server validates it before saving.
file:
type: string
format: binary
SpaceMetadata:
type: object
properties:
project_account_id:
type: string
player_id:
type: string
login_provider:
type: string
login_user_id:
type: string
nickname:
type: string
avatar_url:
type: string
content_exists:
type: boolean
content_version:
type: integer
format: int64
content_type:
type: string
content_size_bytes:
type: integer
format: int64
content_checksum:
type: string
like_count:
type: integer
format: int64
today_like_count:
type: integer
format: int64
visit_count:
type: integer
format: int64
liked_by_me:
type: boolean
like_reset_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
nullable: true
SpaceStats:
type: object
properties:
project_account_id:
type: string
player_id:
type: string
login_provider:
type: string
login_user_id:
type: string
nickname:
type: string
avatar_url:
type: string
content_exists:
type: boolean
content_version:
type: integer
format: int64
content_type:
type: string
content_size_bytes:
type: integer
format: int64
content_checksum:
type: string
like_count:
type: integer
format: int64
today_like_count:
type: integer
format: int64
visit_count:
type: integer
format: int64
like_reset_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
nullable: true
SpaceContentUpdateResult:
type: object
properties:
player_id:
type: string
content_version:
type: integer
format: int64
content_type:
type: string
content_size_bytes:
type: integer
format: int64
content_checksum:
type: string
updated_at:
type: string
format: date-time
SpaceLikeResult:
type: object
properties:
liked:
type: boolean
created:
type: boolean
liked_by_me:
type: boolean
like_count:
type: integer
format: int64
today_like_count:
type: integer
format: int64
like_reset_at:
type: string
format: date-time
SpaceVisitItem:
type: object
properties:
visitor_player_id:
type: string
nickname:
type: string
avatar_url:
type: string
visited_at:
type: string
format: date-time
SpaceLikeItem:
type: object
properties:
player_id:
type: string
nickname:
type: string
avatar_url:
type: string
created_at:
type: string
format: date-time
SpaceLikeListResponse:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/SpaceLikeItem'
paths:
/client/time:
get:
tags: [time]
summary: Get platform server time
responses:
'200':
description: Current platform UTC time
content:
application/json:
schema:
type: object
properties:
code:
type: integer
example: 0
message:
type: string
example: ok
data:
$ref: '#/components/schemas/ClientTimePayload'
'429': { description: Rate limited }
'500': { description: Rate limit unavailable }
/client/bootstrap:
get:
tags: [bootstrap]
summary: Get startup config
parameters:
- in: query
name: game_key
required: true
schema: { type: string }
- in: query
name: client_version
required: false
schema: { type: string }
- in: query
name: device_id
schema: { type: string }
responses:
'200': { description: Bootstrap payload }
/auth/login/exchange:
post:
tags: [auth]
summary: Exchange login provider identity for Brisk token
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ExchangeRequest'
responses:
'200': { description: Login success }
'403': { description: Player banned }
'429': { description: Rate limited }
/auth/logout:
post:
tags: [auth]
security: [{ bearerAuth: [] }]
summary: Logout current session
responses:
'200': { description: Logout success }
/player/me:
get:
tags: [player]
security: [{ bearerAuth: [] }]
summary: Get current player
responses:
'200': { description: Player info }
/config/current:
get:
tags: [config]
summary: Get current dynamic config
parameters:
- in: query
name: game_key
required: true
schema: { type: string }
- in: query
name: client_version
required: false
schema: { type: string }
responses:
'200': { description: Config payload }
/announcements:
get:
tags: [announcements]
security: [{ bearerAuth: [] }]
summary: List active announcements
responses:
'200': { description: Announcement list }
/announcements/{id}/read:
post:
tags: [announcements]
security: [{ bearerAuth: [] }]
summary: Mark announcement read
parameters:
- in: path
name: id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Read recorded }
/ranks/{rank_key}/top:
get:
tags: [ranks]
security: [{ bearerAuth: [] }]
summary: Get top ranking list
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
- in: query
name: limit
schema: { type: integer }
responses:
'200': { description: Top ranking list }
/ranks/{rank_key}/me:
get:
tags: [ranks]
security: [{ bearerAuth: [] }]
summary: Get current player rank
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
responses:
'200': { description: Player rank }
/ranks/{rank_key}/around-me:
get:
tags: [ranks]
security: [{ bearerAuth: [] }]
summary: Get nearby ranking items
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
- in: query
name: range
schema: { type: integer }
responses:
'200': { description: Nearby ranks }
/ranks/{rank_key}/score:
post:
tags: [ranks]
security: [{ bearerAuth: [] }]
summary: Submit score, keep only best
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ScoreRequest'
responses:
'200': { description: Score result }
'429': { description: Rate limited }
/ranks/{rank_key}/season/current:
get:
tags: [ranks]
security: [{ bearerAuth: [] }]
summary: Get current season info for rank
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
responses:
'200': { description: Current season info }
/ranks/{rank_key}/history:
get:
tags: [ranks]
security: [{ bearerAuth: [] }]
summary: Get rank season history
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
- in: query
name: limit
schema: { type: integer }
responses:
'200': { description: Rank season history }
/ranks/{rank_key}/history/{season_id}:
get:
tags: [ranks]
security: [{ bearerAuth: [] }]
summary: Get rank history detail by season
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
- in: path
name: season_id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Rank season detail }
/archives/slot/1/meta:
get:
tags: [archives]
security: [{ bearerAuth: [] }]
summary: Get single-slot archive metadata
responses:
'200': { description: Archive metadata }
/archives/slots:
get:
tags: [archives]
security: [{ bearerAuth: [] }]
summary: List archive slots
responses:
'200': { description: Archive slot list }
/archives/slot/{slot_no}/meta:
get:
tags: [archives]
security: [{ bearerAuth: [] }]
summary: Get archive metadata by slot
parameters:
- in: path
name: slot_no
required: true
schema: { type: integer }
responses:
'200': { description: Archive metadata }
/archives/slot/1/upload:
post:
tags: [archives]
security: [{ bearerAuth: [] }]
summary: Upload single-slot archive
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required: [base_version, checksum, file]
properties:
base_version:
type: integer
checksum:
type: string
file:
type: string
format: binary
responses:
'200': { description: Upload success }
'409': { description: Version conflict }
'429': { description: Rate limited }
/archives/slot/{slot_no}/upload:
post:
tags: [archives]
security: [{ bearerAuth: [] }]
summary: Upload archive by slot
parameters:
- in: path
name: slot_no
required: true
schema: { type: integer }
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required: [base_version, checksum, file]
properties:
base_version:
type: integer
checksum:
type: string
file:
type: string
format: binary
responses:
'200': { description: Upload success }
'409': { description: Version conflict }
'429': { description: Rate limited }
/archives/slot/1/download:
get:
tags: [archives]
security: [{ bearerAuth: [] }]
summary: Download single-slot archive
responses:
'200': { description: Binary archive stream }
/archives/slot/{slot_no}/download:
get:
tags: [archives]
security: [{ bearerAuth: [] }]
summary: Download archive by slot
parameters:
- in: path
name: slot_no
required: true
schema: { type: integer }
responses:
'200': { description: Binary archive stream }
/spaces/{player_id}:
get:
tags: [spaces]
security: [{ bearerAuth: [] }]
summary: Get player space metadata
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
- in: query
name: login_provider
schema: { type: string }
description: Optional target login provider. When present, login_user_id is also required and overrides player_id lookup.
- in: query
name: login_user_id
schema: { type: string }
description: Optional target login user id used with login provider lookup.
responses:
'200':
description: Space metadata
content:
application/json:
schema:
$ref: '#/components/schemas/SpaceMetadata'
/spaces/{player_id}/content:
get:
tags: [spaces]
security: [{ bearerAuth: [] }]
summary: Download player space content
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
- in: query
name: login_provider
schema: { type: string }
description: Optional target login provider. When present, login_user_id is also required and overrides player_id lookup.
- in: query
name: login_user_id
schema: { type: string }
description: Optional target login user id used with login provider lookup.
responses:
'200':
description: Binary space content stream
headers:
X-Space-Version:
schema:
type: integer
format: int64
X-Space-Checksum:
schema:
type: string
content:
application/octet-stream:
schema:
type: string
format: binary
/spaces/{player_id}/stats:
get:
tags: [spaces]
security: [{ bearerAuth: [] }]
summary: Get player space stats
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
- in: query
name: login_provider
schema: { type: string }
- in: query
name: login_user_id
schema: { type: string }
responses:
'200':
description: Space stats
content:
application/json:
schema:
$ref: '#/components/schemas/SpaceStats'
/spaces/{player_id}/likes:
get:
tags: [spaces]
security: [{ bearerAuth: [] }]
summary: Get player space likes
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
- in: query
name: login_provider
schema: { type: string }
- in: query
name: login_user_id
schema: { type: string }
- in: query
name: limit
schema: { type: integer }
- in: query
name: scope
schema:
type: string
enum: [history, cycle]
default: history
description: Whether to list historical likes or only likes from the current daily cycle.
responses:
'200':
description: Space likes
content:
application/json:
schema:
$ref: '#/components/schemas/SpaceLikeListResponse'
/spaces/me/content:
put:
tags: [spaces]
security: [{ bearerAuth: [] }]
summary: Upload my space content
requestBody:
required: true
content:
multipart/form-data:
schema:
$ref: '#/components/schemas/SpaceContentUploadRequest'
responses:
'200':
description: Space content updated
content:
application/json:
schema:
$ref: '#/components/schemas/SpaceContentUpdateResult'
'409': { description: Version conflict }
/spaces/{player_id}/like:
post:
tags: [spaces]
security: [{ bearerAuth: [] }]
summary: Like player space
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
- in: query
name: login_provider
schema: { type: string }
- in: query
name: login_user_id
schema: { type: string }
responses:
'200':
description: Liked
content:
application/json:
schema:
$ref: '#/components/schemas/SpaceLikeResult'
'429': { description: Rate limited }
delete:
tags: [spaces]
security: [{ bearerAuth: [] }]
summary: Unlike player space
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
- in: query
name: login_provider
schema: { type: string }
- in: query
name: login_user_id
schema: { type: string }
responses:
'200':
description: Unliked
content:
application/json:
schema:
$ref: '#/components/schemas/SpaceLikeResult'
'429': { description: Rate limited }
/spaces/by-login:
get:
tags: [spaces]
security: [{ bearerAuth: [] }]
summary: Get player space metadata by login identity
parameters:
- in: query
name: login_provider
required: true
schema: { type: string }
- in: query
name: login_user_id
required: true
schema: { type: string }
responses:
'200':
description: Space metadata
content:
application/json:
schema:
$ref: '#/components/schemas/SpaceMetadata'
/spaces/by-login/content:
get:
tags: [spaces]
security: [{ bearerAuth: [] }]
summary: Download player space content by login identity
parameters:
- in: query
name: login_provider
required: true
schema: { type: string }
- in: query
name: login_user_id
required: true
schema: { type: string }
responses:
'200':
description: Binary space content stream
headers:
X-Space-Version:
schema:
type: integer
format: int64
X-Space-Checksum:
schema:
type: string
content:
application/octet-stream:
schema:
type: string
format: binary
/spaces/by-login/stats:
get:
tags: [spaces]
security: [{ bearerAuth: [] }]
summary: Get player space stats by login identity
parameters:
- in: query
name: login_provider
required: true
schema: { type: string }
- in: query
name: login_user_id
required: true
schema: { type: string }
responses:
'200':
description: Space stats
content:
application/json:
schema:
$ref: '#/components/schemas/SpaceStats'
/spaces/by-login/likes:
get:
tags: [spaces]
security: [{ bearerAuth: [] }]
summary: Get player space likes by login identity
parameters:
- in: query
name: login_provider
required: true
schema: { type: string }
- in: query
name: login_user_id
required: true
schema: { type: string }
- in: query
name: limit
schema: { type: integer }
- in: query
name: scope
schema:
type: string
enum: [history, cycle]
default: history
description: Whether to list historical likes or only likes from the current daily cycle.
responses:
'200':
description: Space likes
content:
application/json:
schema:
$ref: '#/components/schemas/SpaceLikeListResponse'
/spaces/by-login/like:
post:
tags: [spaces]
security: [{ bearerAuth: [] }]
summary: Like player space by login identity
parameters:
- in: query
name: login_provider
required: true
schema: { type: string }
- in: query
name: login_user_id
required: true
schema: { type: string }
responses:
'200':
description: Liked
content:
application/json:
schema:
$ref: '#/components/schemas/SpaceLikeResult'
'429': { description: Rate limited }
delete:
tags: [spaces]
security: [{ bearerAuth: [] }]
summary: Unlike player space by login identity
parameters:
- in: query
name: login_provider
required: true
schema: { type: string }
- in: query
name: login_user_id
required: true
schema: { type: string }
responses:
'200':
description: Unliked
content:
application/json:
schema:
$ref: '#/components/schemas/SpaceLikeResult'
'429': { description: Rate limited }
/spaces/me/visits:
get:
tags: [spaces]
security: [{ bearerAuth: [] }]
summary: Get recent visitors
parameters:
- in: query
name: limit
schema: { type: integer, default: 50 }
description: Optional page size. Defaults to 50 and is capped at 100.
responses:
'200':
description: Visitor list
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/SpaceVisitItem'
/admin/auth/login:
post:
tags: [admin-auth]
summary: Admin login
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AdminLoginRequest'
responses:
'200': { description: Admin login success }
'429': { description: Rate limited }
/admin/audit-logs:
get:
tags: [admin-audit]
security: [{ bearerAuth: [] }]
summary: List audit logs
parameters:
- in: query
name: action
schema: { type: string }
- in: query
name: resource_type
schema: { type: string }
- in: query
name: username
schema: { type: string }
- in: query
name: limit
schema: { type: integer }
responses:
'200': { description: Audit log list }
/admin/projects:
get:
tags: [admin-projects]
security: [{ bearerAuth: [] }]
summary: List projects
responses:
'200': { description: Project list }
post:
tags: [admin-projects]
security: [{ bearerAuth: [] }]
summary: Create project
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateProjectRequest'
responses:
'200': { description: Project created }
/admin/projects/{id}:
get:
tags: [admin-projects]
security: [{ bearerAuth: [] }]
summary: Get project detail
parameters:
- in: path
name: id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Project detail }
put:
tags: [admin-projects]
security: [{ bearerAuth: [] }]
summary: Update project
parameters:
- in: path
name: id
required: true
schema: { type: integer, format: int64 }
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateProjectRequest'
responses:
'200': { description: Project updated }
/admin/projects/{id}/icon:
get:
tags: [admin-projects]
security: [{ bearerAuth: [] }]
summary: Get project icon
parameters:
- in: path
name: id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Project icon stream }
post:
tags: [admin-projects]
security: [{ bearerAuth: [] }]
summary: Upload project icon
parameters:
- in: path
name: id
required: true
schema: { type: integer, format: int64 }
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required: [file]
properties:
file:
type: string
format: binary
responses:
'200': { description: Project icon uploaded }
/admin/configs/current:
get:
tags: [admin-configs]
security: [{ bearerAuth: [] }]
summary: Get current dynamic config for project
parameters:
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Current config }
put:
tags: [admin-configs]
security: [{ bearerAuth: [] }]
summary: Save current dynamic config for project
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpsertCurrentConfigRequest'
responses:
'200': { description: Config saved }
/admin/announcements:
get:
tags: [admin-announcements]
security: [{ bearerAuth: [] }]
summary: List announcements
parameters:
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
- in: query
name: status
schema: { type: string }
responses:
'200': { description: Announcement list }
post:
tags: [admin-announcements]
security: [{ bearerAuth: [] }]
summary: Create announcement
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateAnnouncementRequest'
responses:
'200': { description: Announcement created }
/admin/announcements/{id}:
get:
tags: [admin-announcements]
security: [{ bearerAuth: [] }]
summary: Get announcement detail
parameters:
- in: path
name: id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Announcement detail }
put:
tags: [admin-announcements]
security: [{ bearerAuth: [] }]
summary: Update announcement
parameters:
- in: path
name: id
required: true
schema: { type: integer, format: int64 }
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateAnnouncementRequest'
responses:
'200': { description: Announcement updated }
delete:
tags: [admin-announcements]
security: [{ bearerAuth: [] }]
summary: Delete announcement
parameters:
- in: path
name: id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Announcement deleted }
/admin/rank-groups:
get:
tags: [admin-rank-groups]
security: [{ bearerAuth: [] }]
summary: List rank groups
parameters:
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Rank groups }
post:
tags: [admin-rank-groups]
security: [{ bearerAuth: [] }]
summary: Create rank group
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateRankGroupRequest'
responses:
'200': { description: Rank group created }
/admin/rank-groups/{id}:
put:
tags: [admin-rank-groups]
security: [{ bearerAuth: [] }]
summary: Update rank group
parameters:
- in: path
name: id
required: true
schema: { type: integer, format: int64 }
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateRankGroupRequest'
responses:
'200': { description: Rank group updated }
delete:
tags: [admin-rank-groups]
security: [{ bearerAuth: [] }]
summary: Delete rank group
parameters:
- in: path
name: id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Rank group deleted }
/admin/ranks:
get:
tags: [admin-ranks]
security: [{ bearerAuth: [] }]
summary: List rank definitions
parameters:
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Rank definitions }
post:
tags: [admin-ranks]
security: [{ bearerAuth: [] }]
summary: Create rank definition
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateRankRequest'
responses:
'200': { description: Rank created }
/admin/ranks/{rank_key}:
get:
tags: [admin-ranks]
security: [{ bearerAuth: [] }]
summary: Get rank definition detail
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Rank detail }
put:
tags: [admin-ranks]
security: [{ bearerAuth: [] }]
summary: Update rank definition
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateRankRequest'
responses:
'200': { description: Rank updated }
delete:
tags: [admin-ranks]
security: [{ bearerAuth: [] }]
summary: Delete rank definition
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Rank deleted }
/admin/ranks/{rank_key}/players/{player_id}:
delete:
tags: [admin-ranks]
security: [{ bearerAuth: [] }]
summary: Delete current leaderboard record by player id
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
- in: path
name: player_id
required: true
schema: { type: string }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200':
description: Rank player record removed
content:
application/json:
schema:
$ref: '#/components/schemas/AdminRankDeletePlayerRecordResult'
/admin/ranks/{rank_key}/leaderboard:
get:
tags: [admin-ranks]
security: [{ bearerAuth: [] }]
summary: Get current live leaderboard with pagination and filters
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
- in: query
name: page
schema: { type: integer, default: 1 }
- in: query
name: page_size
schema: { type: integer, default: 20 }
- in: query
name: player_id
schema: { type: string }
- in: query
name: project_account_id
schema: { type: string }
- in: query
name: login_provider
schema: { type: string }
- in: query
name: login_provider
schema: { type: string }
- in: query
name: login_user_id
schema: { type: string }
responses:
'200':
description: Current leaderboard snapshot
content:
application/json:
schema:
$ref: '#/components/schemas/AdminRankLeaderboardResult'
/admin/ranks/{rank_key}/reset:
post:
tags: [admin-ranks]
security: [{ bearerAuth: [] }]
summary: Reset current live leaderboard data for rank
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200':
description: Current leaderboard reset result
content:
application/json:
schema:
$ref: '#/components/schemas/AdminRankResetLeaderboardResult'
/admin/ranks/{rank_key}/seasons:
get:
tags: [admin-ranks]
security: [{ bearerAuth: [] }]
summary: List rank seasons
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
- in: query
name: limit
schema: { type: integer }
responses:
'200': { description: Rank seasons }
/admin/ranks/{rank_key}/seasons/{season_id}/logs:
get:
tags: [admin-ranks]
security: [{ bearerAuth: [] }]
summary: List rank settlement logs
parameters:
- in: path
name: rank_key
required: true
schema: { type: string }
- in: path
name: season_id
required: true
schema: { type: integer, format: int64 }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
- in: query
name: limit
schema: { type: integer }
responses:
'200': { description: Settlement logs }
/admin/archives/overview:
get:
tags: [admin-archives]
security: [{ bearerAuth: [] }]
summary: Get archive overview
parameters:
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Archive overview }
/admin/archives:
get:
tags: [admin-archives]
security: [{ bearerAuth: [] }]
summary: List archive players
parameters:
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
- in: query
name: player_id
schema: { type: string }
- in: query
name: project_account_id
schema: { type: string }
- in: query
name: limit
schema: { type: integer }
responses:
'200': { description: Archive player list }
/admin/archives/{player_id}:
get:
tags: [admin-archives]
security: [{ bearerAuth: [] }]
summary: Get archive slots by player
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Archive detail }
/admin/archives/{player_id}/slots/{slot_no}/download:
get:
tags: [admin-archives]
security: [{ bearerAuth: [] }]
summary: Download archive slot
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
- in: path
name: slot_no
required: true
schema: { type: integer }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Archive file stream }
/admin/archives/{player_id}/slots/{slot_no}:
delete:
tags: [admin-archives]
security: [{ bearerAuth: [] }]
summary: Delete archive slot
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
- in: path
name: slot_no
required: true
schema: { type: integer }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Archive slot deleted }
/admin/players:
get:
tags: [admin-players]
security: [{ bearerAuth: [] }]
summary: List players
parameters:
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
- in: query
name: player_id
schema: { type: string }
- in: query
name: project_account_id
schema: { type: string }
- in: query
name: login_user_id
schema: { type: string }
responses:
'200': { description: Player list }
/admin/players/{player_id}:
get:
tags: [admin-players]
security: [{ bearerAuth: [] }]
summary: Get player detail
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Player detail }
/admin/players/{player_id}/ban:
post:
tags: [admin-players]
security: [{ bearerAuth: [] }]
summary: Ban player
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/BanPlayerRequest'
responses:
'200': { description: Player banned }
/admin/players/{player_id}/unban:
post:
tags: [admin-players]
security: [{ bearerAuth: [] }]
summary: Unban player
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
responses:
'200': { description: Player unbanned }
/admin/spaces/overview:
get:
tags: [admin-spaces]
security: [{ bearerAuth: [] }]
summary: Get space module overview
parameters:
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Space overview }
/admin/spaces:
get:
tags: [admin-spaces]
security: [{ bearerAuth: [] }]
summary: List player spaces
parameters:
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
- in: query
name: player_id
schema: { type: string }
- in: query
name: limit
schema: { type: integer }
responses:
'200': { description: Space list }
/admin/spaces/{player_id}:
get:
tags: [admin-spaces]
security: [{ bearerAuth: [] }]
summary: Get player space metadata detail
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200': { description: Space detail }
/admin/spaces/{player_id}/content:
get:
tags: [admin-spaces]
security: [{ bearerAuth: [] }]
summary: Download player space content
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
responses:
'200':
description: Binary space content stream
headers:
X-Space-Version:
schema:
type: integer
format: int64
X-Space-Checksum:
schema:
type: string
content:
application/octet-stream:
schema:
type: string
format: binary
/admin/spaces/{player_id}/likes:
get:
tags: [admin-spaces]
security: [{ bearerAuth: [] }]
summary: Get player space likes
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
- in: query
name: limit
schema: { type: integer }
responses:
'200': { description: Space likes }
/admin/spaces/{player_id}/visits:
get:
tags: [admin-spaces]
security: [{ bearerAuth: [] }]
summary: Get player space visits
parameters:
- in: path
name: player_id
required: true
schema: { type: string }
- in: query
name: project_id
required: true
schema: { type: integer, format: int64 }
- in: query
name: limit
schema: { type: integer }
responses:
'200': { description: Space visits }