{"openapi":"3.0.1","info":{"title":"Meloming OpenAPI","description":"Meloming 플랫폼의 공식 OpenAPI입니다.\n\n## 인증\n- **API Key**: `X-API-Key` 헤더 또는 `Authorization: Bearer mlm_xxx` 형식\n- **OAuth 2.0**: Client Credentials 또는 Authorization Code 방식\n\n## Rate Limit\n- FREE: 60 requests/minute\n- PRO: 300 requests/minute\n- ENTERPRISE: 1000 requests/minute\n\n## Versioning\n- API 버전은 `Meloming-Version` 헤더로 지정 (YYYY-MM-DD 형식)\n- 미지정 시 최신 버전 사용\n","contact":{"name":"Meloming Developer Support","url":"https://developers.meloming.com","email":"developers@meloming.com"},"license":{"name":"Proprietary","url":"https://meloming.com/terms"},"version":"2026-01-11"},"servers":[{"url":"https://openapi.meloming.com","description":"Production"},{"url":"http://localhost:8080","description":"Local Development"}],"security":[{"ApiKeyAuth":[],"BearerAuth":[]}],"tags":[{"name":"Songs","description":"노래 통합 검색 API"},{"name":"Channel Profile","description":"채널 프로필 API"},{"name":"Channel Categories","description":"채널별 카테고리 조회 API"},{"name":"Channel Songs","description":"채널별 노래 관리 API"},{"name":"Channels","description":"채널 관련 API"},{"name":"Channel Artists","description":"채널별 아티스트 조회 API"},{"name":"Channel Schedules","description":"채널별 방송 일정 API"},{"name":"Contents","description":"콘텐츠 관련 API"},{"name":"OAuth","description":"OAuth 2.0 인증"}],"paths":{"/v1/contents":{"get":{"tags":["Contents"],"summary":"컨텐츠 목록 조회","description":"콘텐츠 목록을 조회합니다.","operationId":"getContents","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"tagIds","in":"query","required":false,"schema":{"type":"string"}},{"name":"organizerId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"title","in":"query","required":false,"schema":{"type":"string"}},{"name":"description","in":"query","required":false,"schema":{"type":"string"}},{"name":"organizerUsername","in":"query","required":false,"schema":{"type":"string"}},{"name":"soopChannelId","in":"query","required":false,"schema":{"type":"string"}},{"name":"chzzkChannelId","in":"query","required":false,"schema":{"type":"string"}},{"name":"recruitCountMinFrom","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"recruitCountMinTo","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"recruitCountMaxFrom","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"recruitCountMaxTo","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"recruitStartFrom","in":"query","required":false,"schema":{"type":"string"}},{"name":"recruitStartTo","in":"query","required":false,"schema":{"type":"string"}},{"name":"recruitEndFrom","in":"query","required":false,"schema":{"type":"string"}},{"name":"recruitEndTo","in":"query","required":false,"schema":{"type":"string"}},{"name":"announcementFrom","in":"query","required":false,"schema":{"type":"string"}},{"name":"announcementTo","in":"query","required":false,"schema":{"type":"string"}},{"name":"contentFrom","in":"query","required":false,"schema":{"type":"string"}},{"name":"contentTo","in":"query","required":false,"schema":{"type":"string"}},{"name":"platform","in":"query","required":false,"schema":{"type":"string"}},{"name":"hostGrades","in":"query","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"statuses","in":"query","required":false,"schema":{"type":"string"}},{"name":"requirementPairs","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"requirementTypeId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"requirementTypeIds","in":"query","required":false,"schema":{"type":"string"}},{"name":"requirementValue","in":"query","required":false,"schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"}},{"name":"order","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentListResponse"}}}}}},"post":{"tags":["Contents"],"summary":"콘텐츠 등록","description":"새 콘텐츠를 등록합니다.","operationId":"createContent","parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContentRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/channels/{channelId}/songs":{"get":{"tags":["Channel Songs"],"summary":"채널 노래 목록 조회","description":"채널의 노래 목록을 조회합니다.","operationId":"getSongs","parameters":[{"name":"channelId","in":"path","description":"채널 ID","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"search","in":"query","required":false,"schema":{"type":"string"}},{"name":"categoryId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"artistId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"proficiency","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"difficulty","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SongListResponse"}}}}}},"post":{"tags":["Channel Songs"],"summary":"노래 추가","description":"채널에 새 노래를 추가합니다.","operationId":"createSong","parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSongRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SongResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/channels/{channelId}/schedules":{"get":{"tags":["Channel Schedules"],"summary":"일정 목록 조회","description":"채널의 방송 일정을 조회합니다.","operationId":"getSchedules","parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"from","in":"query","description":"시작일 (ISO 8601)","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","description":"종료일 (ISO 8601)","required":false,"schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ScheduleResponse"}}}}}}},"post":{"tags":["Channel Schedules"],"summary":"일정 추가","description":"새 방송 일정을 추가합니다.","operationId":"createSchedule","parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateScheduleRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/oauth/token":{"post":{"tags":["OAuth"],"summary":"Access Token 발급 (JSON)","description":"OAuth 2.0 Access Token을 발급합니다. (JSON)","operationId":"tokenForm_1","parameters":[{"name":"grant_type","in":"query","required":true,"schema":{"type":"string"}},{"name":"client_id","in":"query","required":false,"schema":{"type":"string"}},{"name":"client_secret","in":"query","required":false,"schema":{"type":"string"}},{"name":"code","in":"query","required":false,"schema":{"type":"string"}},{"name":"redirect_uri","in":"query","required":false,"schema":{"type":"string"}},{"name":"code_verifier","in":"query","required":false,"schema":{"type":"string"}},{"name":"refresh_token","in":"query","required":false,"schema":{"type":"string"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}}}}},"/oauth/revoke":{"post":{"tags":["OAuth"],"summary":"Token 폐기","description":"Access Token 또는 Refresh Token을 폐기합니다.","operationId":"revoke","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeRequest"}}},"required":true},"responses":{"200":{"description":"OK"}}}},"/oauth/introspect":{"post":{"tags":["OAuth"],"summary":"Token 정보 조회","description":"Token의 유효성과 정보를 조회합니다.","operationId":"introspect","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntrospectRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntrospectResponse"}}}}}}},"/oauth/consent":{"post":{"tags":["OAuth"],"summary":"동의 처리","description":"사용자 동의를 처리하고 Authorization Code를 발급합니다.","operationId":"processConsent","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentResponse"}}}}}}},"/v1/channels/{channelId}/songs/{songId}":{"get":{"tags":["Channel Songs"],"summary":"노래 상세 조회","description":"특정 노래의 상세 정보를 조회합니다.","operationId":"getSong","parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"songId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SongResponse"}}}}}},"delete":{"tags":["Channel Songs"],"summary":"노래 삭제","description":"노래를 삭제합니다.","operationId":"deleteSong","parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"songId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"}},"security":[{"bearerAuth":[]}]},"patch":{"tags":["Channel Songs"],"summary":"노래 수정","description":"노래 정보를 수정합니다.","operationId":"updateSong","parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"songId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSongRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SongResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/channels/{channelId}/schedules/{scheduleId}":{"delete":{"tags":["Channel Schedules"],"summary":"일정 삭제","description":"일정을 삭제합니다.","operationId":"deleteSchedule","parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"scheduleId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"}},"security":[{"bearerAuth":[]}]},"patch":{"tags":["Channel Schedules"],"summary":"일정 수정","description":"일정을 수정합니다.","operationId":"updateSchedule","parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"scheduleId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateScheduleRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/channels/{channelId}/profile":{"get":{"tags":["Channel Profile"],"summary":"프로필 조회","description":"채널의 프로필 정보를 조회합니다.","operationId":"getProfile","parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelProfileResponse"}}}}}},"patch":{"tags":["Channel Profile"],"summary":"프로필 수정","description":"채널 프로필을 수정합니다.","operationId":"updateProfile","parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelProfileResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/songs/search":{"get":{"tags":["Songs"],"summary":"노래 통합 검색","description":"모든 채널에서 노래를 검색합니다.","operationId":"searchSongs","parameters":[{"name":"q","in":"query","description":"검색 키워드 (제목/아티스트)","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","description":"페이지 번호","required":false,"schema":{"type":"integer","format":"int32","default":1}},{"name":"limit","in":"query","description":"페이지당 항목 수","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"artistId","in":"query","description":"아티스트 ID 필터","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"categoryId","in":"query","description":"카테고리 ID 필터","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"sortBy","in":"query","description":"정렬 기준","required":false,"schema":{"type":"string","default":"newest"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageResponseGlobalSongSearchResponse"}}}}}}},"/v1/contents/{id}":{"get":{"tags":["Contents"],"summary":"컨텐츠 상세 조회","description":"특정 컨텐츠의 상세 정보를 조회합니다.","operationId":"getContent","parameters":[{"name":"id","in":"path","description":"컨텐츠 ID","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"incrementView","in":"query","description":"조회수 증가 여부","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentResponse"}}}}}}},"/v1/channels/{identifier}":{"get":{"tags":["Channels"],"summary":"채널 상세 조회","description":"채널 ID 또는 webPath로 상세 정보를 조회합니다.","operationId":"getChannel","parameters":[{"name":"identifier","in":"path","description":"채널 ID 또는 webPath","required":true,"schema":{"type":"string"}},{"name":"expand","in":"query","description":"통계 정보 포함 여부","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/channels/{channelId}/categories":{"get":{"tags":["Channel Categories"],"summary":"채널 카테고리 목록","description":"채널의 카테고리 목록을 조회합니다.","operationId":"getCategories","parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CategoryResponse"}}}}}}}},"/v1/channels/{channelId}/artists":{"get":{"tags":["Channel Artists"],"summary":"채널 아티스트 목록","description":"채널의 아티스트 목록을 조회합니다.","operationId":"getArtists","parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ArtistResponse"}}}}}}}},"/v1/channels/search":{"get":{"tags":["Channels"],"summary":"채널 검색","description":"키워드로 채널을 검색합니다.","operationId":"searchChannels","parameters":[{"name":"q","in":"query","description":"검색 키워드","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","description":"페이지 번호","required":false,"schema":{"type":"integer","format":"int32","default":1}},{"name":"limit","in":"query","description":"페이지당 항목 수","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageResponseChannelWithCountsResponse"}}}}}}},"/v1/channels/ranking":{"get":{"tags":["Channels"],"summary":"채널 랭킹 조회","description":"가중치 기반 인기 채널 랭킹을 조회합니다.","operationId":"getRanking","parameters":[{"name":"limit","in":"query","description":"조회 개수 (최대 50)","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"days","in":"query","description":"최근 N일 기준 집계","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"favoritesWeight","in":"query","description":"즐겨찾기 가중치","required":false,"schema":{"type":"number","format":"double"}},{"name":"songLikesWeight","in":"query","description":"노래 좋아요 가중치","required":false,"schema":{"type":"number","format":"double"}},{"name":"songsWeight","in":"query","description":"등록 노래 수 가중치","required":false,"schema":{"type":"number","format":"double"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChannelWithCountsResponse"}}}}}}}},"/v1/channels/platforms/{platform}/{channelId}":{"get":{"tags":["Channels"],"summary":"플랫폼 채널 ID로 meloming 채널 조회","description":"플랫폼(SOOP, CHZZK, CIME)과 해당 플랫폼의 채널 ID로 인증된 meloming 채널 정보를 조회합니다.","operationId":"getChannelByPlatform","parameters":[{"name":"platform","in":"path","description":"스트리밍 플랫폼 (SOOP, CHZZK, CIME)","required":true,"schema":{"type":"string","enum":["SOOP","CHZZK","CIME","OTHER"]}},{"name":"channelId","in":"path","description":"플랫폼 채널 ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelPlatformResponse"}}}}}}},"/oauth/session/{sessionId}":{"get":{"tags":["OAuth"],"summary":"세션 정보 조회","description":"Authorization 세션 정보와 앱 정보를 조회합니다. (동의 화면 표시용)","operationId":"getSessionInfo","parameters":[{"name":"sessionId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorizationSessionResponse"}}}}}}},"/oauth/authorize":{"get":{"tags":["OAuth"],"summary":"Authorization Code 요청","description":"OAuth 2.0 Authorization Code 흐름을 시작합니다. 동의 화면으로 리다이렉트됩니다.","operationId":"authorize","parameters":[{"name":"client_id","in":"query","required":true,"schema":{"type":"string"}},{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string"}},{"name":"response_type","in":"query","required":true,"schema":{"type":"string"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string"}},{"name":"state","in":"query","required":false,"schema":{"type":"string"}},{"name":"code_challenge","in":"query","required":false,"schema":{"type":"string"}},{"name":"code_challenge_method","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}}},"components":{"schemas":{"CreateContentRequest":{"required":["title"],"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"descriptionHtml":{"type":"string"},"announcementUrl":{"type":"string"},"announcementMethod":{"type":"string"},"thumbnailImageUrl":{"type":"string"},"platform":{"type":"string"},"recruitCountMin":{"type":"integer","format":"int32"},"recruitCountMax":{"type":"integer","format":"int32"},"recruitStartAt":{"type":"string","format":"date-time"},"recruitEndAt":{"type":"string","format":"date-time"},"announcementAt":{"type":"string","format":"date-time"},"contentAt":{"type":"string","format":"date-time"},"contentScheduleDetails":{"type":"string"},"prizes":{"type":"string"},"tagIds":{"type":"array","items":{"type":"integer","format":"int64"}},"organizerId":{"type":"integer","format":"int64"},"requirements":{"type":"array","items":{"$ref":"#/components/schemas/RequirementInfo"}}}},"RequirementInfo":{"type":"object","properties":{"requirementTypeId":{"type":"integer","format":"int64"},"value":{"type":"string"}}},"ContentOrganizerSummary":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string"},"profileImageUrl":{"type":"string"}}},"ContentRequirementResponse":{"type":"object","properties":{"id":{"type":"string"},"value":{"type":"string"},"type":{"$ref":"#/components/schemas/RequirementTypeResponse"}}},"ContentResponse":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"descriptionHtml":{"type":"string"},"announcementMethod":{"type":"string"},"announcementUrl":{"type":"string"},"thumbnailImageUrl":{"type":"string"},"platform":{"type":"string"},"status":{"type":"string"},"isAlwaysOpen":{"type":"boolean"},"recruitCountMin":{"type":"integer","format":"int32"},"recruitCountMax":{"type":"integer","format":"int32"},"recruitStartAt":{"type":"string","format":"date-time"},"recruitEndAt":{"type":"string","format":"date-time"},"announcementAt":{"type":"string","format":"date-time"},"contentAt":{"type":"string","format":"date-time"},"contentScheduleDetails":{"type":"string"},"prizes":{"type":"string"},"viewCount":{"type":"integer","format":"int32"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"organizer":{"$ref":"#/components/schemas/ContentOrganizerSummary"},"user":{"$ref":"#/components/schemas/ContentUserSummary"},"contentsTags":{"type":"array","items":{"$ref":"#/components/schemas/ContentTagSummary"}},"requirements":{"type":"array","items":{"$ref":"#/components/schemas/ContentRequirementResponse"}}}},"ContentTagSummary":{"type":"object","properties":{"tag":{"$ref":"#/components/schemas/TagSummary"}}},"ContentUserSummary":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"nickname":{"type":"string"}}},"RequirementTypeResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"key":{"type":"string"},"name":{"type":"string"},"valueType":{"type":"string"},"valueDetail":{"type":"string"}}},"TagSummary":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}}},"CreateSongRequest":{"required":["artistId","title"],"type":"object","properties":{"title":{"type":"string"},"artistId":{"type":"integer","format":"int64"},"albumArt":{"type":"string"},"karaokeUrl":{"type":"string"},"coverUrl":{"type":"string"},"originalUrl":{"type":"string"},"difficulty":{"maximum":5,"minimum":1,"type":"integer","format":"int32"},"proficiency":{"maximum":5,"minimum":1,"type":"integer","format":"int32"},"songKey":{"type":"string"},"bpm":{"type":"integer","format":"int32"},"lyricsLink":{"type":"string"},"lyricsText":{"type":"string"},"categoryIds":{"type":"array","items":{"type":"integer","format":"int64"}}}},"CategorySummary":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"color":{"type":"string"}}},"ChannelUserSummary":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"nickname":{"type":"string"}}},"SongArtistSummary":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"channelId":{"type":"integer","format":"int64"},"createdAt":{"type":"string","format":"date-time"}}},"SongCategoryResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"songId":{"type":"integer","format":"int64"},"categoryId":{"type":"integer","format":"int64"},"category":{"$ref":"#/components/schemas/CategorySummary"}}},"SongChannelSummary":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"webPath":{"type":"string"},"themeColor":{"type":"string"},"user":{"$ref":"#/components/schemas/ChannelUserSummary"}}},"SongCounts":{"type":"object","properties":{"userLikes":{"type":"integer","format":"int32"}}},"SongResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"title":{"type":"string"},"artistId":{"type":"integer","format":"int64"},"channelId":{"type":"integer","format":"int64"},"albumArt":{"type":"string"},"karaokeUrl":{"type":"string"},"coverUrl":{"type":"string"},"originalUrl":{"type":"string"},"difficulty":{"type":"integer","format":"int32"},"proficiency":{"type":"integer","format":"int32"},"songKey":{"type":"string"},"bpm":{"type":"integer","format":"int32"},"lyricsLink":{"type":"string"},"lyricsText":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"artist":{"$ref":"#/components/schemas/SongArtistSummary"},"channel":{"$ref":"#/components/schemas/SongChannelSummary"},"categories":{"type":"array","items":{"$ref":"#/components/schemas/CategorySummary"}},"songCategories":{"type":"array","items":{"$ref":"#/components/schemas/SongCategoryResponse"}},"_count":{"$ref":"#/components/schemas/SongCounts"},"totalFavorites":{"type":"integer","format":"int32"},"isFavorite":{"type":"boolean"}}},"CreateScheduleRequest":{"required":["startAt","title"],"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"},"startAt":{"type":"string","format":"date-time"},"endAt":{"type":"string","format":"date-time"},"allDay":{"type":"boolean"},"status":{"type":"string"},"visibility":{"type":"string"},"location":{"type":"string"},"externalUrl":{"type":"string"}}},"ScheduleResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"channelId":{"type":"integer","format":"int64"},"title":{"type":"string"},"content":{"type":"string"},"startAt":{"type":"string","format":"date-time"},"endAt":{"type":"string","format":"date-time"},"allDay":{"type":"boolean"},"isCanceled":{"type":"boolean"},"status":{"type":"string"},"visibility":{"type":"string"},"location":{"type":"string"},"externalUrl":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"TokenResponse":{"type":"object","properties":{"scope":{"type":"string"},"access_token":{"type":"string"},"token_type":{"type":"string"},"expires_in":{"type":"integer","format":"int32"},"refresh_token":{"type":"string"}}},"TokenRequest":{"required":["grant_type"],"type":"object","properties":{"code":{"type":"string"},"scope":{"type":"string"},"grant_type":{"type":"string"},"client_id":{"type":"string"},"client_secret":{"type":"string"},"redirect_uri":{"type":"string"},"code_verifier":{"type":"string"},"refresh_token":{"type":"string"}}},"RevokeRequest":{"required":["token"],"type":"object","properties":{"token":{"type":"string"},"token_type_hint":{"type":"string"}}},"IntrospectRequest":{"required":["token","tokenTypeHint"],"type":"object","properties":{"token":{"type":"string"},"tokenTypeHint":{"type":"string"}}},"IntrospectResponse":{"type":"object","properties":{"active":{"type":"boolean"},"scope":{"type":"string"},"username":{"type":"string"},"exp":{"type":"integer","format":"int64"},"iat":{"type":"integer","format":"int64"},"sub":{"type":"string"},"aud":{"type":"string"},"iss":{"type":"string"},"client_id":{"type":"string"},"token_type":{"type":"string"}}},"ConsentRequest":{"required":["approved","sessionId"],"type":"object","properties":{"sessionId":{"type":"string","description":"세션 ID"},"approved":{"type":"boolean","description":"동의 여부"},"scopes":{"type":"array","description":"동의한 스코프 목록","items":{"type":"string","description":"동의한 스코프 목록"}}},"description":"동의 처리 요청"},"ConsentResponse":{"type":"object","properties":{"redirectUri":{"type":"string","description":"리다이렉트할 URL (code 또는 error 포함)"}},"description":"동의 처리 응답"},"UpdateSongRequest":{"type":"object","properties":{"title":{"type":"string"},"artistId":{"type":"integer","format":"int64"},"albumArt":{"type":"string"},"karaokeUrl":{"type":"string"},"coverUrl":{"type":"string"},"originalUrl":{"type":"string"},"difficulty":{"maximum":5,"minimum":1,"type":"integer","format":"int32"},"proficiency":{"maximum":5,"minimum":1,"type":"integer","format":"int32"},"songKey":{"type":"string"},"bpm":{"type":"integer","format":"int32"},"lyricsLink":{"type":"string"},"lyricsText":{"type":"string"},"categoryIds":{"type":"array","items":{"type":"integer","format":"int64"}}}},"UpdateScheduleRequest":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"},"startAt":{"type":"string","format":"date-time"},"endAt":{"type":"string","format":"date-time"},"allDay":{"type":"boolean"},"status":{"type":"string"},"visibility":{"type":"string"},"location":{"type":"string"},"externalUrl":{"type":"string"}}},"UpdateProfileRequest":{"type":"object","properties":{"birthday":{"type":"string","format":"date-time"},"residence":{"type":"string"},"heightCm":{"type":"string"},"weightKg":{"type":"string"},"nationality":{"type":"string"},"gender":{"type":"string"},"symbolColor":{"type":"string"},"agency":{"type":"string"},"nickname":{"type":"string"},"description":{"type":"string"},"affiliatedGroups":{"type":"array","items":{"type":"string"}},"fandomName":{"type":"string"},"religion":{"type":"string"},"education":{"type":"object","additionalProperties":{"type":"string"}},"mbti":{"type":"string"},"alias":{"type":"array","items":{"type":"string"}},"debutDate":{"type":"string","format":"date-time"},"broadcastingPlatforms":{"type":"array","items":{"type":"string"}},"bio":{"type":"string"},"links":{"type":"object","additionalProperties":{"type":"string"}},"homeDescription":{"type":"string"}}},"ChannelProfileResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"channelId":{"type":"integer","format":"int64"},"birthday":{"type":"string","format":"date-time"},"residence":{"type":"string"},"heightCm":{"type":"string"},"weightKg":{"type":"string"},"nationality":{"type":"string"},"gender":{"type":"string"},"symbolColor":{"type":"string"},"agency":{"type":"string"},"nickname":{"type":"string"},"description":{"type":"string"},"affiliatedGroups":{"type":"array","items":{"type":"string"}},"fandomName":{"type":"string"},"religion":{"type":"string"},"education":{"type":"object","additionalProperties":{"type":"string"}},"mbti":{"type":"string"},"alias":{"type":"array","items":{"type":"string"}},"debutDate":{"type":"string","format":"date-time"},"broadcastingPlatforms":{"type":"array","items":{"type":"string"}},"bio":{"type":"string"},"links":{"type":"object","additionalProperties":{"type":"string"}},"homeDescription":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"GlobalSongSearchResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"title":{"type":"string"},"artistId":{"type":"integer","format":"int64"},"artistName":{"type":"string"},"channelId":{"type":"integer","format":"int64"},"channelName":{"type":"string"},"channelWebPath":{"type":"string"},"albumArt":{"type":"string"},"difficulty":{"type":"integer","format":"int32"},"proficiency":{"type":"integer","format":"int32"},"createdAt":{"type":"string","format":"date-time"}}},"PageMeta":{"type":"object","properties":{"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"},"hasNext":{"type":"boolean"},"hasPrevious":{"type":"boolean"}}},"PageResponseGlobalSongSearchResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/GlobalSongSearchResponse"}},"pagination":{"$ref":"#/components/schemas/PageMeta"}}},"ContentListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ContentResponse"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"limit":{"type":"integer","format":"int32"}}},"SongListResponse":{"type":"object","properties":{"songs":{"type":"array","items":{"$ref":"#/components/schemas/SongResponse"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"limit":{"type":"integer","format":"int32"}}},"CategoryChannelSummary":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"user":{"$ref":"#/components/schemas/ChannelUserSummary"}}},"CategoryResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"color":{"type":"string"},"channelId":{"type":"integer","format":"int64"},"displayOrder":{"type":"integer","format":"int32"},"createdAt":{"type":"string","format":"date-time"},"songCount":{"type":"integer","format":"int32"},"channel":{"$ref":"#/components/schemas/CategoryChannelSummary"}}},"ArtistChannelSummary":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"user":{"$ref":"#/components/schemas/ChannelUserSummary"}}},"ArtistResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"channelId":{"type":"integer","format":"int64"},"createdAt":{"type":"string","format":"date-time"},"songCount":{"type":"integer","format":"int32"},"channel":{"$ref":"#/components/schemas/ArtistChannelSummary"}}},"AdditionalLink":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"}}},"ChannelCounts":{"type":"object","properties":{"songs":{"type":"integer","format":"int32"},"categories":{"type":"integer","format":"int32"},"artists":{"type":"integer","format":"int32"}}},"ChannelWithCountsResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"webPath":{"type":"string"},"platformUrl":{"type":"string"},"topBannerUrl":{"type":"string"},"leftBannerUrl":{"type":"string"},"rightBannerUrl":{"type":"string"},"profileImageUrl":{"type":"string"},"themeColor":{"type":"string"},"channelDescription":{"type":"string"},"additionalLinks":{"type":"array","items":{"$ref":"#/components/schemas/AdditionalLink"}},"_count":{"$ref":"#/components/schemas/ChannelCounts"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"favoritesCount":{"type":"integer","format":"int32"},"songLikesCount":{"type":"integer","format":"int32"},"songsCount":{"type":"integer","format":"int32"},"popularityScore":{"type":"number","format":"double"},"isOwnerProSubscriber":{"type":"boolean"},"isOwnerAmbassador":{"type":"boolean"}}},"PageResponseChannelWithCountsResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ChannelWithCountsResponse"}},"pagination":{"$ref":"#/components/schemas/PageMeta"}}},"ChannelPlatformResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"webPath":{"type":"string"},"platformUrl":{"type":"string"},"profileImageUrl":{"type":"string"},"themeColor":{"type":"string"},"platform":{"type":"string","enum":["SOOP","CHZZK","CIME","OTHER"]},"platformChannelId":{"type":"string"}}},"ApplicationInfo":{"type":"object","properties":{"name":{"type":"string","description":"앱 이름"},"description":{"type":"string","description":"앱 설명"},"logoUrl":{"type":"string","description":"로고 URL"},"websiteUrl":{"type":"string","description":"웹사이트 URL"},"privacyPolicyUrl":{"type":"string","description":"개인정보처리방침 URL"},"developerName":{"type":"string","description":"개발자 이름"}},"description":"애플리케이션 정보"},"AuthorizationSessionResponse":{"type":"object","properties":{"sessionId":{"type":"string","description":"세션 ID"},"clientId":{"type":"string","description":"클라이언트 ID"},"application":{"$ref":"#/components/schemas/ApplicationInfo"},"requestedScopes":{"type":"array","description":"요청된 스코프 목록","items":{"type":"string","description":"요청된 스코프 목록"}},"redirectUri":{"type":"string","description":"리다이렉트 URI"},"state":{"type":"string","description":"상태값"}},"description":"Authorization Session 정보"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","description":"API Key (mlm_live_xxx 또는 mlm_test_xxx 형식)","name":"X-API-Key","in":"header"},"BearerAuth":{"type":"http","description":"OAuth 2.0 Access Token 또는 API Key (Bearer mlm_xxx)","scheme":"bearer","bearerFormat":"JWT"}}}}