# 공개 API 문서 (Public API Documentation) 이 문서는 코드 기준으로 확인 가능한 공개 엔드포인트(public endpoints)를 외부 공개용 문서 형식으로 정리한 것입니다. 라우팅 정의는 `Libraries/SPTarkov.Server.Core/Routers` 하위와 테스트 모드(TestMod)의 MVC 컨트롤러를 기준으로 합니다. ## 기본 정보 (Basics) - 기본 URL(Base URL): `https://{HttpConfig.Ip}:{HttpConfig.Port}` - 지원 메서드(Supported Methods): `GET`, `POST`, `PUT` 서버는 메서드(method)를 구분하지 않고 라우팅(route)만으로 처리합니다. - 요청/응답 형식(Request/Response): 대부분 JSON(JSON)이며, 번들(bundle)/이미지(image)는 파일 응답(file response)입니다. - 세션(Session): `PHPSESSID` 쿠키(cookie)가 있을 경우 플레이어 컨텍스트(player context)로 처리됩니다. ## 라우팅 규칙 (Routing Rules) - **정적 라우트(Static Route)**: URL이 정확히 일치(exact match)해야 처리됩니다. - **동적 라우트(Dynamic Route)**: URL에 부분 일치(partial match)하면 처리됩니다. 예: `/client/locale/`는 `/client/locale/en`에도 매칭됩니다. --- ## API 목록 (API Catalog) ### Achievements API - `/client/achievement/list` 역할(Role): 업적 목록 조회(get achievements) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/achievement/statistic` 역할(Role): 업적 통계 조회(get achievement statistics) 사용법(Usage): 요청 바디 없음(EmptyRequestData) ### Bots API - `/client/game/bot/generate` 역할(Role): 봇 생성(generate bots) 사용법(Usage): 요청 바디 `GenerateBotsRequestData` ### Builds API - `/client/builds/list` 역할(Role): 프리셋 목록 조회(get builds) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/builds/magazine/save` 역할(Role): 탄창 프리셋 저장(create magazine template) 사용법(Usage): 요청 바디 `SetMagazineRequest` - `/client/builds/weapon/save` 역할(Role): 무기 프리셋 저장(set weapon build) 사용법(Usage): 요청 바디 `PresetBuildActionRequestData` - `/client/builds/equipment/save` 역할(Role): 장비 프리셋 저장(set equipment build) 사용법(Usage): 요청 바디 `PresetBuildActionRequestData` - `/client/builds/delete` 역할(Role): 프리셋 삭제(delete build) 사용법(Usage): 요청 바디 `RemoveBuildRequestData` ### Bundles API - `/singleplayer/bundles` 역할(Role): 번들 목록 조회(get bundles list) 사용법(Usage): 요청 바디 없음(EmptyRequestData) ### Client Logs API - `/singleplayer/log` 역할(Role): 클라이언트 로그 수집(client log) 사용법(Usage): 요청 바디 `ClientLogRequest` - `/singleplayer/release` 역할(Role): 릴리즈 노트 조회(release notes) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/singleplayer/enableBSGlogging` 역할(Role): BSG 로깅 플래그 처리(BSG logging flag) 사용법(Usage): 요청 바디 없음(EmptyRequestData) ### Customization API - `/client/trading/customization/storage` 역할(Role): 커스터마이징 보관함 조회(get customization unlocks) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/hideout/customization/offer/list` 역할(Role): 은신처 커스터마이징 목록 조회(get hideout customization offers) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/customization/storage` 역할(Role): 커스터마이징 저장소 조회(get customization storage) 사용법(Usage): 요청 바디 없음(EmptyRequestData) ### Data API - `/client/settings` 역할(Role): 설정 조회(get settings) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/globals` 역할(Role): 글로벌 데이터 조회(get globals) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/items` 역할(Role): 아이템 템플릿 조회(get template items) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/handbook/templates` 역할(Role): 핸드북 템플릿 조회(get handbook templates) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/customization` 역할(Role): 커스터마이징 템플릿 조회(get template suits) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/account/customization` 역할(Role): 캐릭터 커스터마이징 템플릿 조회(get template character) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/hideout/production/recipes` 역할(Role): 은신처 제작 레시피 조회(get hideout production recipes) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/hideout/settings` 역할(Role): 은신처 설정 조회(get hideout settings) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/hideout/areas` 역할(Role): 은신처 구역 조회(get hideout areas) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/languages` 역할(Role): 언어 목록 조회(get locale languages) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/hideout/qte/list` 역할(Role): QTE 목록 조회(get QTE list) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/dialogue` 역할(Role): 대화 데이터 조회(get dialogue) 사용법(Usage): 요청 바디 `GetClientDialogueRequestData` ### Dialogue/Friends API - `/client/chatServer/list` 역할(Role): 채팅 서버 목록 조회(get chat server list) 사용법(Usage): 요청 바디 `GetChatServerListRequestData` - `/client/mail/dialog/list` 역할(Role): 메일 대화 목록 조회(get mail dialog list) 사용법(Usage): 요청 바디 `GetMailDialogListRequestData` - `/client/mail/dialog/view` 역할(Role): 메일 대화 조회(get mail dialog view) 사용법(Usage): 요청 바디 `GetMailDialogViewRequestData` - `/client/mail/dialog/info` 역할(Role): 메일 대화 정보 조회(get mail dialog info) 사용법(Usage): 요청 바디 `GetMailDialogInfoRequestData` - `/client/mail/dialog/remove` 역할(Role): 메일 대화 삭제(remove dialog) 사용법(Usage): 요청 바디 `RemoveDialogRequestData` - `/client/mail/dialog/pin` 역할(Role): 메일 대화 고정(pin dialog) 사용법(Usage): 요청 바디 `PinDialogRequestData` - `/client/mail/dialog/unpin` 역할(Role): 메일 대화 고정 해제(unpin dialog) 사용법(Usage): 요청 바디 `PinDialogRequestData` - `/client/mail/dialog/read` 역할(Role): 메일 읽음 처리(set dialog read) 사용법(Usage): 요청 바디 `SetDialogReadRequestData` - `/client/mail/dialog/getAllAttachments` 역할(Role): 모든 첨부 가져오기(get all attachments) 사용법(Usage): 요청 바디 `GetAllAttachmentsRequestData` - `/client/mail/msg/send` 역할(Role): 메일 메시지 전송(send message) 사용법(Usage): 요청 바디 `SendMessageRequest` - `/client/mail/dialog/clear` 역할(Role): 메일 정리(clear mail) 사용법(Usage): 요청 바디 `ClearMailMessageRequest` - `/client/mail/dialog/group/create` 역할(Role): 그룹 메일 생성(create group mail) 사용법(Usage): 요청 바디 `CreateGroupMailRequest` - `/client/mail/dialog/group/owner/change` 역할(Role): 그룹 메일 소유자 변경(change group mail owner) 사용법(Usage): 요청 바디 `ChangeGroupMailOwnerRequest` - `/client/mail/dialog/group/users/add` 역할(Role): 그룹 메일 사용자 추가(add user to mail group) 사용법(Usage): 요청 바디 `AddUserGroupMailRequest` - `/client/mail/dialog/group/users/remove` 역할(Role): 그룹 메일 사용자 제거(remove user from mail group) 사용법(Usage): 요청 바디 `RemoveUserGroupMailRequest` - `/client/friend/list` 역할(Role): 친구 목록 조회(get friend list) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/friend/request/list/outbox` 역할(Role): 보낸 요청 목록(outbox) 조회(list outbox) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/friend/request/list/inbox` 역할(Role): 받은 요청 목록(inbox) 조회(list inbox) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/friend/request/send` 역할(Role): 친구 요청 전송(send friend request) 사용법(Usage): 요청 바디 `FriendRequestData` - `/client/friend/request/accept-all` 역할(Role): 모든 친구 요청 수락(accept all requests) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/friend/request/accept` 역할(Role): 친구 요청 수락(accept request) 사용법(Usage): 요청 바디 `AcceptFriendRequestData` - `/client/friend/request/decline` 역할(Role): 친구 요청 거절(decline request) 사용법(Usage): 요청 바디 `DeclineFriendRequestData` - `/client/friend/request/cancel` 역할(Role): 친구 요청 취소(cancel request) 사용법(Usage): 요청 바디 `CancelFriendRequestData` - `/client/friend/delete` 역할(Role): 친구 삭제(delete friend) 사용법(Usage): 요청 바디 `DeleteFriendRequest` - `/client/friend/ignore/set` 역할(Role): 친구 차단 설정(ignore friend) 사용법(Usage): 요청 바디 `UIDRequestData` - `/client/friend/ignore/remove` 역할(Role): 친구 차단 해제(unignore friend) 사용법(Usage): 요청 바디 `UIDRequestData` ### Game API - `/client/game/config` 역할(Role): 게임 설정 조회(get game config) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/putHWMetrics` 역할(Role): 하드웨어 지표 전송(put HW metrics) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/game/mode` 역할(Role): 게임 모드 조회(get game mode) 사용법(Usage): 요청 바디 `GameModeRequestData` - `/client/server/list` 역할(Role): 서버 목록 조회(get server list) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/match/group/current` 역할(Role): 현재 그룹 조회(get current group) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/game/version/validate` 역할(Role): 버전 검증(validate game version) 사용법(Usage): 요청 바디 `VersionValidateRequestData` - `/client/game/start` 역할(Role): 게임 시작(start game) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/game/logout` 역할(Role): 로그아웃(logout) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/checkVersion` 역할(Role): 버전 확인(check version) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/game/keepalive` 역할(Role): 세션 유지(keepalive) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/singleplayer/settings/version` 역할(Role): 서버 버전 조회(get server version) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/reports/lobby/send` 역할(Role): 로비 신고 전송(send lobby report) 사용법(Usage): 요청 바디 `UIDRequestData` - `/client/report/send` 역할(Role): 신고 전송(send report) 사용법(Usage): 요청 바디 `UIDRequestData` - `/singleplayer/settings/getRaidTime` 역할(Role): 레이드 시간 설정 조회(get raid time) 사용법(Usage): 요청 바디 `GetRaidTimeRequest` - `/client/survey` 역할(Role): 설문 조회(get survey) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/survey/view` 역할(Role): 설문 상세 조회(get survey view) 사용법(Usage): 요청 바디 `SendSurveyOpinionRequest` - `/client/survey/opinion` 역할(Role): 설문 의견 전송(send survey opinion) 사용법(Usage): 요청 바디 `SendSurveyOpinionRequest` - `/singleplayer/clientmods` 역할(Role): 클라이언트 모드 목록 수신(receive client mods) 사용법(Usage): 요청 바디 `SendClientModsRequest` ### Health API - `/client/hideout/workout` 역할(Role): 은신처 운동 효과 처리(handle workout effects) 사용법(Usage): 요청 바디 `WorkoutData` ### Inraid API - `/raid/profile/scavsave` 역할(Role): 스캐브 진행 저장(save scav progress) 사용법(Usage): 요청 바디 `ScavSaveRequestData` - `/singleplayer/settings/raid/menu` 역할(Role): 레이드 메뉴 설정 조회(get raid menu settings) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/singleplayer/scav/traitorscavhostile` 역할(Role): 배신 스캐브 확률 조회(get traitor scav hostile chance) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/singleplayer/bosstypes` 역할(Role): 보스 타입 목록 조회(get boss types) 사용법(Usage): 요청 바디 없음(EmptyRequestData) ### Insurance API - `/client/insurance/items/list/cost` 역할(Role): 보험 비용 조회(get insurance cost) 사용법(Usage): 요청 바디 `GetInsuranceCostRequestData` ### Item Events API - `/client/game/profile/items/moving` 역할(Role): 아이템 이벤트 처리(handle item events) 사용법(Usage): 요청 바디 `ItemEventRouterRequest` 분기 기준(Action): 아래 **Item Event Actions** 섹션 참고 ### Launcher API - #### 런처 프로필 조회 가이드(Launcher Profile Fetch Guide) - 공통 포맷(Common format) - 요청 헤더(Headers) - `requestcompressed: 0` - `responsecompressed: 0` - `Content-Type: application/json` - 기본(cURL) - `curl -k -X POST "https://{ip}:{port}/{path}" -H "requestcompressed: 0" -H "responsecompressed: 0" -H "Content-Type: application/json" -d ''` - 로그인 과정(Login flow) - 요청(Request) - `POST /launcher/profile/login` - 바디(Body): `{"username":""}` - 응답(Response) - 본문(body)에 세션 아이디(session id) 문자열 반환 (예: `6971f8f02539470025aaafad`) - 예시(Example) - `curl -k -X POST "https://pandoli365.com:5069/launcher/profile/login" -H "requestcompressed: 0" -H "responsecompressed: 0" -H "Content-Type: application/json" -d '{"username":"art"}'` - 프로필 불러오는 방법(Profile fetch) - 로그인 응답으로 받은 세션 아이디(session id)를 쿠키(cookie)로 전달 - 요청(Request) - `POST /launcher/profile/info` - 헤더(Header): `Cookie: PHPSESSID=` - 바디(Body): `{"username":""}` - 예시(Example) - `curl -k -X POST "https://pandoli365.com:5069/launcher/profile/info" -H "requestcompressed: 0" -H "responsecompressed: 0" -H "Content-Type: application/json" -H "Cookie: PHPSESSID=6971f8f02539470025aaafad" -d '{"username":"art"}'` - `/launcher/ping` 역할(Role): 런처 핑(ping) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/launcher/server/connect` 역할(Role): 서버 연결(connect to server) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/launcher/profile/login` 역할(Role): 로그인(login) 사용법(Usage): 요청 바디 `LoginRequestData` - `/launcher/profile/register` 역할(Role): 계정 등록(register) 사용법(Usage): 요청 바디 `RegisterData` - `/launcher/profile/get` 역할(Role): 계정 조회(get profile) 사용법(Usage): 요청 바디 `LoginRequestData` - `/launcher/profiles` 역할(Role): 프로필 목록 조회(get profile list) 사용법(Usage): 요청 바디 없음(EmptyRequestData) 주의(Note): 응답이 압축(compressed)되는 경우가 있어 `responsecompressed: 0` 헤더를 권장 - `/launcher/profile/change/username` 역할(Role): 사용자명 변경(change username) 사용법(Usage): 요청 바디 `ChangeRequestData` - `/launcher/profile/change/wipe` 역할(Role): 와이프(wipe) 사용법(Usage): 요청 바디 `RegisterData` - `/launcher/profile/remove` 역할(Role): 계정 삭제(remove profile) 사용법(Usage): 요청 바디 `RemoveProfileData` - `/launcher/profile/compatibleTarkovVersion` 역할(Role): 호환 버전 조회(get compatible version) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/launcher/server/version` 역할(Role): 서버 버전 조회(get server version) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/launcher/server/loadedServerMods` 역할(Role): 서버 로드 모드 목록(get loaded server mods) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/launcher/server/serverModsUsedByProfile` 역할(Role): 프로필 사용 모드 조회(get mods used by profile) 사용법(Usage): 요청 바디 `EmptyRequestData` ### Launcher V2 API - `/launcher/v2/ping` 역할(Role): 런처 v2 핑(ping) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/launcher/v2/types` 역할(Role): 런처 v2 타입 조회(get types) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/launcher/v2/login` 역할(Role): 런처 v2 로그인(login) 사용법(Usage): 요청 바디 `LoginRequestData` - `/launcher/v2/register` 역할(Role): 런처 v2 등록(register) 사용법(Usage): 요청 바디 `RegisterData` - `/launcher/v2/remove` 역할(Role): 런처 v2 계정 삭제(remove) 사용법(Usage): 요청 바디 `LoginRequestData` - `/launcher/v2/version` 역할(Role): 런처 v2 호환 버전 조회(compatible version) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/launcher/v2/mods` 역할(Role): 런처 v2 모드 목록 조회(mods) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/launcher/v2/profiles` 역할(Role): 런처 v2 프로필 목록 조회(profiles) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/launcher/v2/profile` 역할(Role): 런처 v2 프로필 조회(profile) 사용법(Usage): 요청 바디 `LoginRequestData` - `/launcher/v2/wipe` 역할(Role): 런처 v2 와이프(wipe) 사용법(Usage): 요청 바디 `RegisterData` ### Locations API - `/client/locations` 역할(Role): 위치 데이터 조회(get location data) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/airdrop/loot` 역할(Role): 에어드롭 전리품 조회(get airdrop loot) 사용법(Usage): 요청 바디 `GetAirdropLootRequest` (선택/optional) ### Match API - `/client/match/available` 역할(Role): 매치 가능 여부 조회(check availability) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/match/updatePing` 역할(Role): 핑 업데이트(update ping) 사용법(Usage): 요청 바디 `UpdatePingRequestData` - `/client/match/join` 역할(Role): 매치 참가(join match) 사용법(Usage): 요청 바디 `MatchGroupJoinRequest` - `/client/match/exit` 역할(Role): 매치 종료(exit match) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/match/group/delete` 역할(Role): 그룹 삭제(delete group) 사용법(Usage): 요청 바디 `DeleteGroupRequest` - `/client/match/group/leave` 역할(Role): 그룹 탈퇴(leave group) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/match/group/status` 역할(Role): 그룹 상태 조회(get group status) 사용법(Usage): 요청 바디 `MatchGroupStatusRequest` - `/client/match/group/start_game` 역할(Role): 그룹장 게임 시작(start game as group leader) 사용법(Usage): 요청 바디 `MatchGroupStartGameRequest` - `/client/match/group/exit_from_menu` 역할(Role): 메뉴에서 그룹 종료(exit from menu) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/match/group/current` 역할(Role): 현재 그룹 조회(get current group) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/match/group/looking/start` 역할(Role): 그룹 탐색 시작(start group search) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/match/group/looking/stop` 역할(Role): 그룹 탐색 종료(stop group search) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/match/group/invite/send` 역할(Role): 그룹 초대 전송(send invite) 사용법(Usage): 요청 바디 `MatchGroupInviteSendRequest` - `/client/match/group/invite/accept` 역할(Role): 그룹 초대 수락(accept invite) 사용법(Usage): 요청 바디 `RequestIdRequest` - `/client/match/group/invite/decline` 역할(Role): 그룹 초대 거절(decline invite) 사용법(Usage): 요청 바디 `RequestIdRequest` - `/client/match/group/invite/cancel` 역할(Role): 그룹 초대 취소(cancel invite) 사용법(Usage): 요청 바디 `RequestIdRequest` - `/client/match/group/invite/cancel-all` 역할(Role): 모든 그룹 초대 취소(cancel all invites) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/match/group/transfer` 역할(Role): 그룹장 위임(transfer group) 사용법(Usage): 요청 바디 `MatchGroupTransferRequest` - `/client/match/group/raid/ready` 역할(Role): 레이드 준비 완료(raid ready) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/match/group/raid/not-ready` 역할(Role): 레이드 준비 해제(raid not ready) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/putMetrics` 역할(Role): 지표 전송(put metrics) 사용법(Usage): 요청 바디 `PutMetricsRequestData` - `/client/analytics/event-disconnect` 역할(Role): 연결 해제 이벤트 전송(disconnect event) 사용법(Usage): 요청 바디 `PutMetricsRequestData` - `/client/getMetricsConfig` 역할(Role): 지표 설정 조회(get metrics config) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/raid/configuration` 역할(Role): 레이드 구성 조회(get raid configuration) 사용법(Usage): 요청 바디 `GetRaidConfigurationRequestData` - `/client/raid/configuration-by-profile` 역할(Role): 프로필 기반 레이드 구성 조회(get configuration by profile) 사용법(Usage): 요청 바디 `GetRaidConfigurationRequestData` - `/client/match/group/player/remove` 역할(Role): 그룹 플레이어 제거(remove player from group) 사용법(Usage): 요청 바디 `MatchGroupPlayerRemoveRequest` - `/client/match/local/start` 역할(Role): 로컬 레이드 시작(start local raid) 사용법(Usage): 요청 바디 `StartLocalRaidRequestData` - `/client/match/local/end` 역할(Role): 로컬 레이드 종료(end local raid) 사용법(Usage): 요청 바디 `EndLocalRaidRequestData` ### Modded Trader Customization API - `/singleplayer/moddedTraders` 역할(Role): 모드 트레이더 커스터마이징 조회(get modded trader customization) 사용법(Usage): 요청 바디 없음(EmptyRequestData) ### Notifier API - `/client/notifier/channel/create` 역할(Role): 노티파이어 채널 생성(create notifier channel) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/game/profile/select` 역할(Role): 프로필 선택(select profile) 사용법(Usage): 요청 바디 `UIDRequestData` ### Prestige API - `/client/prestige/list` 역할(Role): 프레스티지 목록 조회(get prestige list) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/prestige/obtain` 역할(Role): 프레스티지 획득(obtain prestige) 사용법(Usage): 요청 바디 `ObtainPrestigeRequestList` ### Profile API - `/client/game/profile/create` 역할(Role): 프로필 생성(create profile) 사용법(Usage): 요청 바디 `ProfileCreateRequestData` - `/client/game/profile/list` 역할(Role): 프로필 목록 조회(get profile list) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/game/profile/savage/regenerate` 역할(Role): 스캐브 재생성(regenerate scav) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/game/profile/voice/change` 역할(Role): 보이스 변경(change voice) 사용법(Usage): 요청 바디 `ProfileChangeVoiceRequestData` - `/client/game/profile/nickname/change` 역할(Role): 닉네임 변경(change nickname) 사용법(Usage): 요청 바디 `ProfileChangeNicknameRequestData` - `/client/game/profile/nickname/validate` 역할(Role): 닉네임 유효성 검증(validate nickname) 사용법(Usage): 요청 바디 `ValidateNicknameRequestData` - `/client/game/profile/nickname/reserved` 역할(Role): 예약 닉네임 조회(get reserved nickname) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/profile/status` 역할(Role): 프로필 상태 조회(get profile status) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/profile/view` 역할(Role): 다른 프로필 조회(get other profile) 사용법(Usage): 요청 바디 `GetOtherProfileRequest` - `/client/profile/settings` 역할(Role): 프로필 설정 조회(get profile settings) 사용법(Usage): 요청 바디 `GetProfileSettingsRequest` - `/client/game/profile/search` 역할(Role): 프로필 검색(search profiles) 사용법(Usage): 요청 바디 `SearchProfilesRequestData` - `/launcher/profile/info` 역할(Role): 미니 프로필 조회(get mini profile) 사용법(Usage): 요청 바디 `GetMiniProfileRequestData` - `/launcher/profiles` 역할(Role): 미니 프로필 목록 조회(get all mini profiles) 사용법(Usage): 요청 바디 없음(EmptyRequestData) ### Quest API - `/client/quest/list` 역할(Role): 퀘스트 목록 조회(list quests) 사용법(Usage): 요청 바디 `ListQuestsRequestData` - `/client/repeatalbeQuests/activityPeriods` 역할(Role): 반복 퀘스트 기간 조회(get repeatable quest activity periods) 사용법(Usage): 요청 바디 없음(EmptyRequestData) ### Ragfair API - `/client/ragfair/search` 역할(Role): 플리마켓 검색(search ragfair) 사용법(Usage): 요청 바디 `SearchRequestData` - `/client/ragfair/find` 역할(Role): 플리마켓 검색(search ragfair) 사용법(Usage): 요청 바디 `SearchRequestData` - `/client/ragfair/itemMarketPrice` 역할(Role): 시세 조회(get market price) 사용법(Usage): 요청 바디 `GetMarketPriceRequestData` - `/client/ragfair/offerfees` 역할(Role): 등록 수수료 계산(store offer fee) 사용법(Usage): 요청 바디 `StorePlayerOfferTaxAmountRequestData` - `/client/reports/ragfair/send` 역할(Role): 플리마켓 신고 전송(send ragfair report) 사용법(Usage): 요청 바디 `SendRagfairReportRequestData` - `/client/items/prices` 역할(Role): 플리마켓 가격 조회(get flea prices) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/ragfair/offer/findbyid` 역할(Role): 오퍼 조회(find offer by id) 사용법(Usage): 요청 바디 `GetRagfairOfferByIdRequest` ### Trader API - `/client/trading/api/traderSettings` 역할(Role): 트레이더 설정 조회(get trader settings) 사용법(Usage): 요청 바디 없음(EmptyRequestData) ### Weather API - `/client/weather` 역할(Role): 날씨 조회(get weather) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/localGame/weather` 역할(Role): 로컬 게임 날씨 조회(get local weather) 사용법(Usage): 요청 바디 없음(EmptyRequestData) --- ## 동적 라우트 API (Dynamic Routes) 동적 라우트(dynamic routes)는 아래 경로(prefix)로 매칭됩니다. ### Bots Dynamic API - `/singleplayer/settings/bot/limit/` 역할(Role): 봇 제한 조회(get bot limit) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/singleplayer/settings/bot/difficulty/` 역할(Role): 봇 난이도 조회(get bot difficulty) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/singleplayer/settings/bot/difficulties` 역할(Role): 전체 난이도 목록 조회(get all bot difficulties) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/singleplayer/settings/bot/maxCap` 역할(Role): 봇 최대치 조회(get bot cap) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/singleplayer/settings/bot/getBotBehaviours/` 역할(Role): 봇 행동 조회(get bot behaviours) 사용법(Usage): 요청 바디 없음(EmptyRequestData) ### Bundle Dynamic API - `/files/bundle` 역할(Role): 번들 파일 제공(get bundle file) 사용법(Usage): 요청 바디 없음(EmptyRequestData) ### Customization Dynamic API - `/client/trading/customization/` 역할(Role): 트레이더 슈트 조회(get trader suits) 사용법(Usage): 요청 바디 없음(EmptyRequestData) ### Data Dynamic API - `/client/menu/locale/` 역할(Role): 메뉴 로케일 조회(get menu locale) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/locale/` 역할(Role): 로케일 조회(get locale) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/items/prices/` 역할(Role): 아이템 가격 조회(get item prices) 사용법(Usage): 요청 바디 없음(EmptyRequestData) ### Inraid Dynamic API - `/client/location/getLocalloot` 역할(Role): 로컬 루트 등록(register local loot) 사용법(Usage): 요청 바디 `RegisterPlayerRequestData` ### Notifier Dynamic API - `/?last_id` 역할(Role): 노티파이어 폴링(notifier poll) 사용법(Usage): 요청 바디 없음(EmptyRequestData), 경로 패턴(path pattern)만 존재 - `/notifierServer` 역할(Role): 노티파이어 폴링(notifier poll) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/push/notifier/get/` 역할(Role): 노티파이어 정보 조회(get notifier) 사용법(Usage): 요청 바디 없음(EmptyRequestData) ### Trader Dynamic API - `/client/trading/api/getTrader/` 역할(Role): 트레이더 조회(get trader) 사용법(Usage): 요청 바디 없음(EmptyRequestData) - `/client/trading/api/getTraderAssort/` 역할(Role): 트레이더 재고 조회(get trader assort) 사용법(Usage): 요청 바디 없음(EmptyRequestData) --- ## Item Event Actions (아이템 이벤트 액션) `/client/game/profile/items/moving`는 `Action` 값에 따라 처리 로직이 분기됩니다. ### Inventory Actions - `Move`, `Remove`, `Split`, `Merge`, `Transfer`, `Swap`, `Fold`, `Toggle` - `Tag`, `Bind`, `Unbind`, `Examine`, `ReadEncyclopedia` - `ApplyInventoryChanges`, `CreateMapMarker`, `DeleteMapMarker`, `EditMapMarker` - `OpenRandomLootContainer`, `HideoutQuickTimeEvent` - `RedeemProfileReward`, `SetFavoriteItems`, `QuestFail`, `PinLock` - `SaveDialogueState` ### Quest Actions - `QuestAccept`, `QuestComplete`, `QuestHandover`, `RepeatableQuestChange` ### Ragfair Actions - `RagFairAddOffer`, `RagFairRemoveOffer`, `RagFairRenewOffer` ### Repair Actions - `Repair`, `TraderRepair` ### Trade Actions - `TradingConfirm`, `RagFairBuyOffer`, `SellAllFromSavage` ### Health Actions - `Eat`, `Heal`, `RestoreHealth` ### Insurance Actions - `Insure` ### Customization Actions - `CustomizationBuy`, `CustomizationSet` ### Note Actions - `AddNote`, `EditNote`, `DeleteNote` ### Wishlist Actions - `AddToWishList`, `RemoveFromWishList`, `ChangeWishlistItemCategory` ### Hideout Actions (HideoutEventActions) - `HideoutUpgrade`, `HideoutUpgradeComplete` - `HideoutPutItemsInAreaSlots`, `HideoutTakeItemsFromAreaSlots`, `HideoutToggleArea` - `HideoutSingleProductionStart`, `HideoutScavCaseProductionStart`, `HideoutContinuousProductionStart` - `HideoutTakeProduction`, `RecordShootingRangePoints`, `HideoutImproveArea` - `HideoutCancelProductionCommand`, `HideoutCircleOfCultistProductionStart` - `HideoutDeleteProductionCommand`, `HideoutCustomizationApply`, `HideoutCustomizationSetMannequinPose` --- ## WebSocket (웹소켓) - `/notifierServer/getwebsocket/{sessionId}` 역할(Role): 노티파이어 웹소켓 연결(websocket connection) 사용법(Usage): `{sessionId}`를 포함한 경로로 접속 --- ## 파일/번들/이미지 (Files/Bundles/Images) - 번들(bundle): `/files/bundle` (동적 라우트, 파일 응답) - 이미지(image): `ImageRouter`는 런타임에 `AddRoute`로 등록된 경로만 처리합니다. 정적 목록은 코드 상에 고정되어 있지 않습니다. --- ## MVC 컨트롤러 예시 (Mod MVC Example) - `GET /test/ping` 역할(Role): 테스트 핑(test ping) 사용법(Usage): 요청 바디 없음 응답 예시(Response Example): ```json "Pong from MVC!" ``` # 공개 엔드포인트 (Public Endpoints) 이 문서는 서버에 노출된 공개 엔드포인트(public endpoints)를 전수조사하여 정리한 레퍼런스입니다. 라우팅 정의는 주로 `Libraries/SPTarkov.Server.Core/Routers` 아래에 있으며, 테스트용 MVC 컨트롤러(MVC controller)는 `Testing/TestMod/Controllers`에 있습니다. ## 기본 URL (Base URL) - `https://{HttpConfig.Ip}:{HttpConfig.Port}` 설정 위치: `Libraries/SPTarkov.Server.Core/Models/Spt/Config/HttpConfig.cs` ## HTTP 메서드 (HTTP Methods) - `SptHttpListener`는 `GET`, `POST`, `PUT` 모두 수용하며, 라우팅 매칭은 메서드(method)를 구분하지 않습니다. 따라서 아래 목록은 **메서드 무관(method-agnostic)** 입니다. ## 라우팅 타입 (Routing Types) - **StaticRouter (정적 라우터)**: URL을 **정확히 일치(exact match)** 시켜 처리합니다. - **DynamicRouter (동적 라우터)**: URL이 **부분 일치(partial match)** 할 때 처리합니다. 예: `/client/locale/`는 `/client/locale/en` 같은 하위 경로(prefix)에도 매칭됩니다. --- ## Static Routes (정적 라우트) ### `AchievementStaticRouter` - `/client/achievement/list` (GetAchievements) - `/client/achievement/statistic` (Statistic) ### `BotStaticRouter` - `/client/game/bot/generate` (GenerateBots) ### `BuildStaticRouter` - `/client/builds/list` (GetBuilds) - `/client/builds/magazine/save` (CreateMagazineTemplate) - `/client/builds/weapon/save` (SetWeapon) - `/client/builds/equipment/save` (SetEquipment) - `/client/builds/delete` (DeleteBuild) ### `BundleStaticRouter` - `/singleplayer/bundles` (GetBundles) ### `ClientLogStaticRouter` - `/singleplayer/log` (ClientLog) - `/singleplayer/release` (ReleaseNotes) - `/singleplayer/enableBSGlogging` (BsgLogging) ### `CustomizationStaticRouter` - `/client/trading/customization/storage` (GetCustomisationUnlocks) - `/client/hideout/customization/offer/list` (GetHideoutCustomisation) - `/client/customization/storage` (GetStorage) ### `DataStaticRouter` - `/client/settings` (GetSettings) - `/client/globals` (GetGlobals) - `/client/items` (GetTemplateItems) - `/client/handbook/templates` (GetTemplateHandbook) - `/client/customization` (GetTemplateSuits) - `/client/account/customization` (GetTemplateCharacter) - `/client/hideout/production/recipes` (GetHideoutProduction) - `/client/hideout/settings` (GetHideoutSettings) - `/client/hideout/areas` (GetHideoutAreas) - `/client/languages` (GetLocalesLanguages) - `/client/hideout/qte/list` (GetQteList) - `/client/dialogue` (GetDialogue) ### `DialogStaticRouter` - `/client/chatServer/list` (GetChatServerList) - `/client/mail/dialog/list` (GetMailDialogList) - `/client/mail/dialog/view` (GetMailDialogView) - `/client/mail/dialog/info` (GetMailDialogInfo) - `/client/mail/dialog/remove` (RemoveDialog) - `/client/mail/dialog/pin` (PinDialog) - `/client/mail/dialog/unpin` (UnpinDialog) - `/client/mail/dialog/read` (SetRead) - `/client/mail/dialog/getAllAttachments` (GetAllAttachments) - `/client/mail/msg/send` (SendMessage) - `/client/mail/dialog/clear` (ClearMail) - `/client/mail/dialog/group/create` (CreateGroupMail) - `/client/mail/dialog/group/owner/change` (ChangeMailGroupOwner) - `/client/mail/dialog/group/users/add` (AddUserToMail) - `/client/mail/dialog/group/users/remove` (RemoveUserFromMail) - `/client/friend/list` (GetFriendList) - `/client/friend/request/list/outbox` (ListOutbox) - `/client/friend/request/list/inbox` (ListInbox) - `/client/friend/request/send` (SendFriendRequest) - `/client/friend/request/accept-all` (AcceptAllFriendRequests) - `/client/friend/request/accept` (AcceptFriendRequest) - `/client/friend/request/decline` (DeclineFriendRequest) - `/client/friend/request/cancel` (CancelFriendRequest) - `/client/friend/delete` (DeleteFriend) - `/client/friend/ignore/set` (IgnoreFriend) - `/client/friend/ignore/remove` (UnIgnoreFriend) ### `GameStaticRouter` - `/client/game/config` (GetGameConfig) - `/client/putHWMetrics` (PutHwMetrics) - `/client/game/mode` (GetGameMode) - `/client/server/list` (GetServer) - `/client/match/group/current` (GetCurrentGroup) - `/client/game/version/validate` (VersionValidate) - `/client/game/start` (GameStart) - `/client/game/logout` (GameLogout) - `/client/checkVersion` (ValidateGameVersion) - `/client/game/keepalive` (GameKeepalive) - `/singleplayer/settings/version` (GetVersion) - `/client/reports/lobby/send` (ReportNickname) - `/client/report/send` (ReportNickname) - `/singleplayer/settings/getRaidTime` (GetRaidTime) - `/client/survey` (GetSurvey) - `/client/survey/view` (GetSurveyView) - `/client/survey/opinion` (SendSurveyOpinion) - `/singleplayer/clientmods` (ReceiveClientMods) ### `HealthStaticRouter` - `/client/hideout/workout` (HandleWorkoutEffects) ### `InraidStaticRouter` - `/raid/profile/scavsave` (SaveProgress) - `/singleplayer/settings/raid/menu` (GetRaidMenuSettings) - `/singleplayer/scav/traitorscavhostile` (GetTraitorScavHostileChance) - `/singleplayer/bosstypes` (GetBossTypes) ### `InsuranceStaticRouter` - `/client/insurance/items/list/cost` (GetInsuranceCost) ### `ItemEventStaticRouter` - `/client/game/profile/items/moving` (HandleEvents) 상세한 액션(action) 목록은 아래 **Item Event Actions** 섹션을 참고하세요. ### `LauncherStaticRouter` - `/launcher/ping` (Ping) - `/launcher/server/connect` (Connect) - `/launcher/profile/login` (Login) - `/launcher/profile/register` (Register) - `/launcher/profile/get` (Get) - `/launcher/profile/change/username` (ChangeUsername) - `/launcher/profile/change/wipe` (Wipe) - `/launcher/profile/remove` (RemoveProfile) - `/launcher/profile/compatibleTarkovVersion` (GetCompatibleTarkovVersion) - `/launcher/server/version` (GetServerVersion) - `/launcher/server/loadedServerMods` (GetLoadedServerMods) - `/launcher/server/serverModsUsedByProfile` (GetServerModsProfileUsed) ### `LauncherV2StaticRouter` - `/launcher/v2/ping` (Ping) - `/launcher/v2/types` (Types) - `/launcher/v2/login` (Login) - `/launcher/v2/register` (Register) - `/launcher/v2/remove` (Remove) - `/launcher/v2/version` (CompatibleVersion) - `/launcher/v2/mods` (Mods) - `/launcher/v2/profiles` (Profiles) - `/launcher/v2/profile` (Profile) - `/launcher/v2/wipe` (Wipe) ### `LocationStaticRouter` - `/client/locations` (GetLocationData) - `/client/airdrop/loot` (GetAirdropLoot) ### `MatchStaticRouter` - `/client/match/available` (ServerAvailable) - `/client/match/updatePing` (UpdatePing) - `/client/match/join` (JoinMatch) - `/client/match/exit` (ExitMatch) - `/client/match/group/delete` (DeleteGroup) - `/client/match/group/leave` (LeaveGroup) - `/client/match/group/status` (GetGroupStatus) - `/client/match/group/start_game` (StartGameAsGroupLeader) - `/client/match/group/exit_from_menu` (ExitFromMenu) - `/client/match/group/current` (GroupCurrent) - `/client/match/group/looking/start` (StartGroupSearch) - `/client/match/group/looking/stop` (StopGroupSearch) - `/client/match/group/invite/send` (SendGroupInvite) - `/client/match/group/invite/accept` (AcceptGroupInvite) - `/client/match/group/invite/decline` (DeclineGroupInvite) - `/client/match/group/invite/cancel` (CancelGroupInvite) - `/client/match/group/invite/cancel-all` (CancelAllGroupInvite) - `/client/match/group/transfer` (TransferGroup) - `/client/match/group/raid/ready` (RaidReady) - `/client/match/group/raid/not-ready` (NotRaidReady) - `/client/putMetrics` (PutMetrics) - `/client/analytics/event-disconnect` (EventDisconnect) - `/client/getMetricsConfig` (GetMetrics) - `/client/raid/configuration` (GetRaidConfiguration) - `/client/raid/configuration-by-profile` (GetConfigurationByProfile) - `/client/match/group/player/remove` (RemovePlayerFromGroup) - `/client/match/local/start` (StartLocalRaid) - `/client/match/local/end` (EndLocalRaid) ### `ModdedTraderCustomizationRouter` - `/singleplayer/moddedTraders` (GetCustomizationTraders) ### `NotifierStaticRouter` - `/client/notifier/channel/create` (CreateNotifierChannel) - `/client/game/profile/select` (SelectProfile) ### `PrestigeStaticRouter` - `/client/prestige/list` (GetPrestige) - `/client/prestige/obtain` (ObtainPrestige) ### `ProfileStaticRouter` - `/client/game/profile/create` (CreateProfile) - `/client/game/profile/list` (GetProfileData) - `/client/game/profile/savage/regenerate` (RegenerateScav) - `/client/game/profile/voice/change` (ChangeVoice) - `/client/game/profile/nickname/change` (ChangeNickname) - `/client/game/profile/nickname/validate` (ValidateNickname) - `/client/game/profile/nickname/reserved` (GetReservedNickname) - `/client/profile/status` (GetProfileStatus) - `/client/profile/view` (GetOtherProfile) - `/client/profile/settings` (GetProfileSettings) - `/client/game/profile/search` (SearchProfiles) - `/launcher/profile/info` (GetMiniProfile) - `/launcher/profiles` (GetAllMiniProfiles) ### `QuestStaticRouter` - `/client/quest/list` (ListQuests) - `/client/repeatalbeQuests/activityPeriods` (ActivityPeriods) ### `RagfairStaticRouter` - `/client/ragfair/search` (Search) - `/client/ragfair/find` (Search) - `/client/ragfair/itemMarketPrice` (GetMarketPrice) - `/client/ragfair/offerfees` (StorePlayerOfferTaxAmount) - `/client/reports/ragfair/send` (SendReport) - `/client/items/prices` (GetFleaPrices) - `/client/ragfair/offer/findbyid` (GetFleaOfferById) ### `TraderStaticRouter` - `/client/trading/api/traderSettings` (GetTraderSettings) ### `WeatherStaticRouter` - `/client/weather` (GetWeather) - `/client/localGame/weather` (GetLocalWeather) --- ## Dynamic Routes (동적 라우트) 동적 라우트(dynamic routes)는 **부분 일치(partial match)** 로 동작합니다. 아래 경로는 prefix로 사용됩니다. ### `BotDynamicRouter` - `/singleplayer/settings/bot/limit/` (GetBotLimit) - `/singleplayer/settings/bot/difficulty/` (GetBotDifficulty) - `/singleplayer/settings/bot/difficulties` (GetAllBotDifficulties) - `/singleplayer/settings/bot/maxCap` (GetBotCap) - `/singleplayer/settings/bot/getBotBehaviours/` (GetBotBehaviours) ### `BundleDynamicRouter` - `/files/bundle` (GetBundle) ### `CustomizationDynamicRouter` - `/client/trading/customization/` (GetTraderSuits) ### `DataDynamicRouter` - `/client/menu/locale/` (GetLocalesMenu) - `/client/locale/` (GetLocalesGlobal) - `/client/items/prices/` (GetItemPrices) ### `InraidDynamicRouter` - `/client/location/getLocalloot` (RegisterPlayer) ### `NotifierDynamicRouter` - `/?last_id` (Notify) 주의: `Path` 기준 부분 일치라서 `/` 경로에 대한 폴링(long-poll) 패턴으로 사용됩니다. - `/notifierServer` (Notify) - `/push/notifier/get/` (GetNotifier) ### `TraderDynamicRouter` - `/client/trading/api/getTrader/` (GetTrader) - `/client/trading/api/getTraderAssort/` (GetAssort) ### `LocationDynamicRouter` - (라우트 없음) `DynamicRouter`를 상속하지만 현재 등록된 경로가 없습니다. --- ## Item Event Actions (아이템 이벤트 액션) `/client/game/profile/items/moving` 엔드포인트는 **Action 필드**에 따라 실제 처리가 분기됩니다. 아래는 처리 가능한 액션(action) 목록입니다. ### Inventory Actions - `Move`, `Remove`, `Split`, `Merge`, `Transfer`, `Swap`, `Fold`, `Toggle` - `Tag`, `Bind`, `Unbind`, `Examine`, `ReadEncyclopedia` - `ApplyInventoryChanges`, `CreateMapMarker`, `DeleteMapMarker`, `EditMapMarker` - `OpenRandomLootContainer`, `HideoutQuickTimeEvent` - `RedeemProfileReward`, `SetFavoriteItems`, `QuestFail`, `PinLock` - `SaveDialogueState` ### Quest Actions - `QuestAccept`, `QuestComplete`, `QuestHandover`, `RepeatableQuestChange` ### Ragfair Actions - `RagFairAddOffer`, `RagFairRemoveOffer`, `RagFairRenewOffer` ### Repair Actions - `Repair`, `TraderRepair` ### Trade Actions - `TradingConfirm`, `RagFairBuyOffer`, `SellAllFromSavage` ### Health Actions - `Eat`, `Heal`, `RestoreHealth` ### Insurance Actions - `Insure` ### Customization Actions - `CustomizationBuy`, `CustomizationSet` ### Note Actions - `AddNote`, `EditNote`, `DeleteNote` ### Wishlist Actions - `AddToWishList`, `RemoveFromWishList`, `ChangeWishlistItemCategory` ### Hideout Actions (HideoutEventActions) - `HideoutUpgrade`, `HideoutUpgradeComplete` - `HideoutPutItemsInAreaSlots`, `HideoutTakeItemsFromAreaSlots`, `HideoutToggleArea` - `HideoutSingleProductionStart`, `HideoutScavCaseProductionStart`, `HideoutContinuousProductionStart` - `HideoutTakeProduction`, `RecordShootingRangePoints`, `HideoutImproveArea` - `HideoutCancelProductionCommand`, `HideoutCircleOfCultistProductionStart` - `HideoutDeleteProductionCommand`, `HideoutCustomizationApply`, `HideoutCustomizationSetMannequinPose` --- ## WebSocket (웹소켓) - `/notifierServer/getwebsocket/{sessionId}` 핸들러(hook) 경로: `/notifierServer/getwebsocket/` 실제 연결은 경로에 세션 ID(sessionId)가 추가된 형태를 사용합니다. --- ## 파일/번들/이미지 제공 (Files/Bundles/Images) - 번들(bundle): `/files/bundle...` (동적 라우트, `BundleDynamicRouter`) - 이미지(image): `ImageRouter`는 런타임에 `AddRoute`로 등록된 경로만 처리합니다. 정적 목록은 코드 상에 고정되어 있지 않습니다. --- ## MVC 컨트롤러 (Mod Controller) 예시 테스트 모드(TestMod)에서 제공되는 예시 엔드포인트: - `GET /test/ping` (TestController.Ping) 또한 `SPTWeb`는 `app.MapControllers()`로 모드(mod)에서 제공하는 MVC 컨트롤러를 자동 등록합니다.