{"openapi":"3.1.0","info":{"title":"CTMM 미디어 · 서비스와 논리 폴더 관리","description":"원본 영속 보관, 이미지·영상 변환, SSD 게시 및 개발자가 제어하는 RAM 캐시. RAM 적재는 비동기이며 메모리·파일 크기 제한을 따릅니다. RAM 전용 저장이나 영구 고정은 아닙니다. /admin은 로그인 없는 현황 화면입니다. 익명 조회와 공개 파일 RAM 제어는 서버가 허용한 namespace(기본 legacy)에 한정합니다. 다른 namespace는 해당 키로 발급한 15분 관리 토큰으로 연결합니다. 비공개 본문은 서명 URL이 필요합니다. 논리 경로는 NFC·대소문자 구분, 최대 UTF-8 1024바이트·요소 255바이트·폴더 16단계이며 실제 저장 경로로 사용하지 않습니다.","version":"1.3.0"},"paths":{"/v1/uploads":{"post":{"tags":["Uploads"],"summary":"서비스와 논리 경로를 예약하고 업로드 주소 발급","description":"Path is reserved atomically for 900 seconds while awaiting upload. Expired/failed/deleted records release the logical path, never their historical ID. Missing namespace uses server key default; missing path uses uploads/{id}/{filename}. Signed upload tickets are capabilities bound to this ID, not arbitrary namespace access.","operationId":"create_upload_v1_uploads_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadTicket"}}}},"409":{"description":"Same namespace/path already reserved. No overwrite."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BackendApiKey":[]}]}},"/v1/uploads/{media_id}/content":{"put":{"tags":["Uploads"],"summary":"예약에 묶인 서명 주소로 원본 본문 업로드","operationId":"upload_content_v1_uploads__media_id__content_put","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}},{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/media/{media_id}":{"get":{"tags":["Media"],"summary":"처리 상태와 논리 경로·다운로드 주소 조회","operationId":"media_status_v1_media__media_id__get","security":[{"BackendApiKey":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaStatusView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Media"],"summary":"공개·비공개 설정 변경","operationId":"visibility_v1_media__media_id__patch","security":[{"BackendApiKey":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisibilityRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Media"],"summary":"논리 삭제와 경로 예약 해제 · 원본 물리 삭제 아님","operationId":"delete_media_v1_media__media_id__delete","security":[{"BackendApiKey":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/media/{media_id}/access":{"post":{"tags":["Media"],"summary":"비공개 파일의 짧은 서명 다운로드 주소 발급","operationId":"grant_access_v1_media__media_id__access_post","security":[{"BackendApiKey":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/m/{media_id}/{variant}":{"head":{"tags":["Delivery"],"summary":"Deliver","operationId":"headMediaFile","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}},{"name":"variant","in":"path","required":true,"schema":{"type":"string","title":"Variant"}},{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Delivery"],"summary":"Deliver","operationId":"getMediaFile","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}},{"name":"variant","in":"path","required":true,"schema":{"type":"string","title":"Variant"}},{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/healthz":{"get":{"summary":"Health","operationId":"health_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/readyz":{"get":{"summary":"Ready","operationId":"ready_readyz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/performance":{"get":{"tags":["Media"],"summary":"다운로드 승인 구간 누적 시간과 연결 재사용 현황","operationId":"performance_status_v1_performance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"BackendApiKey":[]}]}},"/v1/cache":{"get":{"summary":"Cache Status","operationId":"cache_status_v1_cache_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"BackendApiKey":[]}]}},"/v1/system/status":{"get":{"summary":"System Status","operationId":"system_status_v1_system_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"BackendApiKey":[]}]}},"/v1/media/{media_id}/cache":{"get":{"tags":["RAM cache"],"summary":"파일별 실제 RAM 상태 조회","operationId":"inspect_cache_v1_media__media_id__cache_get","security":[{"BackendApiKey":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CacheView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["RAM cache"],"summary":"자동·수동·SSD 전용 정책 설정","operationId":"set_policy_v1_media__media_id__cache_patch","security":[{"BackendApiKey":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CachePolicy"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CacheView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["RAM cache"],"summary":"영속 게시 파일의 RAM 적재 요청","description":"변환 완료 후 호출합니다. 202는 요청 평가 결과이며 적재 완료를 뜻하지 않습니다. requestAccepted와 각 variant의 reason을 확인하고 GET으로 resident/serving을 조회하세요. 원본은 유지되며 메모리 제한을 우회하지 않습니다.","operationId":"warm_cache_v1_media__media_id__cache_post","security":[{"BackendApiKey":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarmRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CacheView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["RAM cache"],"summary":"RAM 사본 해제와 진행 중 적재 취소","description":"원본·SSD·미디어 자체를 삭제하지 않습니다. auto 정책에서는 다음 다운로드가 다시 적재하므로 유지하려면 manual 또는 disabled로 변경하세요.","operationId":"evict_cache_v1_media__media_id__cache_delete","security":[{"BackendApiKey":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}},{"name":"variant","in":"query","required":false,"schema":{"anyOf":[{"enum":["thumb.webp","detail.webp","large.webp","poster.webp","playback.mp4"],"type":"string"},{"type":"null"}],"title":"Variant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CacheView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/media":{"get":{"tags":["Inventory"],"summary":"커서 기반 미디어 목록 조회","operationId":"inventory_v1_media_get","security":[{"BackendApiKey":[]}],"parameters":[{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},{"name":"folder","in":"query","required":false,"schema":{"type":"string","default":"","title":"Folder"}},{"name":"recursive","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Recursive"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":24,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Cursor"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":80,"default":"","title":"Q"}},{"name":"visibility","in":"query","required":false,"schema":{"enum":["all","public","private"],"type":"string","default":"all","title":"Visibility"}},{"name":"status","in":"query","required":false,"schema":{"enum":["all","awaiting_upload","uploading","persisting","queued","processing","retry_wait","ready","failed","expired","deleted"],"type":"string","default":"all","title":"Status"}},{"name":"kind","in":"query","required":false,"schema":{"enum":["all","image","video"],"type":"string","default":"all","title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InventoryPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/media":{"get":{"tags":["Public admin"],"summary":"로그인 없는 파일 메타데이터 목록","description":"서버가 허용한 공개 관리 namespace(기본 legacy)의 파일명·논리 경로·저장 위치·처리 상태만 표시합니다. 다른 서비스는 해당 권한으로 /v1/media를 사용하세요. 비공개·삭제 파일의 본문 주소와 서명은 반환하지 않습니다.","operationId":"inventory_admin_api_media_get","parameters":[{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},{"name":"folder","in":"query","required":false,"schema":{"type":"string","default":"","title":"Folder"}},{"name":"recursive","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Recursive"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":24,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Cursor"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":80,"default":"","title":"Q"}},{"name":"visibility","in":"query","required":false,"schema":{"enum":["all","public","private"],"type":"string","default":"all","title":"Visibility"}},{"name":"status","in":"query","required":false,"schema":{"enum":["all","awaiting_upload","uploading","persisting","queued","processing","retry_wait","ready","failed","expired","deleted"],"type":"string","default":"all","title":"Status"}},{"name":"kind","in":"query","required":false,"schema":{"enum":["all","image","video"],"type":"string","default":"all","title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InventoryPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/state":{"get":{"tags":["Public admin"],"summary":"로그인 없는 캐시·저장량 현황","operationId":"public_state_admin_api_state_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/api/media/{media_id}/cache":{"get":{"tags":["Public admin"],"summary":"Public Inspect","operationId":"public_inspect_admin_api_media__media_id__cache_get","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CacheView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Public admin"],"summary":"공개 파일 RAM 적재: 로그인 없음","operationId":"public_warm_admin_api_media__media_id__cache_post","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarmRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CacheView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Public admin"],"summary":"공개 파일 캐시 정책 변경: 로그인 없음","operationId":"public_policy_admin_api_media__media_id__cache_patch","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CachePolicy"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CacheView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Public admin"],"summary":"공개 파일 RAM 해제: 로그인 없음","operationId":"public_evict_admin_api_media__media_id__cache_delete","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}},{"name":"variant","in":"query","required":false,"schema":{"anyOf":[{"enum":["thumb.webp","detail.webp","large.webp","poster.webp","playback.mp4"],"type":"string"},{"type":"null"}],"title":"Variant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CacheView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/namespaces":{"get":{"tags":["Folders"],"summary":"Namespaces","operationId":"namespaces_v1_namespaces_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceView"}}}}},"security":[{"BackendApiKey":[]}]}},"/admin/api/namespaces":{"get":{"tags":["Public admin"],"summary":"Namespaces","operationId":"namespaces_admin_api_namespaces_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceView"}}}}}}},"/v1/admin-sessions":{"post":{"tags":["Folders"],"summary":"한 서비스 범위의 15분 관리 화면 토큰 발급","operationId":"session_v1_admin_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSession"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BackendApiKey":[]}]}},"/v1/media/{media_id}/path":{"patch":{"tags":["Folders"],"summary":"파일 이름 변경·이동 · 식별자와 다운로드 주소 유지","operationId":"rename_v1_media__media_id__path_patch","security":[{"BackendApiKey":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PathChange"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PathResult"}}}},"409":{"description":"Path occupied; no modification"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/folders/move":{"post":{"tags":["Folders"],"summary":"같은 서비스 안에서 폴더를 원자적으로 이동 · 실제 파일 이동 없음","operationId":"move_v1_folders_move_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderMove"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveResult"}}}},"409":{"description":"Conflict; transaction rolled back"},"413":{"description":"More than 5000 records; nothing changed"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BackendApiKey":[]}]}},"/v1/folders":{"get":{"tags":["Folders"],"summary":"바로 아래 폴더 페이지와 미리 집계한 영속·RAM 용량 조회","operationId":"folders_v1_folders_get","security":[{"BackendApiKey":[]}],"parameters":[{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},{"name":"folder","in":"query","required":false,"schema":{"type":"string","default":"","title":"Folder"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":24,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/folders":{"get":{"tags":["Public admin"],"summary":"Folders","operationId":"folders_admin_api_folders_get","parameters":[{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},{"name":"folder","in":"query","required":false,"schema":{"type":"string","default":"","title":"Folder"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":24,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/cache-batch":{"post":{"tags":["RAM cache"],"summary":"Batch","operationId":"batch_v1_cache_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CacheBatch"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BackendApiKey":[]}]}},"/admin/api/cache-batch":{"post":{"tags":["Public admin"],"summary":"Public Batch","operationId":"public_batch_admin_api_cache_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CacheBatch"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/folders/cache":{"post":{"tags":["RAM cache"],"summary":"폴더의 최대 20개 파일에 RAM 작업 · 다음 묶음은 명시적으로 요청","operationId":"folder_control_v1_folders_cache_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderCache"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderBatchResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BackendApiKey":[]}]}},"/admin/api/folders/cache":{"post":{"tags":["Public admin"],"summary":"Public Folder Control","operationId":"public_folder_control_admin_api_folders_cache_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderCache"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderBatchResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AccessRequest":{"properties":{"variant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant"},"expiresIn":{"type":"integer","maximum":300.0,"minimum":1.0,"title":"Expiresin","default":60}},"type":"object","title":"AccessRequest"},"AdminSession":{"properties":{"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},"type":"object","title":"AdminSession"},"BatchFileResult":{"properties":{"id":{"type":"string","title":"Id"},"httpStatus":{"type":"integer","title":"Httpstatus"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result","description":"Same fields as CacheView: policy, pressureMode, requestAccepted, variants with resident/queued/serving/reason. 202 does not mean completed."}},"type":"object","required":["id","httpStatus"],"title":"BatchFileResult"},"BatchResult":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BatchFileResult"},"type":"array","title":"Items"},"action":{"type":"string","enum":["warm","evict"],"title":"Action"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["items","action"],"title":"BatchResult"},"CacheBatch":{"properties":{"ids":{"items":{"type":"string"},"type":"array","maxItems":20,"minItems":1,"title":"Ids","description":"명시적 요청당 최대 20개 미디어 식별자. 무제한 일괄 적재하지 않습니다."},"action":{"type":"string","enum":["warm","evict"],"title":"Action"}},"type":"object","required":["ids","action"],"title":"CacheBatch"},"CachePolicy":{"properties":{"policy":{"type":"string","enum":["auto","manual","disabled"],"title":"Policy","description":"auto는 요청 시 적재, manual은 명시적으로만 적재, disabled는 SSD 전용입니다."}},"type":"object","required":["policy"],"title":"CachePolicy"},"CacheView":{"properties":{"id":{"type":"string","title":"Id"},"policy":{"type":"string","enum":["auto","manual","disabled"],"title":"Policy"},"pressureMode":{"type":"string","title":"Pressuremode"},"variants":{"items":{"$ref":"#/components/schemas/VariantCache"},"type":"array","title":"Variants"},"requestAccepted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Requestaccepted"},"note":{"type":"string","title":"Note","default":"적재는 비동기이며 메모리 압박·용량 제한·재시작에 따라 해제될 수 있습니다."}},"type":"object","required":["id","policy","pressureMode","variants"],"title":"CacheView"},"FolderBatchResult":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BatchFileResult"},"type":"array","title":"Items"},"action":{"type":"string","enum":["warm","evict"],"title":"Action"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextcursor"},"limit":{"type":"integer","title":"Limit"},"namespace":{"type":"string","title":"Namespace"},"folder":{"type":"string","title":"Folder"}},"type":"object","required":["items","action","nextCursor","limit","namespace","folder"],"title":"FolderBatchResult"},"FolderCache":{"properties":{"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"},"folder":{"type":"string","title":"Folder","default":""},"cursor":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Cursor"},"limit":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"Limit","default":20},"action":{"type":"string","enum":["warm","evict"],"title":"Action"}},"type":"object","required":["action"],"title":"FolderCache"},"FolderItem":{"properties":{"fileCount":{"type":"integer","title":"Filecount","description":"해당 폴더 아래의 기록 수. 보관 중인 실패·삭제 이력을 포함합니다."},"persistentOriginalBytes":{"type":"integer","title":"Persistentoriginalbytes"},"persistentVariantBytes":{"type":"integer","title":"Persistentvariantbytes"},"ramCopyBytes":{"type":"integer","title":"Ramcopybytes"},"ramMeasuredAt":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rammeasuredat","description":"약 30초마다 갱신하는 RAM 집계의 Unix 시각(초). 첫 집계 전에는 null입니다."},"namespace":{"type":"string","title":"Namespace"},"path":{"type":"string","title":"Path"},"name":{"type":"string","title":"Name"}},"type":"object","required":["fileCount","persistentOriginalBytes","persistentVariantBytes","ramCopyBytes","ramMeasuredAt","namespace","path","name"],"title":"FolderItem"},"FolderMove":{"properties":{"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"},"source":{"type":"string","title":"Source","description":"현재 폴더 경로. 루트 제외. 마지막 슬래시 하나는 허용합니다."},"destination":{"type":"string","title":"Destination","description":"새 폴더 경로. 기존 대상 폴더에는 합치지 않습니다. 최대 5000개 기록을 전부 반영하거나 전부 취소합니다."}},"type":"object","required":["source","destination"],"title":"FolderMove"},"FolderPage":{"properties":{"namespace":{"type":"string","title":"Namespace"},"folder":{"type":"string","title":"Folder"},"items":{"items":{"$ref":"#/components/schemas/FolderItem"},"type":"array","title":"Items"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextcursor"},"limit":{"type":"integer","title":"Limit"},"summary":{"$ref":"#/components/schemas/FolderStats"},"notice":{"type":"string","title":"Notice"}},"type":"object","required":["namespace","folder","items","nextCursor","limit","summary","notice"],"title":"FolderPage"},"FolderStats":{"properties":{"fileCount":{"type":"integer","title":"Filecount","description":"해당 폴더 아래의 기록 수. 보관 중인 실패·삭제 이력을 포함합니다."},"persistentOriginalBytes":{"type":"integer","title":"Persistentoriginalbytes"},"persistentVariantBytes":{"type":"integer","title":"Persistentvariantbytes"},"ramCopyBytes":{"type":"integer","title":"Ramcopybytes"},"ramMeasuredAt":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rammeasuredat","description":"약 30초마다 갱신하는 RAM 집계의 Unix 시각(초). 첫 집계 전에는 null입니다."}},"type":"object","required":["fileCount","persistentOriginalBytes","persistentVariantBytes","ramCopyBytes","ramMeasuredAt"],"title":"FolderStats"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InventoryItem":{"properties":{"id":{"type":"string","title":"Id"},"filename":{"type":"string","title":"Filename"},"namespace":{"type":"string","title":"Namespace"},"path":{"type":"string","title":"Path"},"contentType":{"type":"string","title":"Contenttype"},"visibility":{"type":"string","enum":["public","private"],"title":"Visibility"},"status":{"type":"string","title":"Status"},"createdAt":{"type":"number","title":"Createdat"},"originalBytes":{"type":"integer","title":"Originalbytes"},"variantBytes":{"type":"integer","title":"Variantbytes"},"reservedBytes":{"type":"integer","title":"Reservedbytes"},"originalKey":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Originalkey"},"cachePolicy":{"type":"string","enum":["auto","manual","disabled"],"title":"Cachepolicy"},"variants":{"items":{"$ref":"#/components/schemas/InventoryVariant"},"type":"array","title":"Variants"},"previewAllowed":{"type":"boolean","title":"Previewallowed"},"sourceService":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sourceservice","description":"Legacy compatibility alias of namespace; legacy does not imply known ownership."}},"type":"object","required":["id","filename","namespace","path","contentType","visibility","status","createdAt","originalBytes","variantBytes","reservedBytes","originalKey","cachePolicy","variants","previewAllowed","sourceService"],"title":"InventoryItem"},"InventoryPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/InventoryItem"},"type":"array","title":"Items"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextcursor"},"limit":{"type":"integer","title":"Limit"},"notice":{"type":"string","title":"Notice"}},"type":"object","required":["items","nextCursor","limit","notice"],"title":"InventoryPage"},"InventoryVariant":{"properties":{"variant":{"type":"string","title":"Variant"},"state":{"type":"string","enum":["resident","queued","ssd","unavailable"],"title":"State"},"resident":{"type":"boolean","title":"Resident"},"serving":{"type":"boolean","title":"Serving"},"queued":{"type":"boolean","title":"Queued"},"bytes":{"type":"integer","title":"Bytes"},"eligible":{"type":"boolean","title":"Eligible"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"objectKey":{"type":"string","title":"Objectkey"},"ssdPath":{"type":"string","title":"Ssdpath"},"ramPath":{"type":"string","title":"Rampath"}},"type":"object","required":["variant","state","resident","serving","queued","bytes","eligible","url","objectKey","ssdPath","ramPath"],"title":"InventoryVariant"},"MediaStatusView":{"properties":{"id":{"type":"string","title":"Id"},"namespace":{"type":"string","title":"Namespace"},"path":{"type":"string","title":"Path"},"filename":{"type":"string","title":"Filename"},"status":{"type":"string","title":"Status"},"visibility":{"type":"string","enum":["public","private"],"title":"Visibility"},"contentType":{"type":"string","title":"Contenttype"},"cachePolicy":{"type":"string","enum":["auto","manual","disabled"],"title":"Cachepolicy"},"variants":{"additionalProperties":{"type":"string"},"type":"object","title":"Variants","description":"준비된 변환본 이름과 식별자 기반 주소. 비공개 파일에는 별도 서명 읽기 주소가 필요합니다."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["id","namespace","path","filename","status","visibility","contentType","cachePolicy","variants","error"],"title":"MediaStatusView"},"MoveResult":{"properties":{"namespace":{"type":"string","title":"Namespace"},"source":{"type":"string","title":"Source"},"destination":{"type":"string","title":"Destination"},"moved":{"type":"integer","title":"Moved"},"status":{"type":"string","const":"completed","title":"Status"},"atomic":{"type":"boolean","title":"Atomic"},"storageUnchanged":{"type":"boolean","title":"Storageunchanged"}},"type":"object","required":["namespace","source","destination","moved","status","atomic","storageUnchanged"],"title":"MoveResult"},"NamespaceView":{"properties":{"namespaces":{"items":{"type":"string"},"type":"array","title":"Namespaces"},"defaultNamespace":{"type":"string","title":"Defaultnamespace"},"anonymous":{"type":"boolean","title":"Anonymous"},"notice":{"type":"string","title":"Notice"}},"type":"object","required":["namespaces","defaultNamespace","anonymous","notice"],"title":"NamespaceView"},"PathChange":{"properties":{"path":{"type":"string","title":"Path","description":"NFC 유니코드 정규화, 대소문자 구분. 상대 경로이며 UTF-8 1~1024바이트, 요소당 최대 255바이트, 폴더 최대 16단계입니다. 앞뒤 /, 빈 요소, .과 .., 역슬래시, 제어·형식 제어·서로게이트 문자는 거절합니다. 마지막 요소가 파일명이며 filename을 함께 보내면 정규화 후 같아야 합니다."}},"type":"object","required":["path"],"title":"PathChange"},"PathResult":{"properties":{"id":{"type":"string","title":"Id"},"namespace":{"type":"string","title":"Namespace"},"path":{"type":"string","title":"Path"},"filename":{"type":"string","title":"Filename"},"storageUnchanged":{"type":"boolean","title":"Storageunchanged"}},"type":"object","required":["id","namespace","path","filename","storageUnchanged"],"title":"PathResult"},"SessionResult":{"properties":{"token":{"type":"string","title":"Token","description":"15-minute namespace-scoped browser credential; not an API key. Keep out of URLs and persistent browser storage."},"expiresIn":{"type":"integer","title":"Expiresin"},"namespace":{"type":"string","title":"Namespace"}},"type":"object","required":["token","expiresIn","namespace"],"title":"SessionResult"},"UploadRequest":{"properties":{"filename":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Filename","description":"path가 있으면 생략할 수 있습니다. 함께 보내면 NFC 정규화 후 path의 마지막 요소와 같아야 합니다."},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace","description":"파일을 관리하는 서비스. 생략하면 서버 API 키의 기본 범위를 사용하며 요청한 범위가 키의 허용 목록에 있어야 합니다.","examples":["wedding"]},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path","description":"NFC 유니코드 정규화, 대소문자 구분. 상대 경로이며 UTF-8 1~1024바이트, 요소당 최대 255바이트, 폴더 최대 16단계입니다. 앞뒤 /, 빈 요소, .과 .., 역슬래시, 제어·형식 제어·서로게이트 문자는 거절합니다. 마지막 요소가 파일명이며 filename을 함께 보내면 정규화 후 같아야 합니다. 생략하면 uploads/{id}/{filename}을 사용합니다.","examples":["업체/123/갤러리/실내 사진.jpeg"]},"content_type":{"type":"string","title":"Content Type"},"visibility":{"type":"string","enum":["private","public"],"title":"Visibility","default":"private"},"cache_policy":{"type":"string","enum":["auto","manual","disabled"],"title":"Cache Policy","description":"auto: 다운로드 시 적재. manual: 명시적 RAM 적재 요청만 허용. disabled: 항상 SSD에서 제공. 원본은 모두 영속 보관합니다.","default":"auto"}},"type":"object","required":["content_type"],"title":"UploadRequest"},"UploadTicket":{"properties":{"id":{"type":"string","title":"Id"},"namespace":{"type":"string","title":"Namespace"},"path":{"type":"string","title":"Path"},"filename":{"type":"string","title":"Filename"},"contentType":{"type":"string","title":"Contenttype"},"uploadUrl":{"type":"string","title":"Uploadurl"},"statusUrl":{"type":"string","title":"Statusurl"},"expiresIn":{"type":"integer","title":"Expiresin"},"maxUploadBytes":{"type":"integer","title":"Maxuploadbytes"},"downloadUrls":{"additionalProperties":{"type":"string"},"type":"object","title":"Downloadurls"},"downloadNote":{"type":"string","title":"Downloadnote"}},"type":"object","required":["id","namespace","path","filename","contentType","uploadUrl","statusUrl","expiresIn","maxUploadBytes","downloadUrls","downloadNote"],"title":"UploadTicket"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VariantCache":{"properties":{"variant":{"type":"string","title":"Variant"},"state":{"type":"string","enum":["resident","queued","ssd","unavailable"],"title":"State"},"resident":{"type":"boolean","title":"Resident"},"serving":{"type":"boolean","title":"Serving"},"queued":{"type":"boolean","title":"Queued"},"bytes":{"type":"integer","title":"Bytes"},"eligible":{"type":"boolean","title":"Eligible"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["variant","state","resident","serving","queued","bytes","eligible"],"title":"VariantCache"},"VisibilityRequest":{"properties":{"visibility":{"type":"string","enum":["private","public"],"title":"Visibility"}},"type":"object","required":["visibility"],"title":"VisibilityRequest"},"WarmRequest":{"properties":{"variants":{"anyOf":[{"items":{"type":"string","enum":["thumb.webp","detail.webp","large.webp","poster.webp","playback.mp4"]},"type":"array","maxItems":5,"minItems":1},{"type":"null"}],"title":"Variants","description":"RAM에 적재할 파생 파일. 생략하면 해당 미디어의 모든 파생 파일을 요청합니다."}},"type":"object","title":"WarmRequest"}},"securitySchemes":{"BackendApiKey":{"type":"http","description":"백엔드 전용 MEDIA_API_KEY. 브라우저에 배포하지 않습니다.","scheme":"bearer"}}},"tags":[{"name":"Uploads","description":"백엔드 키로 경로를 예약하고 발급된 업로드 주소로 본문을 전송합니다."},{"name":"Folders","description":"namespace 권한에 따른 폴더 조회, 파일 이름 변경, 원자적 폴더 이동. 실제 저장 위치는 유지합니다."},{"name":"Inventory","description":"서버에서 폴더 범위를 제한한 파일 목록. 기본 24개, 최대 50개. 경로와 식별자 순서의 커서입니다."},{"name":"Media","description":"파일 상태, 공개 범위, 논리 삭제, 비공개 서명 주소. 모든 관리 작업은 해당 namespace 권한을 검사합니다."},{"name":"RAM cache","description":"영속 원본을 유지한 적재·해제. 파일별 접수와 완료를 구분하며 묶음은 최대 20개입니다."},{"name":"Public admin","description":"로그인 없는 화면. 서버가 허용한 legacy 영역의 메타데이터와 공개 파일 RAM 제어만 제공합니다."},{"name":"Delivery","description":"고유 식별자를 사용하는 다운로드. 비공개 파일은 서명 주소가 필요합니다."}]}