{"openapi":"3.1.0","info":{"title":"빌드모어 Data Core","description":"한국 부동산 개발/투자 AI 서비스의 데이터 백엔드 MVP.\n\n- 상권 데이터 / 비정형 문서 / LLM Wiki / 운영 로그를 위한 5개 도메인.\n- 모든 엔드포인트는 `/api` 접두사로 노출됩니다.\n- 내장 스케줄러: 매일 KST 11:00 자동 수집 (APScheduler).","version":"0.1.0"},"paths":{"/api/health":{"get":{"tags":["health"],"summary":"서버 헬스체크","description":"DB 연결 + APScheduler 상태를 확인하고 반환한다.","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/schema-summary":{"get":{"tags":["health"],"summary":"등록된 테이블 목록 요약 (내부 키 필요)","operationId":"schema_summary_api_schema_summary_get","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/regions/sido":{"get":{"tags":["core"],"summary":"시도 목록","description":"전국 시도(광역시·도) 목록.","operationId":"list_sido_api_regions_sido_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Sido Api Regions Sido Get"}}}}}}},"/api/regions/sigungu":{"get":{"tags":["core"],"summary":"시군구 목록","description":"전국 시군구 목록. sido 또는 sido_code로 필터링 가능.","operationId":"list_sigungu_api_regions_sigungu_get","parameters":[{"name":"sido","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시도명 필터 (예: 서울특별시)","title":"Sido"},"description":"시도명 필터 (예: 서울특별시)"},{"name":"sido_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시도코드 2자리 필터 (예: 11)","title":"Sido Code"},"description":"시도코드 2자리 필터 (예: 11)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Sigungu Api Regions Sigungu Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/regions/autocomplete":{"get":{"tags":["core"],"summary":"지역 이름 자동완성","description":"부분 이름으로 시도/시군구/동 목록을 반환한다.\n\n- `q`: 부분 이름 (full_name ILIKE 검색)\n- `level`: sido | sigungu | dong — 결과를 특정 계층으로 제한\n- `sido`: 시도명으로 결과를 좁힘 (ILIKE 부분일치)\n- 응답 필드: code, sido, sigungu, dong, full_name, level\n- `full_name` 구성 방식: sido → \"시도명\" / sigungu → \"시도명 시군구명\" / dong → \"시도명 시군구명 동명\"","operationId":"autocomplete_regions_api_regions_autocomplete_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"description":"부분 이름 검색어 (예: 마포, 강남)","title":"Q"},"description":"부분 이름 검색어 (예: 마포, 강남)"},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"계층 필터: sido | sigungu | dong","title":"Level"},"description":"계층 필터: sido | sigungu | dong"},{"name":"sido","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시도명 필터 (예: 서울, 서울특별시)","title":"Sido"},"description":"시도명 필터 (예: 서울, 서울특별시)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RegionAutocompleteResult"},"title":"Response Autocomplete Regions Api Regions Autocomplete Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/regions/search":{"get":{"tags":["core"],"summary":"행정구역 검색","description":"full_name 부분일치로 행정구역을 검색한다.","operationId":"search_regions_api_regions_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"검색어 (예: 강남, 마포구)","title":"Q"},"description":"검색어 (예: 강남, 마포구)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Search Regions Api Regions Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/regions/stats":{"get":{"tags":["core"],"summary":"행정구역 통계","operationId":"region_stats_api_regions_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Region Stats Api Regions Stats Get"}}}}}}},"/api/regions/seed":{"post":{"tags":["core"],"summary":"기준 데이터 시딩 (내부 키 필요)","description":"core_regions / core_asset_types / core_topics 초기 데이터 시딩.\n이미 데이터가 있어도 멱등(upsert) 실행.\n내부 키 없어도 개발 환경에서 호출 가능 (프로덕션에서만 INTERNAL_API_KEY 환경변수 설정).","operationId":"seed_regions_api_regions_seed_post","parameters":[{"name":"x_internal_api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X Internal Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Seed Regions Api Regions Seed Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/regions/dong":{"get":{"tags":["core"],"summary":"법정동 목록","description":"법정동(읍·면·동·리) 목록. sigungu_code 또는 sido로 필터링.","operationId":"list_dong_api_regions_dong_get","parameters":[{"name":"sigungu_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시군구코드 5자리 접두사 (예: 11440 → 마포구)","title":"Sigungu Code"},"description":"시군구코드 5자리 접두사 (예: 11440 → 마포구)"},{"name":"sido","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시도명 필터 (예: 서울특별시)","title":"Sido"},"description":"시도명 필터 (예: 서울특별시)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Dong Api Regions Dong Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sources":{"post":{"tags":["content"],"summary":"수집 소스 등록","operationId":"create_source_api_sources_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__content__SourceCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["content"],"summary":"수집 소스 목록","operationId":"list_sources_api_sources_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SourceOut"},"title":"Response List Sources Api Sources Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents":{"post":{"tags":["content"],"summary":"문서 등록","operationId":"create_document_api_documents_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["content"],"summary":"문서 목록","operationId":"list_documents_api_documents_get","parameters":[{"name":"source_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Id"}},{"name":"doc_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DocumentOut"},"title":"Response List Documents Api Documents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/count":{"get":{"tags":["content"],"summary":"문서 수 조회","description":"현재 필터 조건에 맞는 content_documents 의 전체 행 수를 반환한다.","operationId":"count_documents_api_documents_count_get","parameters":[{"name":"source_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Id"}},{"name":"doc_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"integer"},"title":"Response Count Documents Api Documents Count Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{document_id}":{"get":{"tags":["content"],"summary":"문서 상세 (태그 포함)","operationId":"get_document_api_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{document_id}/tags":{"post":{"tags":["content"],"summary":"문서에 태그 추가","operationId":"add_document_tag_api_documents__document_id__tags_post","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentTagCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentTagOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/content/search":{"get":{"tags":["content"],"summary":"블로그 + 유튜브 통합 하이브리드 검색 (벡터 + 키워드)","description":"블로그 사례 이미지와 유튜브 영상 자막을 한 번에 검색합니다.\n\n벡터 임베딩 + 키워드 하이브리드 검색으로 의미론적 유사도까지 반영합니다.\n\n- `sources=blog,youtube` (기본값) 으로 양쪽 모두 검색\n- `sources=blog` 또는 `sources=youtube` 로 한쪽만 검색\n- `category` 파라미터로 태그 기준 카테고리 필터 적용 가능\n- `sort=recency` (기본값): published_at 내림차순 (최신 우선)\n- `sort=views`: 유튜브 view_count 내림차순 (조회수 높은 순). 블로그는 조회수 없으므로 0으로 간주\n- `sort=relevance`: 검색어 매칭 점수 내림차순 (관련도 높은 순)\n- 각 결과에 `source_type` 필드로 출처 구분, `score`와 `search_mode` 포함\n- 블로그 결과에는 `preview_images` (최대 3장), 유튜브 결과에는 `thumbnail_url` 포함\n- `search_mode`: 응답 전체의 검색 전략 (\"vector\" | \"keyword\" | \"hybrid\")\n- `total`: sources 필터·category 필터·소스별 limit 적용 후 실제 반환된 결과 수","operationId":"unified_search_api_content_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","description":"검색 키워드","title":"Q"},"description":"검색 키워드"},{"name":"sources","in":"query","required":false,"schema":{"type":"string","description":"검색할 소스 (쉼표 구분). 가능한 값: blog, youtube","default":"blog,youtube","title":"Sources"},"description":"검색할 소스 (쉼표 구분). 가능한 값: blog, youtube"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"카테고리 필터 (태그 기준)","title":"Category"},"description":"카테고리 필터 (태그 기준)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"소스별 최대 결과 수","default":10,"title":"Limit"},"description":"소스별 최대 결과 수"},{"name":"sort","in":"query","required":false,"schema":{"enum":["recency","views","relevance"],"type":"string","description":"정렬 기준. recency=최신순(published_at), views=조회수순(유튜브 view_count), relevance=관련도순(검색 점수)","default":"recency","title":"Sort"},"description":"정렬 기준. recency=최신순(published_at), views=조회수순(유튜브 view_count), relevance=관련도순(검색 점수)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/notes":{"post":{"tags":["wiki"],"summary":"위키 노트 작성","operationId":"create_note_api_wiki_notes_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeNoteCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeNoteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["wiki"],"summary":"위키 노트 목록","operationId":"list_notes_api_wiki_notes_get","parameters":[{"name":"topic_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topic Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeNoteOut"},"title":"Response List Notes Api Wiki Notes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/notes/{note_id}":{"get":{"tags":["wiki"],"summary":"위키 노트 상세","operationId":"get_note_api_wiki_notes__note_id__get","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeNoteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["wiki"],"summary":"위키 노트 수정 (버전 자동 저장)","description":"노트를 수정하고, 변경 전 내용을 wiki_note_versions 에 스냅샷으로 저장한다.","operationId":"update_note_api_wiki_notes__note_id__put","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeNoteUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeNoteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/versions/prune":{"post":{"tags":["wiki"],"summary":"전체 노트 버전 일괄 정리 (보관 정책 초과분 삭제, ops 용도)","description":"전체(또는 특정) 노트를 대상으로 버전 보관 정책을 일괄 적용한다.\n\nX-Internal-API-Key 헤더를 통한 ops 인증이 필요하다.\n\n- retain_days 기준 초과 버전(가장 오래된 것부터) 삭제\n- max_per_note 기준 초과 버전(가장 오래된 것부터) 삭제\n- 삭제된 버전 수를 ops_logs 에 기록","operationId":"prune_versions_api_wiki_versions_prune_post","parameters":[{"name":"note_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"특정 노트만 정리. 미지정 시 전체 노트 대상.","title":"Note Id"},"description":"특정 노트만 정리. 미지정 시 전체 노트 대상."},{"name":"max_per_note","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"노트당 최대 보관 버전 수(최소 1). 미지정 시 NOTE_VERSION_MAX_PER_NOTE 환경변수 사용.","title":"Max Per Note"},"description":"노트당 최대 보관 버전 수(최소 1). 미지정 시 NOTE_VERSION_MAX_PER_NOTE 환경변수 사용."},{"name":"retain_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"버전 보관 기간(일, 최소 1). 미지정 시 NOTE_VERSION_RETAIN_DAYS 환경변수 사용.","title":"Retain Days"},"description":"버전 보관 기간(일, 최소 1). 미지정 시 NOTE_VERSION_RETAIN_DAYS 환경변수 사용."},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Prune Versions Api Wiki Versions Prune Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/notes/{note_id}/versions":{"get":{"tags":["wiki"],"summary":"위키 노트 버전 이력 목록","operationId":"list_note_versions_api_wiki_notes__note_id__versions_get","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NoteVersionOut"},"title":"Response List Note Versions Api Wiki Notes  Note Id  Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/notes/{note_id}/versions/{version_no}":{"get":{"tags":["wiki"],"summary":"위키 노트 특정 버전 조회","operationId":"get_note_version_api_wiki_notes__note_id__versions__version_no__get","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}},{"name":"version_no","in":"path","required":true,"schema":{"type":"integer","title":"Version No"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/notes/{note_id}/versions/{version_no}/diff":{"get":{"tags":["wiki"],"summary":"두 버전 사이 diff 확인","description":"두 버전의 content를 줄(line) 단위로 비교해 added/removed/unchanged 라인 목록을 반환한다.\n\n- `version_no` 가 기준(base) 버전\n- `compare_to` 가 비교 대상(compare) 버전\n- 없는 버전 번호면 404 반환","operationId":"diff_note_versions_api_wiki_notes__note_id__versions__version_no__diff_get","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}},{"name":"version_no","in":"path","required":true,"schema":{"type":"integer","title":"Version No"}},{"name":"compare_to","in":"query","required":true,"schema":{"type":"integer","description":"비교 대상 버전 번호","title":"Compare To"},"description":"비교 대상 버전 번호"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteDiffOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/notes/{note_id}/versions/{version_no}/revert":{"post":{"tags":["wiki"],"summary":"위키 노트를 특정 버전으로 되돌리기","description":"지정한 버전의 content 로 노트를 복원하고, 현재 상태를 먼저 스냅샷으로 저장한다.","operationId":"revert_note_to_version_api_wiki_notes__note_id__versions__version_no__revert_post","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}},{"name":"version_no","in":"path","required":true,"schema":{"type":"integer","title":"Version No"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeNoteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/chunks":{"post":{"tags":["wiki"],"summary":"문서 청크 등록 (임베딩 자동 생성)","operationId":"create_chunk_api_wiki_chunks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentChunkCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentChunkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/embeddings/backfill":{"post":{"tags":["wiki"],"summary":"미임베딩 청크 일괄 임베딩 생성 (백그라운드)","description":"embedding 컬럼이 NULL인 청크에 대해 fastembed로 임베딩을 일괄 생성한다.\n처리가 오래 걸릴 수 있으므로 백그라운드에서 실행하고 즉시 반환한다.","operationId":"backfill_embeddings_api_wiki_embeddings_backfill_post","parameters":[{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"한 번에 처리할 최대 청크 수","default":100,"title":"Batch Size"},"description":"한 번에 처리할 최대 청크 수"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Backfill Embeddings Api Wiki Embeddings Backfill Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/search":{"get":{"tags":["wiki"],"summary":"위키 검색 (초기에는 키워드, 추후 vector)","operationId":"search_api_wiki_search_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"검색어","title":"Query"},"description":"검색어"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/notes/generate":{"post":{"tags":["wiki"],"summary":"전체 태그 클러스터 위키 노트 생성/갱신 (로그인 필요)","description":"요약이 완료된 문서들을 태그별로 클러스터링하고\nLLM 으로 주제별 위키 노트를 생성/갱신한다.\nLLM 호출이 오래 걸리므로 백그라운드 스레드로 실행하고 즉시 반환한다.\n진행 결과는 GET /wiki/notes 로 확인.","operationId":"generate_all_notes_api_wiki_notes_generate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"max_tags","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"처리할 최대 태그 수","default":20,"title":"Max Tags"},"description":"처리할 최대 태그 수"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate All Notes Api Wiki Notes Generate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/notes/generate/{tag}":{"post":{"tags":["wiki"],"summary":"특정 태그의 위키 노트 즉시 생성/갱신 (로그인 필요)","description":"지정된 태그 1개에 대해 위키 노트를 즉시 생성하거나 갱신한다.","operationId":"generate_note_for_tag_api_wiki_notes_generate__tag__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tag","in":"path","required":true,"schema":{"type":"string","title":"Tag"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Note For Tag Api Wiki Notes Generate  Tag  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/extract/{document_id}":{"post":{"tags":["wiki"],"summary":"단일 문서 LLM 사실·지표 추출 (백그라운드)","description":"지정한 문서에서 사실(ExtractedFact)과 지표(MetricSnapshot)를 LLM으로 추출한다.\n\nops_processing_queue에 extract_facts / extract_metrics 작업을 등록한 뒤\nBackgroundTasks로 즉시 처리한다.\n\n- extract_facts  : 문서 청크 → LLM → wiki_extracted_facts INSERT (기존 레코드 재생성)\n- extract_metrics: 문서 메타데이터 → LLM → metric_snapshots INSERT (기존 레코드 재생성)\n- force=True    : 이미 done 상태인 task도 재등록하여 강제 재추출","operationId":"extract_document_api_wiki_extract__document_id__post","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"True면 이미 done인 task도 재등록하여 강제 재추출한다.","default":false,"title":"Force"},"description":"True면 이미 done인 task도 재등록하여 강제 재추출한다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Extract Document Api Wiki Extract  Document Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/compile/run":{"post":{"tags":["wiki"],"summary":"미처리 문서 일괄 Wiki Compiler 실행 (배치, 백그라운드)","description":"extract_facts + extract_metrics 가 완료(done)된 문서 중\ncompile_wiki 가 아직 done 이 아닌 문서를 최대 `limit`개 찾아 Wiki Compiler를 실행한다.","operationId":"run_compile_batch_api_wiki_compile_run_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"처리할 최대 문서 수","default":10,"title":"Limit"},"description":"처리할 최대 문서 수"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Run Compile Batch Api Wiki Compile Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/compile/{document_id}":{"post":{"tags":["wiki"],"summary":"단일 문서 Wiki Compiler 실행 (Fact/Metric → Note 병합, 백그라운드)","description":"특정 문서에서 추출된 Fact/Metric을 Wiki Note에 병합한다.\n\nops_processing_queue에 compile_wiki 작업을 등록한 뒤 BackgroundTasks로 즉시 처리한다.\n먼저 extract_facts + extract_metrics 가 완료(done)되어 있어야 의미 있는 결과가 나온다.","operationId":"compile_document_api_wiki_compile__document_id__post","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"True면 이미 done인 task도 재등록하여 강제 재컴파일","default":false,"title":"Force"},"description":"True면 이미 done인 task도 재등록하여 강제 재컴파일"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Compile Document Api Wiki Compile  Document Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/seed":{"post":{"tags":["wiki"],"summary":"Seed Wiki Notes 10개 생성 (설계서 Section 37)","description":"설계서에 정의된 10개 핵심 Wiki Note를 DB에 삽입한다.\n이미 동일 title이 존재하면 건너뛴다 (멱등).\n\n- DSCR 판단 기준\n- LTV 판단 기준\n- 상업용 부동산 담보대출 심사\n- 마포구 중소형 빌딩 시장\n- 서울 상권 매출 변화 해석\n- 유동인구 변화와 임대수요\n- 위반건축물 리스크\n- 도로폭과 개발 가능성\n- 가격협상 체크리스트\n- 은행 상담 전 준비자료","operationId":"seed_notes_api_wiki_seed_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Seed Notes Api Wiki Seed Post"}}}}}}},"/api/wiki/stats":{"get":{"tags":["wiki"],"summary":"Wiki 통계 (노트 수 / freshness / 카테고리 커버리지 / 미처리 큐)","description":"설계서 Phase 5.1 Wiki Stats API.\n\nReturns\n-------\ndict {\n    \"total_notes\": int,\n    \"fresh_notes\": int,\n    \"stale_notes\": int,\n    \"compiling_notes\": int,\n    \"today_updated\": int,\n    \"category_coverage\": { title: freshness_status },\n    \"pending_compile_tasks\": int,\n    \"pending_extract_tasks\": int,\n    \"seed_coverage\": { title: bool },\n}","operationId":"get_wiki_stats_api_wiki_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Wiki Stats Api Wiki Stats Get"}}}}}}},"/api/wiki/extract/run":{"get":{"tags":["wiki"],"summary":"미처리 문서 일괄 LLM 사실·지표 추출 (배치, 백그라운드)","description":"아직 extract_facts / extract_metrics 처리가 되지 않은 문서를 최대 `limit`개 찾아\nops_processing_queue에 등록하고 BackgroundTasks로 실행한다.\n\n'미처리'란 extract_facts + extract_metrics 두 task 모두 status='done'이\n아닌 문서를 의미한다. DB-level anti-join으로 전체 테이블을 스캔하므로\n오래된 문서도 빠지지 않는다.\n\n결과는 GET /api/wiki-intelligence/facts 및 GET /api/wiki-intelligence/snapshots 에서 확인한다.","operationId":"run_extract_batch_api_wiki_extract_run_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"처리할 최대 문서 수","default":10,"title":"Limit"},"description":"처리할 최대 문서 수"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Run Extract Batch Api Wiki Extract Run Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/signals/generate":{"post":{"tags":["wiki"],"summary":"전문가 규칙 기반 투자 시그널 자동 생성 (백그라운드)","description":"InferenceRule(전문가 규칙)에 등록된 input_conditions 를 현재 MetricDelta / ExtractedFact\n와 대조해 매칭된 규칙에서 WikiSignal 을 자동 생성한다.\n\n처리가 DB 조회를 포함하므로 BackgroundTasks 로 실행하고 즉시 반환한다.\n생성된 시그널은 GET /api/wiki/signals 로 확인한다.","operationId":"generate_signals_rule_engine_api_wiki_signals_generate_post","parameters":[{"name":"region_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"지역 코드 (예: 서울 마포구)","title":"Region Code"},"description":"지역 코드 (예: 서울 마포구)"},{"name":"asset_type_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"자산 유형 코드 (예: neighborhood_commercial)","title":"Asset Type Code"},"description":"자산 유형 코드 (예: neighborhood_commercial)"},{"name":"pnu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"PNU 코드","title":"Pnu"},"description":"PNU 코드"},{"name":"seed_rules","in":"query","required":false,"schema":{"type":"boolean","description":"True면 전문가 규칙이 없을 때 자동 시드","default":true,"title":"Seed Rules"},"description":"True면 전문가 규칙이 없을 때 자동 시드"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Signals Rule Engine Api Wiki Signals Generate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/signals":{"get":{"tags":["wiki"],"summary":"투자 시그널 목록 조회","description":"wiki_signals 테이블에서 시그널을 조회한다.\n\n- region_code / asset_type_code 로 필터링 가능.\n- 최신 생성 순으로 반환.\n- 시그널 생성은 POST /api/wiki/signals/generate 사용.","operationId":"list_wiki_signals_api_wiki_signals_get","parameters":[{"name":"region_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"지역 코드 필터","title":"Region Code"},"description":"지역 코드 필터"},{"name":"asset_type_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"자산 유형 코드 필터","title":"Asset Type Code"},"description":"자산 유형 코드 필터"},{"name":"pnu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"PNU 코드 필터","title":"Pnu"},"description":"PNU 코드 필터"},{"name":"signal_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시그널 유형 필터 (buy_timing / risk_warning / ...)","title":"Signal Type"},"description":"시그널 유형 필터 (buy_timing / risk_warning / ...)"},{"name":"direction","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"방향 필터 (favorable / unfavorable / mixed / neutral)","title":"Direction"},"description":"방향 필터 (favorable / unfavorable / mixed / neutral)"},{"name":"is_premium","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"프리미엄 시그널만 조회","title":"Is Premium"},"description":"프리미엄 시그널만 조회"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"최대 반환 건수","default":20,"title":"Limit"},"description":"최대 반환 건수"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"페이징 오프셋","default":0,"title":"Offset"},"description":"페이징 오프셋"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WikiSignalRead"},"title":"Response List Wiki Signals Api Wiki Signals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki/signals/seed-rules":{"post":{"tags":["wiki"],"summary":"전문가 규칙 시드 데이터 삽입 (rule_key 기준 멱등)","description":"rule_engine_service.EXPERT_RULES 에 정의된 전문가 규칙을 wiki_inference_rules 에 삽입한다.\nrule_key 기준으로 이미 존재하면 건너뜀 (멱등).","operationId":"seed_expert_rules_endpoint_api_wiki_signals_seed_rules_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Seed Expert Rules Endpoint Api Wiki Signals Seed Rules Post"}}}}}}},"/api/commercial-areas":{"post":{"tags":["commerce"],"summary":"상권 등록","operationId":"create_area_api_commercial_areas_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommercialAreaCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommercialAreaOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["commerce"],"summary":"상권 목록","operationId":"list_areas_api_commercial_areas_get","parameters":[{"name":"region_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Region Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CommercialAreaOut"},"title":"Response List Areas Api Commercial Areas Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/industries":{"post":{"tags":["commerce"],"summary":"업종 등록","operationId":"create_industry_api_industries_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndustryCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndustryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["commerce"],"summary":"업종 목록","operationId":"list_industries_api_industries_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/IndustryOut"},"title":"Response List Industries Api Industries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/area-sales-stats":{"post":{"tags":["commerce"],"summary":"상권 매출 등록","operationId":"create_sales_stat_api_area_sales_stats_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AreaSalesStatCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AreaSalesStatOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["commerce"],"summary":"상권 매출 목록","operationId":"list_sales_stats_api_area_sales_stats_get","parameters":[{"name":"area_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Area Id"}},{"name":"industry_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Industry Id"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM","title":"Period"},"description":"YYYY-MM"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AreaSalesStatOut"},"title":"Response List Sales Stats Api Area Sales Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vitality/indicators":{"get":{"tags":["commerce"],"summary":"상권활력 지표 DB/API 연결 상태","operationId":"commercial_vitality_indicators_api_vitality_indicators_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Commercial Vitality Indicators Api Vitality Indicators Get"}}}}}}},"/api/vitality/by-address":{"get":{"tags":["commerce"],"summary":"주소 기반 상권활력 지표 조회","operationId":"commercial_vitality_by_address_api_vitality_by_address_get","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","minLength":2,"title":"Address"}},{"name":"persist","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Persist"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Commercial Vitality By Address Api Vitality By Address Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/finance-rates/indicators":{"get":{"tags":["commerce"],"summary":"금융/금리 지표 DB/API 연결 상태","operationId":"finance_rate_indicators_api_finance_rates_indicators_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Finance Rate Indicators Api Finance Rates Indicators Get"}}}}}}},"/api/finance-rates/by-address":{"get":{"tags":["commerce"],"summary":"주소 기반 금융/금리 지표 조회","operationId":"finance_rates_by_address_api_finance_rates_by_address_get","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","minLength":2,"title":"Address"}},{"name":"persist","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Persist"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Finance Rates By Address Api Finance Rates By Address Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/commerce/ingest/seoul/areas":{"post":{"tags":["commerce"],"summary":"서울 열린데이터광장 — 상권 마스터 적재","operationId":"ingest_seoul_areas_api_commerce_ingest_seoul_areas_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"max_rows","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":20000,"minimum":1},{"type":"null"}],"description":"가져올 최대 행 수. 미지정 시 전체 (서울 전 상권 약 1,500개).","title":"Max Rows"},"description":"가져올 최대 행 수. 미지정 시 전체 (서울 전 상권 약 1,500개)."},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ingest Seoul Areas Api Commerce Ingest Seoul Areas Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/commerce/ingest/seoul/sales":{"post":{"tags":["commerce"],"summary":"서울 열린데이터광장 — 분기별 추정매출 적재 (대용량)","operationId":"ingest_seoul_sales_api_commerce_ingest_seoul_sales_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"max_rows","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200000,"minimum":1},{"type":"null"}],"description":"가져올 최대 행 수. 전체는 수십만 건이라 기본 2000 으로 제한.","default":2000,"title":"Max Rows"},"description":"가져올 최대 행 수. 전체는 수십만 건이라 기본 2000 으로 제한."},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ingest Seoul Sales Api Commerce Ingest Seoul Sales Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/commerce/ingest/seoul/floating":{"post":{"tags":["commerce"],"summary":"서울 열린데이터광장 — 분기별 유동인구 적재","operationId":"ingest_seoul_floating_api_commerce_ingest_seoul_floating_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"max_rows","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200000,"minimum":1},{"type":"null"}],"default":2000,"title":"Max Rows"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ingest Seoul Floating Api Commerce Ingest Seoul Floating Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/commerce/ingest/seoul/stores":{"post":{"tags":["commerce"],"summary":"서울 열린데이터광장 — 분기별 점포(업종 분포) 적재","operationId":"ingest_seoul_stores_api_commerce_ingest_seoul_stores_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"max_rows","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200000,"minimum":1},{"type":"null"}],"default":2000,"title":"Max Rows"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ingest Seoul Stores Api Commerce Ingest Seoul Stores Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/commerce/ingest/seoul/all":{"post":{"tags":["commerce"],"summary":"서울 상권 데이터 전체 적재 (백그라운드)","description":"상권 마스터 → 유동인구 → 추정매출 → 점포 4개 데이터셋을 순차 적재한다.\n요청 즉시 job_id 를 반환하고, 실제 적재는 백그라운드에서 진행된다.\n진행 상태는 GET /api/commerce/ingest/job/{job_id} 로 조회한다.","operationId":"ingest_seoul_all_background_api_commerce_ingest_seoul_all_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ingest Seoul All Background Api Commerce Ingest Seoul All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/commerce/ingest/job/{job_id}":{"get":{"tags":["commerce"],"summary":"상권 적재 잡 상태 조회","description":"ops_ingestion_jobs 에서 적재 잡의 현재 상태와 단계별 결과를 반환한다.","operationId":"get_ingest_job_status_api_commerce_ingest_job__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ingest Job Status Api Commerce Ingest Job  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/realty/ingest/seoul/transactions":{"post":{"tags":["commerce","realty"],"summary":"서울시 부동산 실거래가(매매) 적재","description":"서울 열린데이터광장 tbLnOpendataRtmsV → commerce_seoul_transactions 테이블 upsert.","operationId":"ingest_seoul_transactions_api_realty_ingest_seoul_transactions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"max_rows","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":100,"description":"수집할 최대 건수 (기본 5,000)","default":5000,"title":"Max Rows"},"description":"수집할 최대 건수 (기본 5,000)"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ingest Seoul Transactions Api Realty Ingest Seoul Transactions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/realty/ingest/seoul/rents":{"post":{"tags":["commerce","realty"],"summary":"서울시 전월세(임대차) 적재","description":"서울 열린데이터광장 tbLnOpendataRentV → commerce_seoul_rents 테이블 upsert.","operationId":"ingest_seoul_rents_api_realty_ingest_seoul_rents_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"max_rows","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":100,"description":"수집할 최대 건수 (기본 5,000)","default":5000,"title":"Max Rows"},"description":"수집할 최대 건수 (기본 5,000)"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ingest Seoul Rents Api Realty Ingest Seoul Rents Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/realty/ingest/seoul/all":{"post":{"tags":["commerce","realty"],"summary":"서울시 부동산 전체 적재 (백그라운드)","description":"매매 + 전월세를 백그라운드에서 순차 적재. job_id로 진행 상태 확인.","operationId":"ingest_seoul_realty_all_api_realty_ingest_seoul_all_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"max_rows_each","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":100,"description":"데이터셋별 최대 건수","default":5000,"title":"Max Rows Each"},"description":"데이터셋별 최대 건수"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ingest Seoul Realty All Api Realty Ingest Seoul All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/realty/seoul/transactions":{"get":{"tags":["commerce","realty"],"summary":"서울시 부동산 실거래가 조회","operationId":"list_seoul_transactions_api_realty_seoul_transactions_get","parameters":[{"name":"sigungu_nm","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"자치구명 필터 (예: 강남구)","title":"Sigungu Nm"},"description":"자치구명 필터 (예: 강남구)"},{"name":"building_use","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"건물용도 필터 (예: 아파트)","title":"Building Use"},"description":"건물용도 필터 (예: 아파트)"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"접수연도 필터","title":"Year"},"description":"접수연도 필터"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Seoul Transactions Api Realty Seoul Transactions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/realty/seoul/rents":{"get":{"tags":["commerce","realty"],"summary":"서울시 전월세 임대차 조회","operationId":"list_seoul_rents_api_realty_seoul_rents_get","parameters":[{"name":"sigungu_nm","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"자치구명 필터 (예: 마포구)","title":"Sigungu Nm"},"description":"자치구명 필터 (예: 마포구)"},{"name":"rent_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"임대구분 필터 (전세/월세)","title":"Rent Type"},"description":"임대구분 필터 (전세/월세)"},{"name":"building_use","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"건물용도 필터 (예: 아파트)","title":"Building Use"},"description":"건물용도 필터 (예: 아파트)"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"접수연도 필터","title":"Year"},"description":"접수연도 필터"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Seoul Rents Api Realty Seoul Rents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sba/stores/ingest":{"post":{"tags":["commerce","sba"],"summary":"소상공인 상가업소 수집 (백그라운드)","description":"전국 또는 지정 시군구의 상가업소 정보를 백그라운드로 수집한다.","operationId":"trigger_sba_ingest_api_sba_stores_ingest_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sigungu_codes","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"쉼표 구분 시군구코드 (예: 11110,11140). 미입력 시 전국 수집.","title":"Sigungu Codes"},"description":"쉼표 구분 시군구코드 (예: 11110,11140). 미입력 시 전국 수집."},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Sba Ingest Api Sba Stores Ingest Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sba/stores":{"get":{"tags":["commerce","sba"],"summary":"소상공인 상가업소 목록 조회","operationId":"list_sba_stores_api_sba_stores_get","parameters":[{"name":"sido_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시도명 필터 (예: 서울특별시)","title":"Sido Name"},"description":"시도명 필터 (예: 서울특별시)"},{"name":"sigungu_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시군구명 필터 (예: 강남구)","title":"Sigungu Name"},"description":"시군구명 필터 (예: 강남구)"},{"name":"industry_l_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"업종대분류명 필터 (예: 음식)","title":"Industry L Name"},"description":"업종대분류명 필터 (예: 음식)"},{"name":"industry_s_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"업종소분류명 필터","title":"Industry S Name"},"description":"업종소분류명 필터"},{"name":"store_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"상호명 검색 (부분일치)","title":"Store Name"},"description":"상호명 검색 (부분일치)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Sba Stores Api Sba Stores Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sba/stores/stats":{"get":{"tags":["commerce","sba"],"summary":"소상공인 상가업소 통계","operationId":"sba_store_stats_api_sba_stores_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sba Store Stats Api Sba Stores Stats Get"}}}}}}},"/api/ops/ingestion-jobs":{"post":{"tags":["ops"],"summary":"수집 작업 등록","operationId":"create_ingestion_job_api_ops_ingestion_jobs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestionJobCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestionJobOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["ops"],"summary":"수집 작업 목록","operationId":"list_ingestion_jobs_api_ops_ingestion_jobs_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/IngestionJobOut"},"title":"Response List Ingestion Jobs Api Ops Ingestion Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ops/processing-queue":{"post":{"tags":["ops"],"summary":"후처리 작업 큐 등록","operationId":"enqueue_processing_api_ops_processing_queue_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingQueueCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingQueueOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["ops"],"summary":"후처리 작업 큐 목록","operationId":"list_processing_queue_api_ops_processing_queue_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"task_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProcessingQueueOut"},"title":"Response List Processing Queue Api Ops Processing Queue Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ops/processing-queue/stats":{"get":{"tags":["ops"],"summary":"처리 큐 상태별 건수","description":"ops_processing_queue 의 status 별 건수를 반환한다 (pie chart 용).","operationId":"processing_queue_stats_api_ops_processing_queue_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Processing Queue Stats Api Ops Processing Queue Stats Get"}}}}}}},"/api/ops/logs":{"get":{"tags":["ops"],"summary":"운영 작업 실행 이력 조회","description":"ops_logs 테이블에 쌓인 스케줄러/운영 작업 실행 이력을 반환한다.\njob_id 파라미터로 특정 작업만 필터링할 수 있다.","operationId":"list_ops_logs_api_ops_logs_get","parameters":[{"name":"job_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"필터할 job_id (예: bjd_seed_monthly)","title":"Job Id"},"description":"필터할 job_id (예: bjd_seed_monthly)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OpsLogOut"},"title":"Response List Ops Logs Api Ops Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ops/scheduler":{"get":{"tags":["ops"],"summary":"스케줄러 상태 조회","description":"내장 스케줄러(APScheduler) 상태와 다음 실행 예정 시각을 반환한다.\n각 job 의 마지막 실행 결과(ops_logs 기반)도 함께 포함한다.","operationId":"get_scheduler_status_api_ops_scheduler_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Scheduler Status Api Ops Scheduler Get"}}}}}}},"/api/ops/scrape/molit":{"post":{"tags":["ops"],"summary":"korea.kr 국토교통부 뉴스 즉시 스크래핑","description":"korea.kr 국토교통부 정책뉴스를 즉시 스크래핑해서 DB 에 저장한다.\n부동산/상권/개발/아파트/건축 관련 기사만 필터링.","operationId":"scrape_molit_now_api_ops_scrape_molit_post","parameters":[{"name":"max_articles","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Max Articles"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Scrape Molit Now Api Ops Scrape Molit Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ops/scrape/corebeat":{"post":{"tags":["ops"],"summary":"코어비트 무료 기사 즉시 수집","description":"코어비트 무료 기사(news_paid_yn=N)를 즉시 수집해서 DB 에 저장한다.\nmax_pages 페이지까지 순회하며 신규 기사만 적재한다 (URL 중복 체크).","operationId":"scrape_corebeat_now_api_ops_scrape_corebeat_post","parameters":[{"name":"max_pages","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":5,"title":"Max Pages"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Scrape Corebeat Now Api Ops Scrape Corebeat Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ops/data-health":{"get":{"tags":["ops"],"summary":"데이터 수집 품질 대시보드","description":"주요 테이블 row count, 최근 수집 잡 상태, 큐 현황, 에러 현황을 한 번에 반환.\n운영자가 데이터 수집 품질을 빠르게 확인할 때 사용.","operationId":"data_health_api_ops_data_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Data Health Api Ops Data Health Get"}}}}}}},"/api/ops/source-coverage":{"get":{"tags":["ops"],"summary":"소스별 수집 현황","description":"등록된 모든 수집 소스의 현황 (마지막 동기화, 문서 수, 라이선스, 활성 여부)을 반환.\n공공데이터(서울 상권·실거래·SBA·개별공시지가·건축인허가)와 뉴스/유튜브 소스를 포함.","operationId":"source_coverage_api_ops_source_coverage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Source Coverage Api Ops Source Coverage Get"}}}}}}},"/api/ops/missing-data":{"get":{"tags":["ops"],"summary":"미수집·빈 데이터셋 현황","description":"현재 비어 있거나 미구현된 테이블, 알려진 이슈, 다음 권장 액션을 반환.","operationId":"missing_data_api_ops_missing_data_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Missing Data Api Ops Missing Data Get"}}}}}}},"/api/ops/scheduler/run-now":{"post":{"tags":["ops"],"summary":"daily_ingest 즉시 실행 (내부 키 필요)","description":"스케줄과 무관하게 daily_ingest 를 즉시 백그라운드로 실행한다.\n(테스트 또는 수동 트리거용)","operationId":"run_ingest_now_api_ops_scheduler_run_now_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Run Ingest Now Api Ops Scheduler Run Now Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ops/district-watcher/summary":{"get":{"tags":["ops"],"summary":"상권 동향 리포트 신호별 집계 요약","description":"district_watcher_reports 테이블을 집계해 한눈에 볼 수 있는 요약을 반환한다.\n\n- **signal_counts**: favorable / unfavorable / neutral 별 리포트 수\n- **top5_by_clicks**: 클릭 수 기준 상위 5개 상권 (district_name, bjd_code, click_count, exposed_count)\n- **latest_report_date**: 기간 내 가장 최근 리포트 생성일","operationId":"get_district_watcher_summary_api_ops_district_watcher_summary_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"최근 N일 이내 리포트 기준","default":30,"title":"Days"},"description":"최근 N일 이내 리포트 기준"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistrictWatcherSummaryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ops/district-watcher/reports":{"get":{"tags":["ops"],"summary":"상권 동향 리포트 목록 조회","description":"district_watcher_reports 테이블에서 최근 N일 이내 생성된 상권 동향 리포트를 반환한다.\n\n- **days**: 최근 며칠 이내 리포트를 가져올지 (기본 30일)\n- **signal**: favorable / unfavorable / neutral 로 필터링\n- **bjd_code**: 특정 상권(법정동코드) 필터\n- **is_active**: 노출 중인 리포트만 보려면 true","operationId":"list_district_watcher_reports_api_ops_district_watcher_reports_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"최근 N일 이내 리포트만 반환","default":30,"title":"Days"},"description":"최근 N일 이내 리포트만 반환"},{"name":"signal","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/SignalFilter"},{"type":"null"}],"description":"favorable | unfavorable | neutral","title":"Signal"},"description":"favorable | unfavorable | neutral"},{"name":"bjd_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"법정동코드 필터 (선택)","title":"Bjd Code"},"description":"법정동코드 필터 (선택)"},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"노출 여부 필터 (선택)","title":"Is Active"},"description":"노출 여부 필터 (선택)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DistrictWatcherReportOut"},"title":"Response List District Watcher Reports Api Ops District Watcher Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ops/district-watcher/stats/{bjd_code}":{"get":{"tags":["ops"],"summary":"특정 상권 분기별 유동인구·매출 시계열 조회","description":"commercial_district_stats 테이블에서 특정 법정동코드의 분기별 시계열 데이터를 반환한다.\n\n- **bjd_code**: 조회할 상권의 법정동코드\n- **years**: 최근 몇 년치를 가져올지 (기본 3년 = 최대 12개 분기)\n\n응답에는 분기별 유동인구(floating_population), 추정 매출액(sales_amount),\n점포 수(store_count), 개업률(open_rate), 폐업률(close_rate)이 포함된다.","operationId":"get_district_stats_api_ops_district_watcher_stats__bjd_code__get","parameters":[{"name":"bjd_code","in":"path","required":true,"schema":{"type":"string","title":"Bjd Code"}},{"name":"years","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"description":"최근 N년 데이터 반환","default":3,"title":"Years"},"description":"최근 N년 데이터 반환"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CommercialDistrictStatOut"},"title":"Response Get District Stats Api Ops District Watcher Stats  Bjd Code  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ops/scrape/yanolja":{"post":{"tags":["ops"],"summary":"야놀자 리서치 즉시 스크래핑 (내부 키 필요)","description":"야놀자 리서치(insight / trend / brief) 3개 섹션을 즉시 수집한다.\ntrend 는 PDF에서 텍스트 추출, insight/brief 는 HTML 본문 수집.","operationId":"scrape_yanolja_now_api_ops_scrape_yanolja_post","parameters":[{"name":"max_pages","in":"query","required":false,"schema":{"type":"integer","default":3,"title":"Max Pages"}},{"name":"fetch_body","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Fetch Body"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Scrape Yanolja Now Api Ops Scrape Yanolja Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ops/district-watcher/run":{"post":{"tags":["ops"],"summary":"상권 감시자 파이프라인 즉시 실행 (내부 키 필요)","description":"스케줄과 무관하게 상권 감시자 파이프라인을 즉시 동기 실행한다.\n서울시 열린데이터광장 API에서 유동인구·매출·개폐업률·점포수를 수집하고 LLM 리포트를 생성한다.\n완료 후 {\"status\": \"ok\", \"reports_generated\": int} 반환.\n(테스트 또는 수동 트리거용)","operationId":"run_district_watcher_now_api_ops_district_watcher_run_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Run District Watcher Now Api Ops District Watcher Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ingestion/run/{source_id}":{"post":{"tags":["ingestion"],"summary":"단일 소스 RSS 수집 (내부 키 필요)","description":"단일 source 의 RSS 를 동기적으로 수집한다.","operationId":"run_source_api_ingestion_run__source_id__post","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}},{"name":"max_items","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"이번 실행에서 가져올 최대 entry 수","default":30,"title":"Max Items"},"description":"이번 실행에서 가져올 최대 entry 수"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Run Source Api Ingestion Run  Source Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ingestion/run-all":{"post":{"tags":["ingestion"],"summary":"전체 소스 일괄 수집 (내부 키 필요)","description":"url 이 등록된 모든 source 를 순차적으로 수집한다.","operationId":"run_all_api_ingestion_run_all_post","parameters":[{"name":"max_items","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":30,"title":"Max Items"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Run All Api Ingestion Run All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ingestion/sync-state":{"get":{"tags":["ingestion"],"summary":"List Sync State","description":"소스별 마지막 동기화 시각/커서를 반환.","operationId":"list_sync_state_api_ingestion_sync_state_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Sync State Api Ingestion Sync State Get"}}}}}}},"/api/processing/run-batch":{"post":{"tags":["processing"],"summary":"큐 배치 처리 (내부 키 필요)","description":"processing_queue 에서 queued 작업을 꺼내 LLM 으로 처리한다.","operationId":"run_batch_api_processing_run_batch_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"이번 호출에서 처리할 큐 항목 최대 수","default":5,"title":"Limit"},"description":"이번 호출에서 처리할 큐 항목 최대 수"},{"name":"task_types","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"처리할 task_type 화이트리스트. 미지정 시 fetch_body/summarize/tag","title":"Task Types"},"description":"처리할 task_type 화이트리스트. 미지정 시 fetch_body/summarize/tag"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Run Batch Api Processing Run Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/processing/run-embed-batch":{"post":{"tags":["processing"],"summary":"임베딩 배치 처리 (내부 키 필요)","description":"embed task_type 만 골라서 처리한다.\n각 문서를 청크로 분할하고 OpenAI text-embedding-3-small 로 임베딩 후 저장.","operationId":"run_embed_batch_api_processing_run_embed_batch_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"이번 호출에서 임베딩할 문서 최대 수","default":5,"title":"Limit"},"description":"이번 호출에서 임베딩할 문서 최대 수"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Run Embed Batch Api Processing Run Embed Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/processing/enqueue-embeds":{"post":{"tags":["processing"],"summary":"임베딩 잡 일괄 등록 (내부 키 필요)","operationId":"enqueue_embeds_api_processing_enqueue_embeds_post","parameters":[{"name":"force_requeue","in":"query","required":false,"schema":{"type":"boolean","description":"True 면 이미 done 상태인 embed 도 다시 queued 로 등록 (재임베딩)","default":false,"title":"Force Requeue"},"description":"True 면 이미 done 상태인 embed 도 다시 queued 로 등록 (재임베딩)"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Enqueue Embeds Api Processing Enqueue Embeds Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/processing/enqueue-body-fetch":{"post":{"tags":["processing"],"summary":"본문 수집 잡 일괄 등록 (내부 키 필요)","operationId":"enqueue_body_fetch_api_processing_enqueue_body_fetch_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Enqueue Body Fetch Api Processing Enqueue Body Fetch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/processing/requeue-failed":{"post":{"tags":["processing"],"summary":"실패 잡 재큐 (내부 키 필요)","operationId":"requeue_failed_api_processing_requeue_failed_post","parameters":[{"name":"task_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"특정 task_type 만 재큐 (미지정 시 전체)","title":"Task Type"},"description":"특정 task_type 만 재큐 (미지정 시 전체)"},{"name":"include_skipped","in":"query","required":false,"schema":{"type":"boolean","description":"True 면 status=skipped 인 항목도 함께 재큐","default":false,"title":"Include Skipped"},"description":"True 면 status=skipped 인 항목도 함께 재큐"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Requeue Failed Api Processing Requeue Failed Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/processing/stats":{"get":{"tags":["processing"],"summary":"Stats","description":"큐 상태별 카운트를 반환.","operationId":"stats_api_processing_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stats Api Processing Stats Get"}}}}}}},"/api/processing/metrics/keys":{"get":{"tags":["processing"],"summary":"MetricSnapshot 에 존재하는 distinct metric_key 목록","description":"metric_snapshots 에서 중복 제거한 metric_key 목록을 반환한다.","operationId":"list_metric_keys_api_processing_metrics_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response List Metric Keys Api Processing Metrics Keys Get"}}}}}}},"/api/processing/metrics":{"get":{"tags":["processing"],"summary":"MetricSnapshot 조회 (문서 ID 또는 지표 키 기준)","description":"metric_snapshots 테이블을 조회한다.\n\n- **document_id** 지정 시: source_table='content_documents' AND source_id=document_id 필터 적용.\n- **metric_key** 지정 시: 날짜(period_start) 오름차순 정렬로 시계열 확인에 적합 (document_id 와 함께 써도 동일 정렬).\n- 두 파라미터 모두 미지정 시: 전체 스냅샷을 최신순(id desc)으로 반환.\n- 페이지네이션: page / page_size 쿼리 파라미터.","operationId":"list_metrics_api_processing_metrics_get","parameters":[{"name":"document_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"특정 문서(content_documents.id) 에서 추출된 스냅샷만 조회","title":"Document Id"},"description":"특정 문서(content_documents.id) 에서 추출된 스냅샷만 조회"},{"name":"metric_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"지표 키 부분 일치 검색 (예: interest_rate). document_id 와 함께 사용 가능","title":"Metric Key"},"description":"지표 키 부분 일치 검색 (예: interest_rate). document_id 와 함께 사용 가능"},{"name":"metric_category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"카테고리 필터 (commerce / realty / finance / construction / policy / rent)","title":"Metric Category"},"description":"카테고리 필터 (commerce / realty / finance / construction / policy / rent)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"페이지 번호 (1부터 시작)","default":1,"title":"Page"},"description":"페이지 번호 (1부터 시작)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"페이지 당 항목 수","default":20,"title":"Page Size"},"description":"페이지 당 항목 수"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricSnapshotPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/land-prices":{"get":{"tags":["land-prices"],"summary":"공시지가 DB 목록 조회","description":"DB에 수집된 개별공시지가 목록을 반환한다.\n\n**이름 기반 지역 필터 (core_regions JOIN)**\n- `sido`: 시/도 이름으로 필터 (예: `sido=서울특별시`)\n- `sigungu`: 시/군/구 이름으로 필터 (예: `sigungu=마포구`)\n- `dong`: 읍/면/동 이름으로 필터 (예: `dong=신수동`)\n\n이름 필터는 core_regions 테이블과 JOIN하여 코드로 변환 후 적용된다.\n`sigungu_cd`를 직접 지정하면 이름 기반 필터보다 우선 적용된다.","operationId":"list_land_prices_api_land_prices_get","parameters":[{"name":"sido","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시/도 이름 (예: 서울특별시)","title":"Sido"},"description":"시/도 이름 (예: 서울특별시)"},{"name":"sigungu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시/군/구 이름 (예: 마포구)","title":"Sigungu"},"description":"시/군/구 이름 (예: 마포구)"},{"name":"dong","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"읍/면/동 이름 (예: 신수동)","title":"Dong"},"description":"읍/면/동 이름 (예: 신수동)"},{"name":"sigungu_cd","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시군구 코드 5자리 (직접 지정 시 우선 적용)","title":"Sigungu Cd"},"description":"시군구 코드 5자리 (직접 지정 시 우선 적용)"},{"name":"base_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"기준연도","title":"Base Year"},"description":"기준연도"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Land Prices Api Land Prices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/land-prices/stats":{"get":{"tags":["land-prices"],"summary":"공시지가 통계","description":"개별공시지가 집계 통계.\n\n**이름 기반 지역 필터**\n- `sido`: 시/도 이름 (예: `sido=서울특별시`)\n- `sigungu`: 시/군/구 이름 (예: `sigungu=마포구`)\n\n**연도 필터** (`base_year` 기준)\n- `base_year`: 특정 연도 단일 필터 (예: `base_year=2023`)\n- `start_year` / `end_year`: 연도 범위 필터 (예: `start_year=2020&end_year=2023`)\n\n`base_year`와 `start_year`/`end_year`를 동시에 사용하면 `base_year`가 우선 적용된다.\n필터 없이 호출하면 전체 데이터 집계를 반환한다.","operationId":"stats_api_land_prices_stats_get","parameters":[{"name":"sido","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시/도 이름으로 필터 (예: 서울특별시)","title":"Sido"},"description":"시/도 이름으로 필터 (예: 서울특별시)"},{"name":"sigungu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시/군/구 이름으로 필터 (예: 마포구)","title":"Sigungu"},"description":"시/군/구 이름으로 필터 (예: 마포구)"},{"name":"base_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"기준연도 (예: 2023) — 특정 연도만 집계","title":"Base Year"},"description":"기준연도 (예: 2023) — 특정 연도만 집계"},{"name":"start_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"기준연도 범위 시작 (예: 2020)","title":"Start Year"},"description":"기준연도 범위 시작 (예: 2020)"},{"name":"end_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"기준연도 범위 종료 (예: 2023)","title":"End Year"},"description":"기준연도 범위 종료 (예: 2023)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Stats Api Land Prices Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/land-prices/ingest":{"post":{"tags":["land-prices"],"summary":"개별공시지가 수집 트리거 (내부 키 필요)","operationId":"trigger_ingest_api_land_prices_ingest_post","parameters":[{"name":"sigungu_cd","in":"query","required":false,"schema":{"type":"string","description":"시군구 코드 (5자리)","default":"11110","title":"Sigungu Cd"},"description":"시군구 코드 (5자리)"},{"name":"year","in":"query","required":false,"schema":{"type":"integer","description":"기준연도","default":2023,"title":"Year"},"description":"기준연도"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Ingest Api Land Prices Ingest Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/building-permits/lookup":{"get":{"tags":["building-permits"],"summary":"건축인허가 요청 시 수집 조회","description":"**요청 시 수집 (On-Demand Ingestion)**\n\n1. DB에 해당 구역+날짜의 수집 이력이 있으면 → DB에서 즉시 반환 (`source: \"db\"`)\n2. 없으면 → 공공데이터 API 실시간 수집 → DB 저장 → 반환 (`source: \"api\"`)\n\n- `force_refresh=true`: 이미 수집된 데이터도 API에서 다시 가져와 갱신\n- 응답 시간: DB 히트 ~10ms, API 수집 시 1~5초","operationId":"lookup_api_building_permits_lookup_get","parameters":[{"name":"sigungu_cd","in":"query","required":true,"schema":{"type":"string","description":"시군구 코드 5자리 (예: 11680=강남구)","title":"Sigungu Cd"},"description":"시군구 코드 5자리 (예: 11680=강남구)"},{"name":"bjdong_cd","in":"query","required":true,"schema":{"type":"string","description":"법정동 코드 5자리 (예: 10100)","title":"Bjdong Cd"},"description":"법정동 코드 5자리 (예: 10100)"},{"name":"start_date","in":"query","required":false,"schema":{"type":"string","description":"허가일 시작 YYYYMMDD","default":"20230101","title":"Start Date"},"description":"허가일 시작 YYYYMMDD"},{"name":"end_date","in":"query","required":false,"schema":{"type":"string","description":"허가일 종료 YYYYMMDD","default":"20231231","title":"End Date"},"description":"허가일 종료 YYYYMMDD"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"force_refresh","in":"query","required":false,"schema":{"type":"boolean","description":"True이면 캐시 무시하고 API 재수집","default":false,"title":"Force Refresh"},"description":"True이면 캐시 무시하고 API 재수집"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Lookup Api Building Permits Lookup Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/building-permits/cache":{"get":{"tags":["building-permits"],"summary":"수집 캐시 목록 조회","description":"지금까지 수집 완료된 구역+날짜 조합 목록.","operationId":"list_cache_api_building_permits_cache_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Cache Api Building Permits Cache Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/building-permits/cache/{cache_key}":{"delete":{"tags":["building-permits"],"summary":"특정 캐시 무효화","description":"특정 캐시 키를 무효화 → 다음 lookup 시 API 재수집.","operationId":"invalidate_cache_api_building_permits_cache__cache_key__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cache_key","in":"path","required":true,"schema":{"type":"string","title":"Cache Key"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Invalidate Cache Api Building Permits Cache  Cache Key  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/building-permits/status":{"get":{"tags":["building-permits"],"summary":"건축인허가 API 상태 확인","operationId":"check_status_api_building_permits_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Check Status Api Building Permits Status Get"}}}}}}},"/api/building-permits/ingest":{"post":{"tags":["building-permits"],"summary":"건축인허가 백그라운드 수집 (내부 키 필요)","operationId":"trigger_ingest_api_building_permits_ingest_post","parameters":[{"name":"sigungu_cd","in":"query","required":false,"schema":{"type":"string","description":"시군구 코드 5자리","default":"11110","title":"Sigungu Cd"},"description":"시군구 코드 5자리"},{"name":"bjdong_cd","in":"query","required":false,"schema":{"type":"string","description":"법정동 코드 5자리","default":"10100","title":"Bjdong Cd"},"description":"법정동 코드 5자리"},{"name":"start_date","in":"query","required":false,"schema":{"type":"string","description":"허가일 시작 YYYYMMDD","default":"20230101","title":"Start Date"},"description":"허가일 시작 YYYYMMDD"},{"name":"end_date","in":"query","required":false,"schema":{"type":"string","description":"허가일 종료 YYYYMMDD","default":"20231231","title":"End Date"},"description":"허가일 종료 YYYYMMDD"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Ingest Api Building Permits Ingest Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/building-permits":{"get":{"tags":["building-permits"],"summary":"건축인허가 DB 목록 직접 조회","description":"DB에 있는 데이터만 반환. 없어도 API 호출 안 함. 실시간 조회는 `/lookup` 사용.\n\n**이름 기반 지역 필터 (core_regions JOIN)**\n- `sido`: 시/도 이름으로 필터 (예: `sido=서울특별시`)\n- `sigungu`: 시/군/구 이름으로 필터 (예: `sigungu=마포구`)\n- `dong`: 읍/면/동 이름으로 필터 (예: `dong=신수동`)\n\n`sigungu_cd`를 직접 지정하면 이름 기반 필터보다 우선 적용된다.","operationId":"list_permits_api_building_permits_get","parameters":[{"name":"sido","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시/도 이름 (예: 서울특별시)","title":"Sido"},"description":"시/도 이름 (예: 서울특별시)"},{"name":"sigungu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시/군/구 이름 (예: 마포구)","title":"Sigungu"},"description":"시/군/구 이름 (예: 마포구)"},{"name":"dong","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"읍/면/동 이름 (예: 신수동)","title":"Dong"},"description":"읍/면/동 이름 (예: 신수동)"},{"name":"sigungu_cd","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시군구 코드 5자리 (직접 지정 시 우선 적용)","title":"Sigungu Cd"},"description":"시군구 코드 5자리 (직접 지정 시 우선 적용)"},{"name":"permit_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"건축구분 (신축/증축/개축 등)","title":"Permit Type"},"description":"건축구분 (신축/증축/개축 등)"},{"name":"main_use","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"주용도 필터","title":"Main Use"},"description":"주용도 필터"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Permits Api Building Permits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/building-permits/stats":{"get":{"tags":["building-permits"],"summary":"건축인허가 통계","description":"건축인허가 집계 통계.\n\n**이름 기반 지역 필터**\n- `sido`: 시/도 이름 (예: `sido=서울특별시`)\n- `sigungu`: 시/군/구 이름 (예: `sigungu=마포구`)\n\n**날짜 범위 필터** (`permit_date` 기준)\n- `start_date`: 시작일 YYYYMMDD (예: `start_date=20230101`)\n- `end_date`: 종료일 YYYYMMDD (예: `end_date=20231231`)\n\n필터 없이 호출하면 전체 데이터 집계를 반환한다.","operationId":"stats_api_building_permits_stats_get","parameters":[{"name":"sido","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시/도 이름으로 필터 (예: 서울특별시)","title":"Sido"},"description":"시/도 이름으로 필터 (예: 서울특별시)"},{"name":"sigungu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시/군/구 이름으로 필터 (예: 마포구)","title":"Sigungu"},"description":"시/군/구 이름으로 필터 (예: 마포구)"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"허가일 시작 YYYYMMDD (예: 20230101)","title":"Start Date"},"description":"허가일 시작 YYYYMMDD (예: 20230101)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"허가일 종료 YYYYMMDD (예: 20231231)","title":"End Date"},"description":"허가일 종료 YYYYMMDD (예: 20231231)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Stats Api Building Permits Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/properties/info":{"get":{"tags":["properties"],"summary":"주소 → 건물/토지/용도지역/금리 통합 조회","description":"카카오 지오코딩 + 공공데이터포털 API를 통해 주소 하나로 전체 물건 정보를 반환합니다.\n\n- 카카오: 좌표 변환, 법정동코드, PNU 조합\n- 건축물대장 표제부: 대지면적, 건축면적, 연면적, 층수, 준공연도, 용도\n- 개별공시지가: 원/㎡ 공시지가\n- 토지이용계획: 용도지역, 건폐율, 용적률\n- ECOS: 기준금리, 추정 대출금리 (키 설정 시)","operationId":"get_property_info_api_properties_info_get","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","description":"조회할 주소 (예: 서울시 마포구 신수동 27-2)","title":"Address"},"description":"조회할 주소 (예: 서울시 마포구 신수동 27-2)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Property Info Api Properties Info Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/properties/build-from-sba":{"post":{"tags":["properties"],"summary":"SBA 상가업소 → 부동산 마스터 생성","description":"commerce_sba_stores 에서 pnu 가 있는 상가업소를 commerce_properties 에 upsert.\nPNU를 unique key로 사용. 기존 데이터는 주소/좌표 갱신.","operationId":"build_from_sba_api_properties_build_from_sba_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50000,"minimum":1,"description":"처리할 SBA 상가업소 최대 건수","default":10000,"title":"Limit"},"description":"처리할 SBA 상가업소 최대 건수"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Build From Sba Api Properties Build From Sba Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/properties/build-from-realty":{"post":{"tags":["properties"],"summary":"서울 실거래 → 부동산 마스터 생성","description":"commerce_seoul_transactions 에서 주소 기반으로 property 후보를 생성.\nPNU 없으므로 'TX-' 접두사 합성 키 사용. 기존 PNU가 있는 경우 충돌 방지(on_conflict_do_nothing).","operationId":"build_from_realty_api_properties_build_from_realty_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20000,"minimum":1,"description":"처리할 실거래 레코드 최대 건수","default":5000,"title":"Limit"},"description":"처리할 실거래 레코드 최대 건수"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Build From Realty Api Properties Build From Realty Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/properties":{"get":{"tags":["properties"],"summary":"부동산 마스터 목록","operationId":"list_properties_api_properties_get","parameters":[{"name":"sido","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sido"}},{"name":"sigungu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sigungu"}},{"name":"pnu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Properties Api Properties Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/properties/{property_id}":{"get":{"tags":["properties"],"summary":"부동산 마스터 상세","operationId":"get_property_api_properties__property_id__get","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","title":"Property Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Property Api Properties  Property Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sources/license-summary":{"get":{"tags":["sources"],"summary":"데이터 출처·라이선스 요약","description":"수집 중인 모든 데이터 소스의 라이선스 및 재사용 가능 여부를 반환.\n공공데이터(하드코딩) + DB 등록 소스(content_sources)를 합산.","operationId":"license_summary_api_sources_license_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response License Summary Api Sources License Summary Get"}}}}}}},"/api/development-permits/lookup":{"get":{"tags":["development-permits"],"summary":"개발행위허가 요청 시 수집 조회","description":"**요청 시 수집 (On-Demand Ingestion)**\n\n- DB에 해당 구역+날짜 수집 이력이 있으면 → DB 즉시 반환 (`source: \"db\"`)\n- 없으면 → 공공데이터 API 실시간 수집 → DB 저장 → 반환 (`source: \"api\"`)\n- API 미준비(403) 상태에서는 503 반환","operationId":"lookup_api_development_permits_lookup_get","parameters":[{"name":"sigungu_cd","in":"query","required":true,"schema":{"type":"string","description":"시군구 코드 5자리 (예: 11680=강남구)","title":"Sigungu Cd"},"description":"시군구 코드 5자리 (예: 11680=강남구)"},{"name":"start_ymd","in":"query","required":false,"schema":{"type":"string","description":"허가일 시작 YYYYMMDD","default":"20230101","title":"Start Ymd"},"description":"허가일 시작 YYYYMMDD"},{"name":"end_ymd","in":"query","required":false,"schema":{"type":"string","description":"허가일 종료 YYYYMMDD","default":"20231231","title":"End Ymd"},"description":"허가일 종료 YYYYMMDD"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"force_refresh","in":"query","required":false,"schema":{"type":"boolean","description":"True이면 캐시 무시하고 API 재수집","default":false,"title":"Force Refresh"},"description":"True이면 캐시 무시하고 API 재수집"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Lookup Api Development Permits Lookup Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/development-permits/cache":{"get":{"tags":["development-permits"],"summary":"개발행위허가 수집 캐시 목록","operationId":"list_cache_api_development_permits_cache_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Cache Api Development Permits Cache Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/development-permits/cache/{cache_key}":{"delete":{"tags":["development-permits"],"summary":"개발행위허가 캐시 무효화","operationId":"invalidate_cache_api_development_permits_cache__cache_key__delete","parameters":[{"name":"cache_key","in":"path","required":true,"schema":{"type":"string","title":"Cache Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Invalidate Cache Api Development Permits Cache  Cache Key  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/development-permits/status":{"get":{"tags":["development-permits"],"summary":"개발행위허가 API 상태 확인","description":"DATA_GO_KR_API_KEY 설정 및 API 응답 상태 확인.","operationId":"check_status_api_development_permits_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Check Status Api Development Permits Status Get"}}}}}}},"/api/development-permits/ingest":{"post":{"tags":["development-permits"],"summary":"개발행위허가 수집 트리거 (내부 키 필요)","operationId":"trigger_ingest_api_development_permits_ingest_post","parameters":[{"name":"sigungu_cd","in":"query","required":false,"schema":{"type":"string","description":"시군구 코드 5자리 (11110=종로구)","default":"11110","title":"Sigungu Cd"},"description":"시군구 코드 5자리 (11110=종로구)"},{"name":"start_ymd","in":"query","required":false,"schema":{"type":"string","description":"허가일 시작 YYYYMMDD","default":"20230101","title":"Start Ymd"},"description":"허가일 시작 YYYYMMDD"},{"name":"end_ymd","in":"query","required":false,"schema":{"type":"string","description":"허가일 종료 YYYYMMDD","default":"20231231","title":"End Ymd"},"description":"허가일 종료 YYYYMMDD"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Ingest Api Development Permits Ingest Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/development-permits/ingest-seoul-all":{"post":{"tags":["development-permits"],"summary":"서울시 전 자치구 개발행위허가 일괄 수집 (내부 키 필요)","operationId":"trigger_ingest_seoul_all_api_development_permits_ingest_seoul_all_post","parameters":[{"name":"start_ymd","in":"query","required":false,"schema":{"type":"string","description":"허가일 시작 YYYYMMDD","default":"20230101","title":"Start Ymd"},"description":"허가일 시작 YYYYMMDD"},{"name":"end_ymd","in":"query","required":false,"schema":{"type":"string","description":"허가일 종료 YYYYMMDD (1개 분기 권장)","default":"20230331","title":"End Ymd"},"description":"허가일 종료 YYYYMMDD (1개 분기 권장)"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Ingest Seoul All Api Development Permits Ingest Seoul All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/development-permits":{"get":{"tags":["development-permits"],"summary":"개발행위허가 목록","description":"DB에 수집된 개발행위허가 목록을 반환한다.\n\n**이름 기반 지역 필터 (core_regions JOIN)**\n- `sido`: 시/도 이름으로 필터 (예: `sido=서울특별시`)\n- `sigungu`: 시/군/구 이름으로 필터 (예: `sigungu=마포구`)\n- `dong`: 읍/면/동 이름으로 필터 (예: `dong=신수동`) — emd_nm 컬럼에 적용\n\n`sigungu_cd`를 직접 지정하면 이름 기반 필터보다 우선 적용된다.\n`sigungu_nm`은 하위 호환용으로 유지된다 (sigungu 파라미터 권장).","operationId":"list_permits_api_development_permits_get","parameters":[{"name":"sido","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시/도 이름 (예: 서울특별시)","title":"Sido"},"description":"시/도 이름 (예: 서울특별시)"},{"name":"sigungu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시/군/구 이름 (예: 마포구)","title":"Sigungu"},"description":"시/군/구 이름 (예: 마포구)"},{"name":"dong","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"읍/면/동 이름 (예: 신수동)","title":"Dong"},"description":"읍/면/동 이름 (예: 신수동)"},{"name":"sigungu_cd","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시군구 코드 5자리 (직접 지정 시 우선 적용)","title":"Sigungu Cd"},"description":"시군구 코드 5자리 (직접 지정 시 우선 적용)"},{"name":"sigungu_nm","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시군구명 (부분 일치, 하위 호환용)","title":"Sigungu Nm"},"description":"시군구명 (부분 일치, 하위 호환용)"},{"name":"prmisn_purps","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"허가목적 부분 일치 (예: 건축물건축)","title":"Prmisn Purps"},"description":"허가목적 부분 일치 (예: 건축물건축)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Permits Api Development Permits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/development-permits/stats":{"get":{"tags":["development-permits"],"summary":"개발행위허가 통계","description":"개발행위허가 집계 통계.\n\n**이름 기반 지역 필터**\n- `sido`: 시/도 이름 (예: `sido=서울특별시`)\n- `sigungu`: 시/군/구 이름 (예: `sigungu=마포구`)\n\n**날짜 범위 필터** (`prmisn_de` 허가일 기준)\n- `start_ymd`: 시작일 YYYYMMDD (예: `start_ymd=20230101`)\n- `end_ymd`: 종료일 YYYYMMDD (예: `end_ymd=20231231`)\n\n필터 없이 호출하면 전체 데이터 집계를 반환한다.","operationId":"stats_api_development_permits_stats_get","parameters":[{"name":"sido","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시/도 이름으로 필터 (예: 서울특별시)","title":"Sido"},"description":"시/도 이름으로 필터 (예: 서울특별시)"},{"name":"sigungu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"시/군/구 이름으로 필터 (예: 마포구)","title":"Sigungu"},"description":"시/군/구 이름으로 필터 (예: 마포구)"},{"name":"start_ymd","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"허가일 시작 YYYYMMDD (예: 20230101)","title":"Start Ymd"},"description":"허가일 시작 YYYYMMDD (예: 20230101)"},{"name":"end_ymd","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"허가일 종료 YYYYMMDD (예: 20231231)","title":"End Ymd"},"description":"허가일 종료 YYYYMMDD (예: 20231231)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Stats Api Development Permits Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reits/lookup/companies":{"get":{"tags":["reits"],"summary":"리츠 목록 요청 시 수집 조회","description":"**리츠 목록 요청 시 수집**\n\n- DB에 수집 이력 있으면 → DB 즉시 반환 (`source: \"db\"`)\n- 없으면 → 공공데이터 API 실시간 수집 → DB 저장 → 반환 (`source: \"api\"`)\n- API 미준비(404) 상태에서는 503 반환","operationId":"lookup_companies_api_reits_lookup_companies_get","parameters":[{"name":"reits_type_nm","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"리츠 유형 필터","title":"Reits Type Nm"},"description":"리츠 유형 필터"},{"name":"lstg_yn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"상장여부 Y/N","title":"Lstg Yn"},"description":"상장여부 Y/N"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"force_refresh","in":"query","required":false,"schema":{"type":"boolean","description":"True이면 캐시 무시하고 API 재수집","default":false,"title":"Force Refresh"},"description":"True이면 캐시 무시하고 API 재수집"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Lookup Companies Api Reits Lookup Companies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reits/companies/{reits_no}/lookup":{"get":{"tags":["reits"],"summary":"특정 리츠 상세 요청 시 수집","description":"**특정 리츠 상세 요청 시 수집**\n\n투자대상 + 공시사항 + 공모현황을 한 번에 조회.\nDB에 없으면 API 실시간 수집 후 반환.","operationId":"lookup_reits_detail_api_reits_companies__reits_no__lookup_get","parameters":[{"name":"reits_no","in":"path","required":true,"schema":{"type":"string","title":"Reits No"}},{"name":"force_refresh","in":"query","required":false,"schema":{"type":"boolean","description":"True이면 캐시 무시하고 API 재수집","default":false,"title":"Force Refresh"},"description":"True이면 캐시 무시하고 API 재수집"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Lookup Reits Detail Api Reits Companies  Reits No  Lookup Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reits/cache":{"get":{"tags":["reits"],"summary":"리츠 수집 캐시 목록","operationId":"list_cache_api_reits_cache_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Cache Api Reits Cache Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reits/cache/{cache_key}":{"delete":{"tags":["reits"],"summary":"리츠 캐시 무효화","operationId":"invalidate_cache_api_reits_cache__cache_key__delete","parameters":[{"name":"cache_key","in":"path","required":true,"schema":{"type":"string","title":"Cache Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Invalidate Cache Api Reits Cache  Cache Key  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reits/status":{"get":{"tags":["reits"],"summary":"리츠 API 상태 확인","description":"DATA_GO_KR_API_KEY 설정 및 리츠 API 응답 상태 확인.","operationId":"check_status_api_reits_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Check Status Api Reits Status Get"}}}}}}},"/api/reits/ingest/companies":{"post":{"tags":["reits"],"summary":"리츠 목록 수집 (내부 키 필요)","operationId":"ingest_companies_api_reits_ingest_companies_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ingest Companies Api Reits Ingest Companies Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reits/ingest/all":{"post":{"tags":["reits"],"summary":"리츠 전체 수집 (목록 + 하위 데이터, 내부 키 필요)","operationId":"ingest_all_api_reits_ingest_all_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ingest All Api Reits Ingest All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reits/ingest/properties/{reits_no}":{"post":{"tags":["reits"],"summary":"특정 리츠 투자대상 수집 (내부 키 필요)","operationId":"ingest_properties_api_reits_ingest_properties__reits_no__post","parameters":[{"name":"reits_no","in":"path","required":true,"schema":{"type":"string","title":"Reits No"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ingest Properties Api Reits Ingest Properties  Reits No  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reits/companies":{"get":{"tags":["reits"],"summary":"리츠 목록 조회","operationId":"list_companies_api_reits_companies_get","parameters":[{"name":"reits_type_nm","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"리츠 유형 필터","title":"Reits Type Nm"},"description":"리츠 유형 필터"},{"name":"lstg_yn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"상장여부 Y/N","title":"Lstg Yn"},"description":"상장여부 Y/N"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Companies Api Reits Companies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reits/companies/{reits_no}":{"get":{"tags":["reits"],"summary":"리츠 상세","operationId":"get_company_api_reits_companies__reits_no__get","parameters":[{"name":"reits_no","in":"path","required":true,"schema":{"type":"string","title":"Reits No"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Company Api Reits Companies  Reits No  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reits/companies/{reits_no}/properties":{"get":{"tags":["reits"],"summary":"리츠 투자대상 목록","operationId":"list_reits_properties_api_reits_companies__reits_no__properties_get","parameters":[{"name":"reits_no","in":"path","required":true,"schema":{"type":"string","title":"Reits No"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Reits Properties Api Reits Companies  Reits No  Properties Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reits/companies/{reits_no}/disclosures":{"get":{"tags":["reits"],"summary":"리츠 공시사항 목록","operationId":"list_disclosures_api_reits_companies__reits_no__disclosures_get","parameters":[{"name":"reits_no","in":"path","required":true,"schema":{"type":"string","title":"Reits No"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Disclosures Api Reits Companies  Reits No  Disclosures Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reits/companies/{reits_no}/offerings":{"get":{"tags":["reits"],"summary":"리츠 공모현황 목록","operationId":"list_offerings_api_reits_companies__reits_no__offerings_get","parameters":[{"name":"reits_no","in":"path","required":true,"schema":{"type":"string","title":"Reits No"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Offerings Api Reits Companies  Reits No  Offerings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reits/stats":{"get":{"tags":["reits"],"summary":"리츠 통계","operationId":"stats_api_reits_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stats Api Reits Stats Get"}}}}}}},"/api/blog/ingest":{"post":{"tags":["blog"],"summary":"시공조아 블로그 전체 수집 (내부 키 필요)","operationId":"trigger_ingest_api_blog_ingest_post","parameters":[{"name":"max_posts","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"최대 수집 포스트 수 (RSS 기준 최대 50)","default":50,"title":"Max Posts"},"description":"최대 수집 포스트 수 (RSS 기준 최대 50)"},{"name":"delay_sec","in":"query","required":false,"schema":{"type":"number","maximum":5.0,"minimum":0.3,"description":"포스트 간 요청 딜레이(초)","default":1.0,"title":"Delay Sec"},"description":"포스트 간 요청 딜레이(초)"},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Ingest Api Blog Ingest Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blog/job/{job_id}":{"get":{"tags":["blog"],"summary":"수집 잡 상태 확인","operationId":"get_job_status_api_blog_job__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Job Status Api Blog Job  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blog":{"get":{"tags":["blog"],"summary":"블로그 포스트 목록","description":"DB에 수집된 블로그 포스트 목록. 각 포스트의 이미지 수 포함.","operationId":"list_posts_api_blog_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"카테고리 필터 (인테리어/신축/리모델링/철거 등)","title":"Category"},"description":"카테고리 필터 (인테리어/신축/리모델링/철거 등)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Posts Api Blog Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blog/search":{"get":{"tags":["blog"],"summary":"블로그 포스트 키워드 검색","description":"제목 + 본문 + 청크 텍스트에서 키워드 검색.\n\n청크 단위로 검색하므로 관련 이미지도 함께 반환합니다.","operationId":"search_posts_api_blog_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","description":"검색 키워드","title":"Q"},"description":"검색 키워드"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Posts Api Blog Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blog/{doc_id}":{"get":{"tags":["blog"],"summary":"블로그 포스트 상세","description":"포스트 본문 전체 + 이미지 목록.","operationId":"get_post_api_blog__doc_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Post Api Blog  Doc Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blog/{doc_id}/images":{"get":{"tags":["blog"],"summary":"포스트 이미지 목록만 조회","description":"LLM이 사례 응답 시 이미지를 함께 반환하기 위한 엔드포인트.","operationId":"get_post_images_api_blog__doc_id__images_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Post Images Api Blog  Doc Id  Images Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blog/wiki/notes":{"get":{"tags":["blog"],"summary":"카테고리별 위키 노트 목록","description":"LLM wiki에 자동 생성된 시공 사례 노트 목록.","operationId":"list_wiki_notes_api_blog_wiki_notes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Wiki Notes Api Blog Wiki Notes Get"}}}}}}},"/api/blog/wiki/notes/{note_id}":{"get":{"tags":["blog"],"summary":"위키 노트 상세","operationId":"get_wiki_note_api_blog_wiki_notes__note_id__get","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Wiki Note Api Blog Wiki Notes  Note Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blog/stats/summary":{"get":{"tags":["blog"],"summary":"블로그 수집 통계","operationId":"stats_api_blog_stats_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stats Api Blog Stats Summary Get"}}}}}}},"/api/analysis/requests":{"post":{"tags":["analysis","analysis"],"summary":"분석 요청 생성","description":"주소와 투자 기본 정보를 입력해 분석 요청을 생성합니다.","operationId":"create_request_api_analysis_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequestCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/requests/{request_id}/run":{"post":{"tags":["analysis","analysis"],"summary":"모바일 카드형 분석 실행","description":"분석 요청에 대해 모바일 카드형 결과를 생성하고 저장합니다.","operationId":"run_analysis_api_analysis_requests__request_id__run_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileCardAnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/results/{result_id}":{"get":{"tags":["analysis","analysis"],"summary":"분석 결과 조회","description":"저장된 분석 결과를 result_id로 조회합니다.","operationId":"get_result_api_analysis_results__result_id__get","parameters":[{"name":"result_id","in":"path","required":true,"schema":{"type":"integer","title":"Result Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileCardAnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/requests/{request_id}/latest-result":{"get":{"tags":["analysis","analysis"],"summary":"분석 요청의 최신 결과 조회","description":"특정 분석 요청의 가장 최근 결과를 조회합니다.","operationId":"get_latest_result_api_analysis_requests__request_id__latest_result_get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileCardAnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/run":{"post":{"tags":["analysis","analysis"],"summary":"동적 분석 실행 (rule-based, DB 저장 없음)","description":"사용자 입력 기반 rule-based 동적 분석을 즉시 수행하고 카드형 응답을 반환합니다.\n\n- DB 저장 없음 (request_id=0, result_id=0)\n- 기존 /sample과 동일한 응답 schema (MobileCardAnalysisResponse)\n- V1.1: BuildMore Rule Engine + User Input + Demo Financial Assumptions\n- V1.2: 주소 입력 시 property_info_service로 공공 데이터 자동 주입","operationId":"run_dynamic_api_analysis_run_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRunRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileCardAnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/analysis/sample":{"get":{"tags":["analysis","analysis"],"summary":"샘플 분석 결과 (DB 저장 없음)","description":"프론트엔드/모바일 UI 개발용 샘플 결과를 반환합니다.\nDB 저장 없이 고정된 샘플 JSON을 바로 반환합니다.","operationId":"get_sample_api_analysis_sample_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileCardAnalysisResponse"}}}}}}},"/api/analysis/conversation":{"post":{"tags":["analysis","analysis"],"summary":"자연어 대화 → 분석 (LLM 조건 추출 + Rule Engine)","description":"사용자의 자연어 메시지에서 부동산 딜 조건을 LLM으로 추출하고,\n필수 조건이 갖춰지면 기존 run_dynamic_analysis()로 분석을 즉시 수행합니다.\n\nLLM 역할 제한:\n- 조건 추출 + 누락 필드 판단 + 짧은 추가 질문 생성만 담당.\n- LTV/NOI/DSCR/Bankability Score 계산 금지.\n- 투자 조언·장문 설명 금지.\n\nassistant_message는 백엔드 템플릿(build_short_analysis_message)으로 생성.\n\nLLM 호출 회피 규칙:\n- 빈 메시지 → 400\n- 800자 초과 → 413\n- 잡담 → 안내 문자열 직접 반환 (LLM 없음)\n- 단순 실행 명령 + 조건 완비 → run_dynamic_analysis() 직접 호출 (LLM 없음)","operationId":"conversation_api_analysis_conversation_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationResponse"}}}},"400":{"description":"빈 메시지"},"413":{"description":"메시지 길이 초과"},"429":{"description":"rate limit 초과"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/analysis/{region_code}/delta-summary":{"get":{"tags":["analysis","analysis"],"summary":"Region Delta Summary","description":"지역코드 기준 delta 요약 (stub).","operationId":"region_delta_summary_api_analysis__region_code__delta_summary_get","parameters":[{"name":"region_code","in":"path","required":true,"schema":{"type":"string","title":"Region Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/chat":{"post":{"tags":["analysis","analysis"],"summary":"자유형 AI 채팅 (원천데이터 + Delta Engine + LLM Wiki 참조)","description":"투자자 자유 질문 → 원천데이터(Wiki), Delta Engine, LLM Wiki 컨텍스트 기반\n자유형 LLM 응답. max_tokens=1200, temperature=0.7.","operationId":"analysis_chat_api_analysis_chat_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/bootstrap":{"post":{"tags":["analysis","analysis"],"summary":"주소 확정 → 토지정보 + 초기 분석 조건 반환","description":"프론트엔드 주소 확정(Enter) 시 호출.\n\n1. 카카오 지오코딩 → 좌표 + 법정동\n2. property_info_service 통합 조회 (건축물대장 + 공시지가 + 토지이용계획)\n3. DB SeoulTransaction에서 같은 dong 유사거래 중앙값\n4. 초기 분석 조건(sample_inputs) 반환 — 이미 원(₩) / 소수 단위\n\n실패 단계는 errors에 기록하고 나머지 계속 진행.","operationId":"bootstrap_address_api_analysis_bootstrap_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BootstrapRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BootstrapResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/users":{"post":{"tags":["accounts","accounts"],"summary":"사용자 생성","operationId":"create_user_api_accounts_users_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/users/{user_id}":{"get":{"tags":["accounts","accounts"],"summary":"사용자 조회","operationId":"get_user_api_accounts_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/users/by-email/{email}":{"get":{"tags":["accounts","accounts"],"summary":"이메일로 사용자 조회 (내부 키 또는 관리자 필요)","operationId":"get_user_by_email_api_accounts_users_by_email__email__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","title":"Email"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/users/{user_id}/profile":{"post":{"tags":["accounts","accounts"],"summary":"사용자 프로필 생성/수정","operationId":"upsert_profile_api_accounts_users__user_id__profile_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["accounts","accounts"],"summary":"사용자 프로필 조회","operationId":"get_profile_api_accounts_users__user_id__profile_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/users/{user_id}/investor-profile":{"post":{"tags":["accounts","accounts"],"summary":"투자자 프로필 생성/수정","operationId":"upsert_investor_profile_api_accounts_users__user_id__investor_profile_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestorProfileCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestorProfileRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["accounts","accounts"],"summary":"투자자 프로필 조회","operationId":"get_investor_profile_api_accounts_users__user_id__investor_profile_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestorProfileRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/users/{user_id}/verifications":{"post":{"tags":["accounts","accounts"],"summary":"인증 요청 제출","operationId":"submit_verification_api_accounts_users__user_id__verifications_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["accounts","accounts"],"summary":"사용자 인증 목록 조회","operationId":"list_verifications_api_accounts_users__user_id__verifications_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VerificationRead"},"title":"Response List Verifications Api Accounts Users  User Id  Verifications Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/verifications/{verification_id}/approve":{"post":{"tags":["accounts","accounts"],"summary":"인증 승인 (내부 키 필요)","operationId":"approve_verification_api_accounts_verifications__verification_id__approve_post","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"integer","title":"Verification Id"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationApproveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/verifications/{verification_id}/reject":{"post":{"tags":["accounts","accounts"],"summary":"인증 거절 (내부 키 필요)","operationId":"reject_verification_api_accounts_verifications__verification_id__reject_post","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"integer","title":"Verification Id"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationRejectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/verifications/{verification_id}/documents":{"post":{"tags":["accounts","accounts"],"summary":"인증 문서 메타데이터 등록","operationId":"add_document_api_accounts_verifications__verification_id__documents_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"integer","title":"Verification Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationDocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationDocumentRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["accounts","accounts"],"summary":"인증 문서 목록 조회","operationId":"list_documents_api_accounts_verifications__verification_id__documents_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"integer","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VerificationDocumentRead"},"title":"Response List Documents Api Accounts Verifications  Verification Id  Documents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/users/{user_id}/access-summary":{"get":{"tags":["accounts","accounts"],"summary":"사용자 접근 요약 (등급 + 인증 + 권한 + 크레딧)","operationId":"get_access_summary_api_accounts_users__user_id__access_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAccessSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/users/{user_id}/credits":{"get":{"tags":["accounts","accounts"],"summary":"사용자 크레딧 목록","operationId":"list_credits_api_accounts_users__user_id__credits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreditRead"},"title":"Response List Credits Api Accounts Users  User Id  Credits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/users/{user_id}/permissions":{"get":{"tags":["accounts","accounts"],"summary":"사용자 권한 목록","operationId":"list_permissions_api_accounts_users__user_id__permissions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PermissionRead"},"title":"Response List Permissions Api Accounts Users  User Id  Permissions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/users/{user_id}/membership":{"get":{"tags":["accounts","accounts"],"summary":"사용자 현재 멤버십","operationId":"get_membership_api_accounts_users__user_id__membership_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/sample-access-summary":{"get":{"tags":["accounts","accounts"],"summary":"샘플 접근 요약 (DB 저장 없음 — 프론트/모바일 개발용)","operationId":"get_sample_api_accounts_sample_access_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAccessSummary"}}}}}}},"/api/accounts/seed":{"post":{"tags":["accounts","accounts"],"summary":"샘플 사용자 3명 생성 (개발/테스트용 — 내부 키 필요)","operationId":"seed_users_api_accounts_seed_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/snapshots/generate":{"post":{"tags":["wiki-intelligence"],"summary":"스냅샷 생성 (내부 키 필요)","operationId":"generate_snapshots_api_wiki_intelligence_snapshots_generate_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotsGenerateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/snapshots":{"get":{"tags":["wiki-intelligence"],"summary":"List Snapshots","operationId":"list_snapshots_api_wiki_intelligence_snapshots_get","parameters":[{"name":"metric_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Key"}},{"name":"region_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MetricSnapshotRead"},"title":"Response List Snapshots Api Wiki Intelligence Snapshots Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/deltas/calculate":{"post":{"tags":["wiki-intelligence"],"summary":"변화량 계산 (내부 키 필요)","operationId":"calc_deltas_api_wiki_intelligence_deltas_calculate_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeltaCalculateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeltaCalculateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/deltas":{"get":{"tags":["wiki-intelligence"],"summary":"List Deltas","operationId":"list_deltas_api_wiki_intelligence_deltas_get","parameters":[{"name":"metric_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Key"}},{"name":"region_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"}},{"name":"comparison_window","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comparison Window"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MetricDeltaRead"},"title":"Response List Deltas Api Wiki Intelligence Deltas Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/documents/{document_id}/extract-facts":{"post":{"tags":["wiki-intelligence"],"summary":"Extract Facts","description":"특정 문서에서 사실 추출.","operationId":"extract_facts_api_wiki_intelligence_documents__document_id__extract_facts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactExtractResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/documents/extract-facts-all":{"post":{"tags":["wiki-intelligence"],"summary":"Extract Facts All","description":"최근 문서들에서 일괄 사실 추출.","operationId":"extract_facts_all_api_wiki_intelligence_documents_extract_facts_all_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/facts/review-stats":{"get":{"tags":["wiki-intelligence"],"summary":"Facts Review Stats","description":"검수 현황 통계 대시보드 지표.\n\n- total: 조건에 해당하는 전체 Fact 수\n- verified_count: 검수 완료 수\n- unverified_count: 미검수 수\n- verified_by_breakdown: 검수자별 검수 완료 건수\n- avg_confidence_before: 미검수 Fact 평균 confidence\n- avg_confidence_after: 검수 완료 Fact 평균 confidence\n\nNOTE: /facts/{fact_id} 경로보다 먼저 등록해야 405 오류가 발생하지 않습니다.","operationId":"facts_review_stats_api_wiki_intelligence_facts_review_stats_get","parameters":[{"name":"region_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"지역 코드 필터 (부분 일치)","title":"Region Code"},"description":"지역 코드 필터 (부분 일치)"},{"name":"fact_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fact 유형 필터 (완전 일치)","title":"Fact Type"},"description":"Fact 유형 필터 (완전 일치)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactReviewStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/facts/confidence-histogram":{"get":{"tags":["wiki-intelligence"],"summary":"Facts Confidence Histogram","description":"ExtractedFact.confidence 값을 0.0~1.0 구간의 10개 버킷으로 나눈 히스토그램 반환.\n\nNOTE: /facts/{fact_id} 경로보다 먼저 등록해야 405 오류가 발생하지 않습니다.\n\n응답 예:\n{\n  \"buckets\": [\n    {\"bucket_label\": \"0.0~0.1\", \"bucket_start\": 0.0, \"total\": 5,\n     \"by_type\": {\"regulation\": 3, \"policy_change\": 2}},\n    ...\n  ],\n  \"fact_types\": [\"regulation\", \"policy_change\", ...]\n}","operationId":"facts_confidence_histogram_api_wiki_intelligence_facts_confidence_histogram_get","parameters":[{"name":"fact_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"특정 fact_type으로 필터링","title":"Fact Type"},"description":"특정 fact_type으로 필터링"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/facts":{"get":{"tags":["wiki-intelligence"],"summary":"List Facts","operationId":"list_facts_api_wiki_intelligence_facts_get","parameters":[{"name":"region_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"}},{"name":"fact_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fact Type"}},{"name":"policy_area","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Area"}},{"name":"min_confidence","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1,"minimum":0},{"type":"null"}],"title":"Min Confidence"}},{"name":"verified","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"true=검수 완료, false=미검수","title":"Verified"},"description":"true=검수 완료, false=미검수"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExtractedFactRead"},"title":"Response List Facts Api Wiki Intelligence Facts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/facts/{fact_id}":{"patch":{"tags":["wiki-intelligence"],"summary":"Update Fact","description":"LLM 추출 Fact 검수·수정. statement / policy_area / confidence / verified / verified_by 수정 가능.\n\nverified 전환 규칙:\n- verified=true  → verified_at을 현재 UTC로 갱신, verified_by 함께 저장\n- verified=false → verified_at / verified_by 초기화(null)\n- verified 미포함 → 현재 상태 유지\nverified=null 명시 전송은 422 반환.\n\n응답에 recalculated_signal_ids 포함 — Fact 수정으로 confidence_score가 갱신된 WikiSignal ID 목록.","operationId":"update_fact_api_wiki_intelligence_facts__fact_id__patch","parameters":[{"name":"fact_id","in":"path","required":true,"schema":{"type":"integer","title":"Fact Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractedFactUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractedFactUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/facts/{fact_id}/review-logs":{"get":{"tags":["wiki-intelligence"],"summary":"Fact 검수 변경 이력 조회","description":"특정 Fact의 검수·수정 변경 이력을 최신순으로 반환합니다.","operationId":"get_fact_review_logs_api_wiki_intelligence_facts__fact_id__review_logs_get","parameters":[{"name":"fact_id","in":"path","required":true,"schema":{"type":"integer","title":"Fact Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FactReviewLogRead"},"title":"Response Get Fact Review Logs Api Wiki Intelligence Facts  Fact Id  Review Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/rules/seed":{"post":{"tags":["wiki-intelligence"],"summary":"규칙 seed (내부 키 필요)","operationId":"seed_rules_api_wiki_intelligence_rules_seed_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleSeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/rules":{"get":{"tags":["wiki-intelligence"],"summary":"List Rules","operationId":"list_rules_api_wiki_intelligence_rules_get","parameters":[{"name":"rule_category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rule Category"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InferenceRuleRead"},"title":"Response List Rules Api Wiki Intelligence Rules Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/rules/apply":{"post":{"tags":["wiki-intelligence"],"summary":"규칙 적용 (내부 키 필요)","operationId":"apply_rules_api_wiki_intelligence_rules_apply_post","parameters":[{"name":"region_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"}},{"name":"pnu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/scenarios/seed":{"post":{"tags":["wiki-intelligence"],"summary":"시나리오 seed (내부 키 필요)","operationId":"seed_scenarios_api_api_wiki_intelligence_scenarios_seed_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScenarioSeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/scenarios":{"get":{"tags":["wiki-intelligence"],"summary":"List Scenarios Api","operationId":"list_scenarios_api_api_wiki_intelligence_scenarios_get","parameters":[{"name":"scenario_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scenario Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ScenarioRead"},"title":"Response List Scenarios Api Api Wiki Intelligence Scenarios Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/cases/seed":{"post":{"tags":["wiki-intelligence"],"summary":"사례 seed (내부 키 필요)","operationId":"seed_cases_api_api_wiki_intelligence_cases_seed_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseSeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/cases":{"get":{"tags":["wiki-intelligence"],"summary":"List Cases","operationId":"list_cases_api_wiki_intelligence_cases_get","parameters":[{"name":"region_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"}},{"name":"asset_type_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type Code"}},{"name":"project_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WikiCaseRead"},"title":"Response List Cases Api Wiki Intelligence Cases Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/signals/generate":{"post":{"tags":["wiki-intelligence"],"summary":"시그널 생성 (내부 키 필요)","operationId":"generate_signals_api_api_wiki_intelligence_signals_generate_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalGenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WikiSignalRead"},"title":"Response Generate Signals Api Api Wiki Intelligence Signals Generate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/signals":{"get":{"tags":["wiki-intelligence"],"summary":"Get Signals","operationId":"get_signals_api_wiki_intelligence_signals_get","parameters":[{"name":"region_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"}},{"name":"pnu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"}},{"name":"asset_type_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type Code"}},{"name":"is_premium","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Premium"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WikiSignalRead"},"title":"Response Get Signals Api Wiki Intelligence Signals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/signals/{signal_id}":{"get":{"tags":["wiki-intelligence"],"summary":"Get Signal","operationId":"get_signal_api_wiki_intelligence_signals__signal_id__get","parameters":[{"name":"signal_id","in":"path","required":true,"schema":{"type":"integer","title":"Signal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WikiSignalRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/insight-reports/generate":{"post":{"tags":["wiki-intelligence"],"summary":"인사이트 리포트 생성 (내부 키 필요)","operationId":"generate_report_api_wiki_intelligence_insight_reports_generate_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightReportGenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightReportRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/insight-reports":{"get":{"tags":["wiki-intelligence"],"summary":"Get Insight Reports","operationId":"get_insight_reports_api_wiki_intelligence_insight_reports_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InsightReportRead"},"title":"Response Get Insight Reports Api Wiki Intelligence Insight Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/insight-reports/{report_id}":{"get":{"tags":["wiki-intelligence"],"summary":"Get Insight Report","operationId":"get_insight_report_api_wiki_intelligence_insight_reports__report_id__get","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightReportRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-intelligence/ask":{"post":{"tags":["wiki-intelligence"],"summary":"위키 질의 응답 (내부 키 필요)","operationId":"ask_api_wiki_intelligence_ask_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-agent/query":{"post":{"tags":["wiki-agent","wiki-agent"],"summary":"위키 질의 (내부 키 필요)","operationId":"query_api_wiki_agent_query_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-agent/query-results/{result_id}/file-back":{"post":{"tags":["wiki-agent","wiki-agent"],"summary":"query result wiki 저장 (내부 키 필요)","operationId":"manual_file_back_api_wiki_agent_query_results__result_id__file_back_post","parameters":[{"name":"result_id","in":"path","required":true,"schema":{"type":"integer","title":"Result Id"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-agent/saved-insights":{"get":{"tags":["wiki-agent","wiki-agent"],"summary":"List Saved Insights","operationId":"list_saved_insights_api_wiki_agent_saved_insights_get","parameters":[{"name":"region_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"}},{"name":"pnu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"}},{"name":"asset_type_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type Code"}},{"name":"insight_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Insight Type"}},{"name":"freshness_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Freshness Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SavedInsightRead"},"title":"Response List Saved Insights Api Wiki Agent Saved Insights Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-agent/saved-insights/{insight_id}":{"get":{"tags":["wiki-agent","wiki-agent"],"summary":"Get Saved Insight","operationId":"get_saved_insight_api_wiki_agent_saved_insights__insight_id__get","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"integer","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedInsightRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-agent/pages":{"get":{"tags":["wiki-agent","wiki-agent"],"summary":"List Pages","operationId":"list_pages_api_wiki_agent_pages_get","parameters":[{"name":"page_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Type"}},{"name":"region_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PageRegistryRead"},"title":"Response List Pages Api Wiki Agent Pages Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-agent/pages/{page_key}":{"get":{"tags":["wiki-agent","wiki-agent"],"summary":"Get Page","operationId":"get_page_api_wiki_agent_pages__page_key__get","parameters":[{"name":"page_key","in":"path","required":true,"schema":{"type":"string","title":"Page Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageRegistryRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-agent/lint/run":{"post":{"tags":["wiki-agent","wiki-agent"],"summary":"wiki lint 실행 (내부 키 필요)","operationId":"run_lint_api_wiki_agent_lint_run_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LintRunRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LintJobRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-agent/lint/jobs":{"get":{"tags":["wiki-agent","wiki-agent"],"summary":"List Lint Jobs","operationId":"list_lint_jobs_api_wiki_agent_lint_jobs_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LintJobRead"},"title":"Response List Lint Jobs Api Wiki Agent Lint Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-agent/lint/findings":{"get":{"tags":["wiki-agent","wiki-agent"],"summary":"List Findings","operationId":"list_findings_api_wiki_agent_lint_findings_get","parameters":[{"name":"finding_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finding Type"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"target_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LintFindingRead"},"title":"Response List Findings Api Wiki Agent Lint Findings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-agent/lint/findings/{finding_id}/resolve":{"post":{"tags":["wiki-agent","wiki-agent"],"summary":"lint finding 해결 (내부 키 필요)","operationId":"resolve_finding_api_wiki_agent_lint_findings__finding_id__resolve_post","parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"integer","title":"Finding Id"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingResolveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-agent/maintenance-log":{"get":{"tags":["wiki-agent","wiki-agent"],"summary":"Get Maintenance Log","operationId":"get_maintenance_log_api_wiki_agent_maintenance_log_get","parameters":[{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MaintenanceLogRead"},"title":"Response Get Maintenance Log Api Wiki Agent Maintenance Log Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wiki-agent/sample-query":{"get":{"tags":["wiki-agent","wiki-agent"],"summary":"Sample Query","description":"DB 저장 없이 샘플 query response 반환. 모바일/프론트 개발용.","operationId":"sample_query_api_wiki_agent_sample_query_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/wiki-agent/seed":{"post":{"tags":["wiki-agent","wiki-agent"],"summary":"샘플 데이터 seed (내부 키 필요)","description":"샘플 데이터 seed (이미 있으면 skip).","operationId":"seed_api_wiki_agent_seed_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/register":{"post":{"tags":["auth"],"summary":"회원가입","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"로그인","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"내 계정 정보","operationId":"me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/content/source-registry":{"get":{"tags":["source-registry","source-registry"],"summary":"출처 레지스트리 목록 조회","operationId":"list_source_registry_api_content_source_registry_get","parameters":[{"name":"source_category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"카테고리 필터 (예: government_api)","title":"Source Category"},"description":"카테고리 필터 (예: government_api)"},{"name":"data_domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"데이터 도메인 필터 (예: real_transaction)","title":"Data Domain"},"description":"데이터 도메인 필터 (예: real_transaction)"},{"name":"access_mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"접근 방식 필터 (예: api)","title":"Access Mode"},"description":"접근 방식 필터 (예: api)"},{"name":"api_available","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"API 사용 가능 여부","title":"Api Available"},"description":"API 사용 가능 여부"},{"name":"priority_level","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"우선순위 레벨 (1~4)","title":"Priority Level"},"description":"우선순위 레벨 (1~4)"},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"활성 여부","title":"Is Active"},"description":"활성 여부"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SourceRegistryRead"},"title":"Response List Source Registry Api Content Source Registry Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["source-registry","source-registry"],"summary":"새 출처 등록","operationId":"create_source_registry_api_content_source_registry_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceRegistryCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceRegistryRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/content/source-registry/{source_key}":{"get":{"tags":["source-registry","source-registry"],"summary":"출처 상세 조회","operationId":"get_source_registry_api_content_source_registry__source_key__get","parameters":[{"name":"source_key","in":"path","required":true,"schema":{"type":"string","title":"Source Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceRegistryRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["source-registry","source-registry"],"summary":"출처 정책/권한/우선순위 수정","operationId":"update_source_registry_api_content_source_registry__source_key__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_key","in":"path","required":true,"schema":{"type":"string","title":"Source Key"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceRegistryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceRegistryRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/content/source-priority-rules":{"get":{"tags":["source-registry","source-registry"],"summary":"질문 유형별 출처 우선순위 목록 조회","operationId":"list_source_priority_rules_api_content_source_priority_rules_get","parameters":[{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SourcePriorityRuleRead"},"title":"Response List Source Priority Rules Api Content Source Priority Rules Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["source-registry","source-registry"],"summary":"우선순위 규칙 등록","operationId":"create_source_priority_rule_api_content_source_priority_rules_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourcePriorityRuleCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourcePriorityRuleRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/content/source-priority-rules/{query_type}":{"get":{"tags":["source-registry","source-registry"],"summary":"특정 질문 유형의 우선 조회 출처 확인","operationId":"get_source_priority_rule_api_content_source_priority_rules__query_type__get","parameters":[{"name":"query_type","in":"path","required":true,"schema":{"type":"string","title":"Query Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourcePriorityRuleRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["source-registry","source-registry"],"summary":"우선순위 규칙 수정","operationId":"update_source_priority_rule_api_content_source_priority_rules__query_type__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"query_type","in":"path","required":true,"schema":{"type":"string","title":"Query Type"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourcePriorityRuleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourcePriorityRuleRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public-data/clients/status":{"get":{"tags":["public-data","public-data"],"summary":"공공 API 클라이언트 키 설정 상태 확인","description":"각 공공 API key의 설정 여부를 true/false로 반환합니다. 실제 key 값은 절대 노출하지 않습니다.","operationId":"get_client_status_api_public_data_clients_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Client Status Api Public Data Clients Status Get"}}}}}}},"/api/public-data/development-legal/sources":{"get":{"tags":["public-data","public-data"],"summary":"Development/legal source API catalog","operationId":"get_development_legal_source_catalog_api_public_data_development_legal_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Development Legal Source Catalog Api Public Data Development Legal Sources Get"}}}}}}},"/api/public-data/development-legal/check":{"post":{"tags":["public-data","public-data"],"summary":"Check 14 development/legal source APIs and log blocked items","operationId":"trigger_development_legal_source_check_api_public_data_development_legal_check_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentLegalSourceCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Development Legal Source Check Api Public Data Development Legal Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public-data/sync/molit/transactions":{"post":{"tags":["public-data","public-data"],"summary":"국토부 실거래가 수집 트리거 (내부 키 필요)","operationId":"trigger_molit_sync_api_public_data_sync_molit_transactions_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolitSyncRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Molit Sync Api Public Data Sync Molit Transactions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public-data/sync/bok/macro-rates":{"post":{"tags":["public-data","public-data"],"summary":"한국은행 ECOS 거시경제 지표 수집 트리거 (내부 키 필요)","operationId":"trigger_bok_sync_api_public_data_sync_bok_macro_rates_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BokSyncRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Bok Sync Api Public Data Sync Bok Macro Rates Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public-data/sync/kosis/demographics":{"post":{"tags":["public-data","public-data"],"summary":"통계청 KOSIS 인구/지역 통계 수집 트리거 (내부 키 필요)","operationId":"trigger_kosis_sync_api_public_data_sync_kosis_demographics_post","parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KosisSyncRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Kosis Sync Api Public Data Sync Kosis Demographics Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/overview":{"get":{"tags":["admin","admin"],"summary":"Admin Overview","operationId":"admin_overview_api_admin_overview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminOverviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/scheduler":{"get":{"tags":["admin","admin"],"summary":"Admin Scheduler","operationId":"admin_scheduler_api_admin_scheduler_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSchedulerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/wiki":{"get":{"tags":["admin","admin"],"summary":"Admin Wiki","operationId":"admin_wiki_api_admin_wiki_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminWikiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/wiki/notes":{"get":{"tags":["admin","admin"],"summary":"Admin Wiki Notes","operationId":"admin_wiki_notes_api_admin_wiki_notes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"published","title":"Status"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminWikiNoteSummary"},"title":"Response Admin Wiki Notes Api Admin Wiki Notes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/wiki/notes/{note_id}":{"get":{"tags":["admin","admin"],"summary":"Admin Wiki Note Detail","operationId":"admin_wiki_note_detail_api_admin_wiki_notes__note_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminWikiNoteDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/wiki/ticker-items":{"get":{"tags":["admin","admin"],"summary":"Admin Wiki Ticker Items","operationId":"admin_wiki_ticker_items_api_admin_wiki_ticker_items_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminSignalTickerItem"},"title":"Response Admin Wiki Ticker Items Api Admin Wiki Ticker Items Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/wiki/card-news-candidates":{"get":{"tags":["admin","admin"],"summary":"Admin Card News Candidates","operationId":"admin_card_news_candidates_api_admin_wiki_card_news_candidates_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminCardNewsCandidateSummary"},"title":"Response Admin Card News Candidates Api Admin Wiki Card News Candidates Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/wiki/card-news-candidates/{candidate_id}":{"get":{"tags":["admin","admin"],"summary":"Admin Card News Candidate Detail","operationId":"admin_card_news_candidate_detail_api_admin_wiki_card_news_candidates__candidate_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"integer","title":"Candidate Id"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminCardNewsCandidateDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/usage":{"get":{"tags":["admin","admin"],"summary":"Admin Usage","operationId":"admin_usage_api_admin_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/delta-summary":{"get":{"tags":["admin","admin"],"summary":"Admin Delta Summary","operationId":"admin_delta_summary_api_admin_delta_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Delta Summary Api Admin Delta Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/delta-recent":{"get":{"tags":["admin","admin"],"summary":"Admin Delta Recent","operationId":"admin_delta_recent_api_admin_delta_recent_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Limit"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Admin Delta Recent Api Admin Delta Recent Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/signals-recent":{"get":{"tags":["admin","admin"],"summary":"Admin Signals Recent","operationId":"admin_signals_recent_api_admin_signals_recent_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":5,"title":"Limit"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Admin Signals Recent Api Admin Signals Recent Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/run-delta":{"post":{"tags":["admin","admin"],"summary":"Admin Run Delta","operationId":"admin_run_delta_api_admin_run_delta_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mode","in":"query","required":false,"schema":{"type":"string","pattern":"^(apply|dry-run)$","default":"apply","title":"Mode"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Run Delta Api Admin Run Delta Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/period-delta/status":{"get":{"tags":["admin","admin"],"summary":"Admin Period Delta Status","operationId":"admin_period_delta_status_api_admin_period_delta_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Period Delta Status Api Admin Period Delta Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/period-delta/recompute":{"post":{"tags":["admin","admin"],"summary":"Admin Period Delta Recompute","operationId":"admin_period_delta_recompute_api_admin_period_delta_recompute_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"default":12,"title":"Months"}},{"name":"metric_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Key"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","pattern":"^(queue|inline|dry-run)$","default":"queue","title":"Mode"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Period Delta Recompute Api Admin Period Delta Recompute Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/roadmap":{"get":{"tags":["admin","admin"],"summary":"Admin Roadmap","operationId":"admin_roadmap_api_admin_roadmap_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Roadmap Api Admin Roadmap Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/roadmap/update":{"post":{"tags":["admin","admin"],"summary":"Admin Roadmap Update","operationId":"admin_roadmap_update_api_admin_roadmap_update_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoadmapUpdateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Roadmap Update Api Admin Roadmap Update Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/roadmap/raw":{"get":{"tags":["admin","admin"],"summary":"Admin Roadmap Raw","operationId":"admin_roadmap_raw_api_admin_roadmap_raw_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Roadmap Raw Api Admin Roadmap Raw Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-coverage":{"get":{"tags":["admin","admin"],"summary":"Admin Data Coverage","operationId":"admin_data_coverage_api_admin_data_coverage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Data Coverage Api Admin Data Coverage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/metric-catalog":{"get":{"tags":["admin","admin"],"summary":"Get Metric Catalog","operationId":"get_metric_catalog_api_admin_metric_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/metric-catalog/upsert":{"post":{"tags":["admin","admin"],"summary":"Upsert Metric Catalog Item","description":"Register a child metric/API once; category collectors pick it up automatically.","operationId":"upsert_metric_catalog_item_api_admin_metric_catalog_upsert_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricCatalogUpsertRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upsert Metric Catalog Item Api Admin Metric Catalog Upsert Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/source-field-discoveries":{"get":{"tags":["admin","admin"],"summary":"Get Source Field Discoveries","operationId":"get_source_field_discoveries_api_admin_source_field_discoveries_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Status"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Source Field Discoveries Api Admin Source Field Discoveries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/source-field-discoveries/{discovery_id}/promote":{"post":{"tags":["admin","admin"],"summary":"Promote Source Field Discovery","description":"Promote a discovered API field into the metric catalog collector scope.","operationId":"promote_source_field_discovery_api_admin_source_field_discoveries__discovery_id__promote_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"discovery_id","in":"path","required":true,"schema":{"type":"integer","title":"Discovery Id"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Promote Source Field Discovery Api Admin Source Field Discoveries  Discovery Id  Promote Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/source-collector-status":{"get":{"tags":["admin","admin"],"summary":"Admin Source Collector Status","operationId":"admin_source_collector_status_api_admin_source_collector_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Source Collector Status Api Admin Source Collector Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/source-collectors/run":{"post":{"tags":["admin","admin"],"summary":"Admin Run Source Collectors","operationId":"admin_run_source_collectors_api_admin_source_collectors_run_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mode","in":"query","required":false,"schema":{"type":"string","pattern":"^(daily|hourly)$","default":"daily","title":"Mode"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Run Source Collectors Api Admin Source Collectors Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/metric-signal-pipeline/run":{"post":{"tags":["admin","admin"],"summary":"Admin Run Metric Signal Pipeline","operationId":"admin_run_metric_signal_pipeline_api_admin_metric_signal_pipeline_run_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mode","in":"query","required":false,"schema":{"type":"string","pattern":"^(daily|hourly)$","default":"daily","title":"Mode"}},{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"default":12,"title":"Months"}},{"name":"force_collect","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force Collect"}},{"name":"learn_wiki","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Learn Wiki"}},{"name":"signal_doc_limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":500,"title":"Signal Doc Limit"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Run Metric Signal Pipeline Api Admin Metric Signal Pipeline Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/metric-catalog/refresh-availability":{"post":{"tags":["admin","admin"],"summary":"지표 카탈로그 is_available 자동 갱신","operationId":"refresh_metric_availability_api_admin_metric_catalog_refresh_availability_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/roadmap/graph":{"get":{"tags":["admin-roadmap","admin-roadmap"],"summary":"Admin Roadmap Graph","operationId":"admin_roadmap_graph_api_admin_roadmap_graph_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Roadmap Graph Api Admin Roadmap Graph Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/roadmap/refresh":{"post":{"tags":["admin-roadmap","admin-roadmap"],"summary":"Admin Roadmap Refresh","operationId":"admin_roadmap_refresh_api_admin_roadmap_refresh_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Roadmap Refresh Api Admin Roadmap Refresh Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user-inputs/submit":{"post":{"tags":["user-inputs","user-inputs"],"summary":"Submit User Inputs","description":"현장 입력 데이터 저장 + Bankability Score 조정값 반환.","operationId":"submit_user_inputs_api_user_inputs_submit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPropertyInputCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserInputSubmitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/user-inputs/preview":{"post":{"tags":["user-inputs","user-inputs"],"summary":"Preview Single Field","description":"단일 항목 변경 시 실시간 점수 미리보기.","operationId":"preview_single_field_api_user_inputs_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewInputItem"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vworld/dry-run":{"get":{"tags":["vworld"],"summary":"VWorld NED API 연결 진단","description":"VWorld NED API (개별공시지가·토지이용계획) 호출 가능 여부를 진단한다.\n\n**파라미터**\n- `pnu`: PNU 19자리 직접 입력 (우선 사용)\n- `address`: 주소 입력 시 카카오 지오코딩으로 PNU 변환 후 테스트\n- 둘 다 생략하면 환경변수 상태만 확인\n\n**응답 필드**\n- `ok`: 전체 성공 여부\n- `domainUsed`: 실제 사용한 domain 값 (VWORLD_DOMAIN 환경변수)\n- `domainMatch`: domainUsed 가 https://buildmore.co.kr 과 일치하는지\n- `hasApiKey`: VWORLD_API_KEY 존재 여부 (원문은 절대 반환하지 않음)\n- `steps`: 각 API 호출 단계별 결과\n\n**에러 코드 안내**\n- `INCORRECT_KEY`: 인증키 서비스 URL ≠ domain → domainUsed 확인\n- `INVALID_KEY`: 키 만료/비활성\n- `PARAM_REQUIRED`: 필수 파라미터 누락\n- `NOT_FOUND`: 해당 PNU 데이터 없음\n- `CONNECTION_ERROR`: 백엔드에서 VWorld에 연결 실패\n\nHTTP 200 = ok:true, HTTP 424 = ok:false","operationId":"vworld_dry_run_api_vworld_dry_run_get","parameters":[{"name":"pnu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"}},{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"}}],"responses":{"200":{"description":"NED API 호출 가능 여부 진단 결과. ok=true 이면 정상.","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/property/analyze":{"post":{"tags":["property-analyze"],"summary":"주소 기반 물건 통합 분석","description":"주소 입력 → 카카오 지오코딩 → 건축물대장 → 개별공시지가 → 토지이용계획 → ECOS 금리\n통합 결과를 반환한다.\n\n**처리 흐름**\n1. 주소 입력값 검증\n2. 카카오 API로 주소 → 좌표 + 법정동코드 + PNU 변환\n3. 건축물대장 (DATA_GO_KR_API_KEY)\n4. 개별공시지가 (VWORLD_API_KEY + VWORLD_DOMAIN)\n5. 토지이용계획 (VWORLD_API_KEY + VWORLD_DOMAIN)\n6. ECOS 기준금리/추정대출금리\n\n각 단계 실패 시 나머지는 계속 진행하며 errors[] 에 기록된다.\nVWorld API Key·Domain은 응답에 포함되지 않는다.","operationId":"analyze_property_api_property_analyze_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyzeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/property/analyze/by-pnu":{"get":{"tags":["property-analyze"],"summary":"[임시] PNU 직접 입력으로 VWorld NED 조회","description":"PNU를 직접 입력해 VWorld NED 개별공시지가·토지이용계획을 조회한다.\ndry-run 성공 후 실제 데이터를 확인하는 용도로 사용한다.\n\n# TODO: 주소→PNU 변환 완료 후 이 경로는 admin 전용으로 전환하거나 제거한다.","operationId":"analyze_by_pnu_api_property_analyze_by_pnu_get","parameters":[{"name":"pnu","in":"query","required":true,"schema":{"type":"string","minLength":19,"maxLength":19,"description":"PNU 19자리","title":"Pnu"},"description":"PNU 19자리"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/nearby-transactions":{"get":{"tags":["analysis"],"summary":"주변 실거래 현황 조회","description":"시군구 기준 24개월 상업용·연립 매매 + 월세 실거래 집계를 반환합니다. address 또는 sigungu 중 하나는 필수입니다.","operationId":"get_nearby_transactions_api_analysis_nearby_transactions_get","parameters":[{"name":"address","in":"query","required":false,"schema":{"type":"string","description":"매물 주소 (sigungu 없을 때 자동 추출)","default":"","title":"Address"},"description":"매물 주소 (sigungu 없을 때 자동 추출)"},{"name":"sigungu","in":"query","required":false,"schema":{"type":"string","description":"시군구명 직접 지정 (우선 적용)","default":"","title":"Sigungu"},"description":"시군구명 직접 지정 (우선 적용)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NearbyTransactionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/deal-panel/run":{"post":{"tags":["deal-panel","deal-panel"],"summary":"우측 분석 패널 통합 실행","description":"주소 + 좌측 입력값을 받아 우측 분석 패널에 필요한 모든 값을 한 번에 반환합니다. 내부적으로 property_info_service, analysis_service(bankability), 실거래 DB를 순차 호출한 뒤 통합 응답을 구성합니다.","operationId":"run_deal_panel_api_analysis_deal_panel_run_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealPanelRunRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealPanelRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/deal-panel/nearby-transactions":{"get":{"tags":["deal-panel","deal-panel"],"summary":"주변 실거래 비교 테이블 (UI 테이블 전용)","description":"날짜·위치·면적·거래가·㎡당·유형 컬럼 형태로 실거래 rows를 반환합니다. address 또는 sigungu 중 하나는 필수입니다. 기존 /api/analysis/nearby-transactions(집계용)와 별도로 운영됩니다.","operationId":"nearby_transactions_table_api_analysis_deal_panel_nearby_transactions_get","parameters":[{"name":"address","in":"query","required":false,"schema":{"type":"string","description":"매물 주소 (sigungu 없을 때 자동 추출)","default":"","title":"Address"},"description":"매물 주소 (sigungu 없을 때 자동 추출)"},{"name":"sigungu","in":"query","required":false,"schema":{"type":"string","description":"시군구명 직접 지정","default":"","title":"Sigungu"},"description":"시군구명 직접 지정"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"최대 row 수","default":20,"title":"Limit"},"description":"최대 row 수"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NearbyTransactionsTableResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/deal-panel/map-properties":{"get":{"tags":["deal-panel","deal-panel"],"summary":"지도 모달 매물 markers","description":"주소 또는 sigungu 기반 주변 매물 marker를 반환합니다.","operationId":"map_properties_api_analysis_deal_panel_map_properties_get","parameters":[{"name":"address","in":"query","required":false,"schema":{"type":"string","description":"주소 (sigungu 자동 추출)","default":"","title":"Address"},"description":"주소 (sigungu 자동 추출)"},{"name":"sigungu","in":"query","required":false,"schema":{"type":"string","description":"시군구명 직접 지정","default":"","title":"Sigungu"},"description":"시군구명 직접 지정"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapPropertiesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/deal-panel/select-property":{"post":{"tags":["deal-panel","deal-panel"],"summary":"지도 모달 매물 선택 → 분석 입력값 변환","description":"지도에서 선택한 property/marker를 분석 입력값으로 변환합니다. stateless 처리 — DB 저장 없음.","operationId":"select_property_api_analysis_deal_panel_select_property_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelectPropertyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelectPropertyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin-data/overview":{"get":{"tags":["admin-data"],"summary":"Get Overview","operationId":"get_overview_api_admin_data_overview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin-data/sources":{"get":{"tags":["admin-data"],"summary":"List Sources","operationId":"list_sources_api_admin_data_sources_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin-data"],"summary":"Create Source","operationId":"create_source_api_admin_data_sources_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__admin_data__SourceCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin-data/sources/{source_id}":{"get":{"tags":["admin-data"],"summary":"Get Source","operationId":"get_source_api_admin_data_sources__source_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["admin-data"],"summary":"Update Source","operationId":"update_source_api_admin_data_sources__source_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin-data/sources/{source_id}/enqueue-scan":{"post":{"tags":["admin-data"],"summary":"Enqueue Scan","operationId":"enqueue_scan_api_admin_data_sources__source_id__enqueue_scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin-data/tables":{"get":{"tags":["admin-data"],"summary":"List Tables","operationId":"list_tables_api_admin_data_tables_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin-data"],"summary":"Register Table","operationId":"register_table_api_admin_data_tables_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rental-profitability/metrics":{"get":{"tags":["rental-profitability"],"summary":"List Rental Profitability Metrics","operationId":"list_rental_profitability_metrics_api_rental_profitability_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Rental Profitability Metrics Api Rental Profitability Metrics Get"}}}}}}},"/api/rental-profitability/by-address":{"get":{"tags":["rental-profitability"],"summary":"Get Rental Profitability By Address","operationId":"get_rental_profitability_by_address_api_rental_profitability_by_address_get","parameters":[{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"User-entered address","title":"Address"},"description":"User-entered address"},{"name":"pnu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional PNU for exact lookup","title":"Pnu"},"description":"Optional PNU for exact lookup"},{"name":"purchase_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Optional purchase price in KRW","title":"Purchase Price"},"description":"Optional purchase price in KRW"},{"name":"loan_amount","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Optional loan amount in KRW","title":"Loan Amount"},"description":"Optional loan amount in KRW"},{"name":"annual_interest_rate","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Optional annual interest rate percent","title":"Annual Interest Rate"},"description":"Optional annual interest rate percent"},{"name":"operating_expense_ratio","in":"query","required":false,"schema":{"type":"number","maximum":100,"minimum":0,"default":15.0,"title":"Operating Expense Ratio"}},{"name":"vacancy_rate","in":"query","required":false,"schema":{"type":"number","maximum":100,"minimum":0,"default":5.0,"title":"Vacancy Rate"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Rental Profitability By Address Api Rental Profitability By Address Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/market-price/metrics":{"get":{"tags":["market-price"],"summary":"List Market Price Metrics","operationId":"list_market_price_metrics_api_market_price_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Market Price Metrics Api Market Price Metrics Get"}}}}}}},"/api/market-price/by-address":{"get":{"tags":["market-price"],"summary":"Get Market Price By Address","operationId":"get_market_price_by_address_api_market_price_by_address_get","parameters":[{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"User-entered address","title":"Address"},"description":"User-entered address"},{"name":"pnu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional PNU for exact lookup","title":"Pnu"},"description":"Optional PNU for exact lookup"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Market Price By Address Api Market Price By Address Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/sessions":{"post":{"tags":["feedback-loop","feedback-loop"],"summary":"분석 세션 생성 (또는 기존 세션 반환)","description":"session_id 기준 upsert:\n- 이미 존재하면 기존 세션 반환\n- 없으면 신규 생성","operationId":"create_or_get_session_api_analysis_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/analysis/sessions/{session_id}":{"get":{"tags":["feedback-loop","feedback-loop"],"summary":"세션 조회","operationId":"get_session_api_analysis_sessions__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/sessions/{session_id}/messages":{"post":{"tags":["feedback-loop","feedback-loop"],"summary":"대화 메시지 기록","description":"role=user 메시지에 대해 자동으로:\n- intent 분류 (키워드 기반)\n- 개인정보 redact","operationId":"log_message_api_analysis_sessions__session_id__messages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["feedback-loop","feedback-loop"],"summary":"세션 메시지 목록","operationId":"list_messages_api_analysis_sessions__session_id__messages_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MessageOut"},"title":"Response List Messages Api Analysis Sessions  Session Id  Messages Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/sessions/{session_id}/runs":{"post":{"tags":["feedback-loop","feedback-loop"],"summary":"분석 런 스냅샷 기록","description":"분석 실행 결과를 세션에 연결해 기록한다.","operationId":"log_run_api_analysis_sessions__session_id__runs_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/runs/{run_id}/wiki-usage":{"post":{"tags":["feedback-loop","feedback-loop"],"summary":"분석 런에서 사용된 Wiki Note 기록 (배치)","description":"wiki_context 에 포함된 노트 목록을 사용 기록으로 저장.\n분석 런 1개당 여러 노트를 배치로 기록한다.","operationId":"log_wiki_usage_api_analysis_runs__run_id__wiki_usage_post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WikiUsageCreate"},"title":"Usages"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WikiUsageOut"},"title":"Response Log Wiki Usage Api Analysis Runs  Run Id  Wiki Usage Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/sessions/{session_id}/events":{"post":{"tags":["feedback-loop","feedback-loop"],"summary":"사용자 UI 이벤트 기록","operationId":"log_event_api_analysis_sessions__session_id__events_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analysis/feedback/stats":{"get":{"tags":["feedback-loop","feedback-loop"],"summary":"인텐트 분포 + Wiki Gap 통계 (설계서 Section 5~8)","description":"최근 N일 세션 데이터에서:\n- 인텐트 분포\n- 자주 쓰인 Wiki Note\n- Wiki Gap (자주 묻지만 노트가 부족한 주제)\n를 반환한다.","operationId":"feedback_stats_api_analysis_feedback_stats_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"집계 기간 (일)","default":30,"title":"Days"},"description":"집계 기간 (일)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackLoopStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/address/suggest":{"get":{"tags":["address"],"summary":"Suggest Address","description":"카카오 주소 검색 API 프록시. API 키는 서버에서만 보유.","operationId":"suggest_address_api_address_suggest_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"검색어","title":"Q"},"description":"검색어"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"default":5,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/address/draft":{"get":{"tags":["address"],"summary":"Get Analysis Draft","description":"analysis_results.result_json JSONB + analysis_requests 컬럼을 JOIN해\n과거 사례 평균으로 초안 값 제안.\n\nFallback 순위:\n  1. analysis_requests.region_code = bjd_code (법정동)\n  2. analysis_requests.address ILIKE '%region_2depth%' (구)\n  3. 기본 금융 가정값","operationId":"get_analysis_draft_api_address_draft_get","parameters":[{"name":"address_name","in":"query","required":true,"schema":{"type":"string","title":"Address Name"}},{"name":"bjd_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bjd Code"}},{"name":"region_2depth","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 2Depth"}},{"name":"region_3depth","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 3Depth"}},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"}},{"name":"lng","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"}},{"name":"asset_type","in":"query","required":false,"schema":{"type":"string","default":"building","title":"Asset Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/ticker":{"get":{"tags":["news-ticker"],"summary":"Get Ticker","description":"오늘 또는 어제 is_active=True 리포트 최대 10개.\nclick_count DESC, signal_strength DESC 정렬.","operationId":"get_ticker_api_news_ticker_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TickerResponse"}}}}}}},"/api/news/ticker/{report_id}/detail":{"get":{"tags":["news-ticker"],"summary":"Get Ticker Detail","description":"리포트 상세 조회 + exposed_count += 1 + related_properties 포함.","operationId":"get_ticker_detail_api_news_ticker__report_id__detail_get","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/ticker/{report_id}/click":{"post":{"tags":["news-ticker"],"summary":"Click Ticker","description":"click_count += 1 + click_events 테이블에 이벤트 기록.","operationId":"click_ticker_api_news_ticker__report_id__click_post","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClickRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/seed":{"post":{"tags":["news-ticker"],"summary":"Seed Ticker","description":"배포 DB 초기 시딩 — district_watcher_reports가 비어 있을 때 한 번만 실행.\n이미 데이터가 있으면 skip.","operationId":"seed_ticker_api_news_seed_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/roadmap/graph":{"get":{"tags":["roadmap","roadmap"],"summary":"Get Roadmap Graph","operationId":"get_roadmap_graph_api_roadmap_graph_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/roadmap/audit":{"post":{"tags":["roadmap","roadmap"],"summary":"Run Roadmap Audit","operationId":"run_roadmap_audit_api_roadmap_audit_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/roadmap/audit/run":{"post":{"tags":["roadmap","roadmap"],"summary":"Start Intelligent Roadmap Audit","description":"Start the intelligent roadmap audit and return a run id for polling.","operationId":"start_intelligent_roadmap_audit_api_roadmap_audit_run_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/roadmap/audit/run/{audit_run_id}":{"get":{"tags":["roadmap","roadmap"],"summary":"Get Intelligent Roadmap Audit Run","operationId":"get_intelligent_roadmap_audit_run_api_roadmap_audit_run__audit_run_id__get","parameters":[{"name":"audit_run_id","in":"path","required":true,"schema":{"type":"string","title":"Audit Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/roadmap/audit/node/{node_id}":{"get":{"tags":["roadmap","roadmap"],"summary":"Get Roadmap Node Audit","operationId":"get_roadmap_node_audit_api_roadmap_audit_node__node_id__get","parameters":[{"name":"node_id","in":"path","required":true,"schema":{"type":"string","title":"Node Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/roadmap/refresh":{"post":{"tags":["roadmap","roadmap"],"summary":"Refresh Roadmap","description":"공개 엔드포인트 — 프론트엔드 새로고침 버튼용. audit 후 그래프 반환.","operationId":"refresh_roadmap_api_roadmap_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/collateral-value/collect":{"post":{"tags":["collateral-value","collateral-value"],"summary":"Collect Collateral Value Endpoint","operationId":"collect_collateral_value_endpoint_api_collateral_value_collect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollateralValueRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollateralValueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/collateral-value/status":{"get":{"tags":["collateral-value","collateral-value"],"summary":"Get Collateral Value Status Endpoint","operationId":"get_collateral_value_status_endpoint_api_collateral_value_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollateralValueStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transport-access/metrics":{"get":{"tags":["transport-access","transport-access"],"summary":"List Transport Access Metrics","operationId":"list_transport_access_metrics_api_transport_access_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Transport Access Metrics Api Transport Access Metrics Get"}}}}}}},"/api/transport-access/status":{"get":{"tags":["transport-access","transport-access"],"summary":"Transport Access Status","operationId":"transport_access_status_api_transport_access_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Transport Access Status Api Transport Access Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transport-access/collect":{"post":{"tags":["transport-access","transport-access"],"summary":"Collect Transport Access Endpoint","operationId":"collect_transport_access_endpoint_api_transport_access_collect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","description":"User-entered address","title":"Address"},"description":"User-entered address"},{"name":"persist","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Persist"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Collect Transport Access Endpoint Api Transport Access Collect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/project-metrics/cost-construction/metrics":{"get":{"tags":["project-metrics","project-metrics"],"summary":"List Cost Construction Metrics","operationId":"list_cost_construction_metrics_api_project_metrics_cost_construction_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Cost Construction Metrics Api Project Metrics Cost Construction Metrics Get"}}}}}}},"/api/project-metrics/business-feasibility/metrics":{"get":{"tags":["project-metrics","project-metrics"],"summary":"List Business Feasibility Metrics","operationId":"list_business_feasibility_metrics_api_project_metrics_business_feasibility_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Business Feasibility Metrics Api Project Metrics Business Feasibility Metrics Get"}}}}}}},"/api/project-metrics/cost-construction/status":{"get":{"tags":["project-metrics","project-metrics"],"summary":"Cost Construction Status","operationId":"cost_construction_status_api_project_metrics_cost_construction_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cost Construction Status Api Project Metrics Cost Construction Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/project-metrics/business-feasibility/status":{"get":{"tags":["project-metrics","project-metrics"],"summary":"Business Feasibility Status","operationId":"business_feasibility_status_api_project_metrics_business_feasibility_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Business Feasibility Status Api Project Metrics Business Feasibility Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/project-metrics/cost-construction/collect":{"post":{"tags":["project-metrics","project-metrics"],"summary":"Collect Cost Construction Endpoint","operationId":"collect_cost_construction_endpoint_api_project_metrics_cost_construction_collect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"}},{"name":"pnu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"}},{"name":"purchase_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"KRW","title":"Purchase Price"},"description":"KRW"},{"name":"target_gfa_m2","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Gfa M2"}},{"name":"persist","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Persist"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Collect Cost Construction Endpoint Api Project Metrics Cost Construction Collect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/project-metrics/business-feasibility/collect":{"post":{"tags":["project-metrics","project-metrics"],"summary":"Collect Business Feasibility Endpoint","operationId":"collect_business_feasibility_endpoint_api_project_metrics_business_feasibility_collect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"}},{"name":"pnu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"}},{"name":"purchase_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"KRW","title":"Purchase Price"},"description":"KRW"},{"name":"loan_amount","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"KRW","title":"Loan Amount"},"description":"KRW"},{"name":"annual_interest_rate","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"percent","title":"Annual Interest Rate"},"description":"percent"},{"name":"monthly_rent","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"KRW per month","title":"Monthly Rent"},"description":"KRW per month"},{"name":"equity_amount","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"KRW","title":"Equity Amount"},"description":"KRW"},{"name":"target_gfa_m2","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Gfa M2"}},{"name":"persist","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Persist"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Collect Business Feasibility Endpoint Api Project Metrics Business Feasibility Collect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/demographics-development/demographics/metrics":{"get":{"tags":["demographics-development","demographics-development"],"summary":"List Demographics Metrics","operationId":"list_demographics_metrics_api_demographics_development_demographics_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Demographics Metrics Api Demographics Development Demographics Metrics Get"}}}}}}},"/api/demographics-development/development-legal/metrics":{"get":{"tags":["demographics-development","demographics-development"],"summary":"List Development Legal Metrics","operationId":"list_development_legal_metrics_api_demographics_development_development_legal_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Development Legal Metrics Api Demographics Development Development Legal Metrics Get"}}}}}}},"/api/demographics-development/demographics/status":{"get":{"tags":["demographics-development","demographics-development"],"summary":"Demographics Status","operationId":"demographics_status_api_demographics_development_demographics_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Demographics Status Api Demographics Development Demographics Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/demographics-development/development-legal/status":{"get":{"tags":["demographics-development","demographics-development"],"summary":"Development Legal Status","operationId":"development_legal_status_api_demographics_development_development_legal_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Development Legal Status Api Demographics Development Development Legal Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/demographics-development/demographics/collect":{"post":{"tags":["demographics-development","demographics-development"],"summary":"Collect Demographics Endpoint","operationId":"collect_demographics_endpoint_api_demographics_development_demographics_collect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"}},{"name":"region_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"}},{"name":"persist","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Persist"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Collect Demographics Endpoint Api Demographics Development Demographics Collect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/demographics-development/development-legal/collect":{"post":{"tags":["demographics-development","demographics-development"],"summary":"Collect Development Legal Endpoint","operationId":"collect_development_legal_endpoint_api_demographics_development_development_legal_collect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"}},{"name":"pnu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"}},{"name":"persist","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Persist"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Collect Development Legal Endpoint Api Demographics Development Development Legal Collect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/macro-esg/macro-market/metrics":{"get":{"tags":["macro-esg","macro-esg"],"summary":"List Macro Market Metrics","operationId":"list_macro_market_metrics_api_macro_esg_macro_market_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Macro Market Metrics Api Macro Esg Macro Market Metrics Get"}}}}}}},"/api/macro-esg/environment-esg/metrics":{"get":{"tags":["macro-esg","macro-esg"],"summary":"List Environment Esg Metrics","operationId":"list_environment_esg_metrics_api_macro_esg_environment_esg_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Environment Esg Metrics Api Macro Esg Environment Esg Metrics Get"}}}}}}},"/api/macro-esg/macro-market/status":{"get":{"tags":["macro-esg","macro-esg"],"summary":"Macro Market Status","operationId":"macro_market_status_api_macro_esg_macro_market_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Macro Market Status Api Macro Esg Macro Market Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/macro-esg/environment-esg/status":{"get":{"tags":["macro-esg","macro-esg"],"summary":"Environment Esg Status","operationId":"environment_esg_status_api_macro_esg_environment_esg_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Environment Esg Status Api Macro Esg Environment Esg Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/macro-esg/macro-market/collect":{"post":{"tags":["macro-esg","macro-esg"],"summary":"Collect Macro Market Endpoint","operationId":"collect_macro_market_endpoint_api_macro_esg_macro_market_collect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"region_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"}},{"name":"persist","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Persist"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Collect Macro Market Endpoint Api Macro Esg Macro Market Collect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/macro-esg/environment-esg/collect":{"post":{"tags":["macro-esg","macro-esg"],"summary":"Collect Environment Esg Endpoint","operationId":"collect_environment_esg_endpoint_api_macro_esg_environment_esg_collect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"}},{"name":"pnu","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"}},{"name":"persist","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Persist"}},{"name":"X-Internal-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Collect Environment Esg Endpoint Api Macro Esg Environment Esg Collect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ActionCard":{"properties":{"primary_action":{"type":"string","title":"Primary Action"},"actions":{"items":{"$ref":"#/components/schemas/ActionItem"},"type":"array","title":"Actions"}},"type":"object","required":["primary_action","actions"],"title":"ActionCard"},"ActionItem":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"}},"type":"object","required":["key","label"],"title":"ActionItem"},"AddressProps":{"properties":{"zoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zoning","description":"용도지역 (예: 2종일반주거)"},"bcrat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bcrat","description":"건폐율 (%)"},"vlrat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vlrat","description":"용적률 (%)"},"area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area M2","description":"대지 면적 (㎡)"},"land_price_per_m2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Land Price Per M2","description":"개별공시지가 (원/㎡)"},"built_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Built Year","description":"건축년도"},"floors_above":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Floors Above","description":"지상 층수"}},"type":"object","title":"AddressProps"},"AddressSuggestion":{"properties":{"address_name":{"type":"string","title":"Address Name"},"display_address":{"type":"string","title":"Display Address"},"road_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Road Address"},"jibun_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jibun Address"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"bjd_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bjd Code"},"is_bjd_matched":{"type":"boolean","title":"Is Bjd Matched","default":false},"region_1depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 1Depth"},"region_2depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 2Depth"},"region_3depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 3Depth"}},"type":"object","required":["address_name","display_address","lat","lng"],"title":"AddressSuggestion"},"AdminCardNewsCandidateDetail":{"properties":{"id":{"type":"integer","title":"Id"},"headline":{"type":"string","title":"Headline"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtitle"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"review_status":{"type":"string","title":"Review Status"},"trend_score":{"type":"integer","title":"Trend Score"},"visual_score":{"type":"integer","title":"Visual Score"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"investment_takeaway":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Takeaway"},"why_promoted":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why Promoted"},"source_metric_keys":{"items":{"type":"string"},"type":"array","title":"Source Metric Keys"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"key_numbers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Key Numbers"},"source_snapshot_ids":{"items":{"type":"integer"},"type":"array","title":"Source Snapshot Ids"},"source_delta_ids":{"items":{"type":"integer"},"type":"array","title":"Source Delta Ids"},"draft_payload":{"additionalProperties":true,"type":"object","title":"Draft Payload"}},"type":"object","required":["id","headline","subtitle","region","review_status","trend_score","visual_score","confidence","investment_takeaway","why_promoted","source_metric_keys","created_at","updated_at","key_numbers","source_snapshot_ids","source_delta_ids","draft_payload"],"title":"AdminCardNewsCandidateDetail"},"AdminCardNewsCandidateSummary":{"properties":{"id":{"type":"integer","title":"Id"},"headline":{"type":"string","title":"Headline"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtitle"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"review_status":{"type":"string","title":"Review Status"},"trend_score":{"type":"integer","title":"Trend Score"},"visual_score":{"type":"integer","title":"Visual Score"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"investment_takeaway":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Takeaway"},"why_promoted":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why Promoted"},"source_metric_keys":{"items":{"type":"string"},"type":"array","title":"Source Metric Keys"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","headline","subtitle","region","review_status","trend_score","visual_score","confidence","investment_takeaway","why_promoted","source_metric_keys","created_at","updated_at"],"title":"AdminCardNewsCandidateSummary"},"AdminOverviewResponse":{"properties":{"server_status":{"type":"string","title":"Server Status"},"scheduler_status":{"type":"string","title":"Scheduler Status"},"pipeline_status":{"type":"string","title":"Pipeline Status"},"pipeline_queued_count":{"type":"integer","title":"Pipeline Queued Count"},"last_updated_at":{"type":"string","format":"date-time","title":"Last Updated At"}},"type":"object","required":["server_status","scheduler_status","pipeline_status","pipeline_queued_count","last_updated_at"],"title":"AdminOverviewResponse"},"AdminSchedulerResponse":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/SchedulerJobStatus"},"type":"array","title":"Jobs"},"failed_sources":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Failed Sources"}},"type":"object","required":["jobs","failed_sources"],"title":"AdminSchedulerResponse"},"AdminSignalTickerItem":{"properties":{"id":{"type":"integer","title":"Id"},"headline":{"type":"string","title":"Headline"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"district_name":{"type":"string","title":"District Name"},"signal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal"},"signal_strength":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal Strength"},"frame":{"type":"string","title":"Frame"},"report_date":{"type":"string","format":"date","title":"Report Date"},"rank_score":{"type":"integer","title":"Rank Score"},"wiki_note_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wiki Note Id"},"source_metric_keys":{"items":{"type":"string"},"type":"array","title":"Source Metric Keys"},"source_delta_ids":{"items":{"type":"integer"},"type":"array","title":"Source Delta Ids"},"click_count":{"type":"integer","title":"Click Count"},"exposed_count":{"type":"integer","title":"Exposed Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","headline","summary","district_name","signal","signal_strength","frame","report_date","rank_score","wiki_note_id","source_metric_keys","source_delta_ids","click_count","exposed_count","created_at","updated_at"],"title":"AdminSignalTickerItem"},"AdminUsageResponse":{"properties":{"stats":{"$ref":"#/components/schemas/UsageStats"},"recent_analyses":{"items":{"$ref":"#/components/schemas/RecentAnalysis"},"type":"array","title":"Recent Analyses"}},"type":"object","required":["stats","recent_analyses"],"title":"AdminUsageResponse"},"AdminWikiNoteDetail":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"status":{"type":"string","title":"Status"},"freshness_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Freshness Status"},"source_count":{"type":"integer","title":"Source Count"},"version_count":{"type":"integer","title":"Version Count"},"latest_change_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Change Summary"},"latest_version_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest Version At"},"last_compiled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Compiled At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"content":{"type":"string","title":"Content"},"versions":{"items":{"$ref":"#/components/schemas/AdminWikiNoteVersion"},"type":"array","title":"Versions"}},"type":"object","required":["id","title","status","freshness_status","source_count","version_count","latest_change_summary","latest_version_at","last_compiled_at","created_at","updated_at","content","versions"],"title":"AdminWikiNoteDetail"},"AdminWikiNoteSummary":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"status":{"type":"string","title":"Status"},"freshness_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Freshness Status"},"source_count":{"type":"integer","title":"Source Count"},"version_count":{"type":"integer","title":"Version Count"},"latest_change_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Change Summary"},"latest_version_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest Version At"},"last_compiled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Compiled At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","title","status","freshness_status","source_count","version_count","latest_change_summary","latest_version_at","last_compiled_at","created_at","updated_at"],"title":"AdminWikiNoteSummary"},"AdminWikiNoteVersion":{"properties":{"version_no":{"type":"integer","title":"Version No"},"change_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Summary"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["version_no","change_summary","created_at"],"title":"AdminWikiNoteVersion"},"AdminWikiResponse":{"properties":{"wiki":{"$ref":"#/components/schemas/WikiStatus"},"recent_updates":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Recent Updates"}},"type":"object","required":["wiki","recent_updates"],"title":"AdminWikiResponse"},"AnalysisRequestCreate":{"properties":{"request_type":{"type":"string","title":"Request Type","default":"quick_check"},"address":{"type":"string","title":"Address"},"road_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Road Address"},"lot_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lot Address"},"pnu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"asset_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type Code"},"target_use":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Use"},"purchase_price":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Purchase Price"},"expected_deposit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Deposit"},"expected_monthly_rent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Monthly Rent"},"equity_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Equity Amount"},"loan_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Loan Amount"},"user_goal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Goal"},"bjd_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bjd Code"},"region_2depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 2Depth"},"region_3depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 3Depth"},"raw_input":{"anyOf":[{},{"type":"null"}],"title":"Raw Input"}},"type":"object","required":["address"],"title":"AnalysisRequestCreate"},"AnalysisRequestOut":{"properties":{"id":{"type":"integer","title":"Id"},"request_type":{"type":"string","title":"Request Type"},"address":{"type":"string","title":"Address"},"road_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Road Address"},"lot_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lot Address"},"pnu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"asset_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type Code"},"target_use":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Use"},"purchase_price":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Purchase Price"},"expected_deposit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Deposit"},"expected_monthly_rent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Monthly Rent"},"equity_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Equity Amount"},"loan_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Loan Amount"},"user_goal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Goal"},"bjd_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bjd Code"},"region_2depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 2Depth"},"region_3depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 3Depth"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","request_type","address","road_address","lot_address","pnu","latitude","longitude","region_code","asset_type_code","target_use","purchase_price","expected_deposit","expected_monthly_rent","equity_amount","loan_amount","user_goal","bjd_code","region_2depth","region_3depth","status","created_at"],"title":"AnalysisRequestOut"},"AnalysisRunRequest":{"properties":{"address":{"type":"string","title":"Address","description":"대상 부동산 주소","examples":["서울시 마포구 신수동 27-2"]},"asset_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type","description":"자산 유형","examples":["근린생활시설"]},"deal_amount":{"type":"integer","exclusiveMinimum":0.0,"title":"Deal Amount","description":"매입가 (원)","examples":[4200000000]},"deposit":{"type":"integer","minimum":0.0,"title":"Deposit","description":"예상 보증금 (원)","default":0},"monthly_rent":{"type":"integer","minimum":0.0,"title":"Monthly Rent","description":"예상 월세 (원)","default":0},"equity":{"type":"integer","minimum":0.0,"title":"Equity","description":"자기자본 (원)","default":0},"investment_purpose":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Purpose","description":"투자 목적","examples":["리모델링 후 임대"]},"user_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Message","description":"자유 질의"},"interest_rate":{"type":"number","maximum":0.3,"minimum":0.0,"title":"Interest Rate","description":"연 이자율 (소수)","default":0.05,"examples":[0.05]},"vacancy_rate":{"type":"number","maximum":0.5,"minimum":0.0,"title":"Vacancy Rate","description":"공실률 (소수)","default":0.1,"examples":[0.1]},"operating_expense_ratio":{"type":"number","maximum":0.8,"minimum":0.0,"title":"Operating Expense Ratio","description":"운영비 비율 (소수)","default":0.2,"examples":[0.2]},"remodeling_cost":{"type":"integer","minimum":0.0,"title":"Remodeling Cost","description":"리모델링 비용 (원)","default":0}},"type":"object","required":["address","deal_amount"],"title":"AnalysisRunRequest","description":"POST /api/analysis/run 입력 — v0(Vercel) 프론트엔드 구조와 직접 호환.\n\nDB에 저장하지 않고 rule-based로 즉시 카드형 응답을 반환하는 동적 분석용.\nDB-backed 흐름은 기존 AnalysisRequestCreate + /requests/{id}/run을 사용한다."},"AnalyzeRequest":{"properties":{"address":{"type":"string","title":"Address"}},"type":"object","required":["address"],"title":"AnalyzeRequest"},"AnswerBlock":{"properties":{"conclusion":{"type":"string","title":"Conclusion"},"reasoning":{"type":"string","title":"Reasoning"},"recommended_action":{"type":"string","title":"Recommended Action"},"favorable_factors":{"items":{"type":"string"},"type":"array","title":"Favorable Factors"},"unfavorable_factors":{"items":{"type":"string"},"type":"array","title":"Unfavorable Factors"},"items_to_verify":{"items":{"type":"string"},"type":"array","title":"Items To Verify"},"confidence_score":{"type":"integer","title":"Confidence Score"}},"type":"object","required":["conclusion","reasoning","recommended_action","favorable_factors","unfavorable_factors","items_to_verify","confidence_score"],"title":"AnswerBlock"},"AreaSalesStatCreate":{"properties":{"area_id":{"type":"integer","title":"Area Id"},"industry_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Industry Id"},"period":{"type":"string","title":"Period"},"monthly_sales":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Sales"},"transaction_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Transaction Count"}},"type":"object","required":["area_id","period"],"title":"AreaSalesStatCreate"},"AreaSalesStatOut":{"properties":{"area_id":{"type":"integer","title":"Area Id"},"industry_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Industry Id"},"period":{"type":"string","title":"Period"},"monthly_sales":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Sales"},"transaction_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Transaction Count"},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["area_id","period","id","created_at"],"title":"AreaSalesStatOut"},"AskAnswer":{"properties":{"conclusion":{"type":"string","title":"Conclusion"},"reasoning":{"type":"string","title":"Reasoning"},"recommended_action":{"type":"string","title":"Recommended Action"},"items_to_verify":{"items":{"type":"string"},"type":"array","title":"Items To Verify"}},"type":"object","required":["conclusion","reasoning","recommended_action","items_to_verify"],"title":"AskAnswer"},"AskRequest":{"properties":{"question":{"type":"string","title":"Question"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"pnu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"},"asset_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type Code"}},"type":"object","required":["question"],"title":"AskRequest"},"AskResponse":{"properties":{"question":{"type":"string","title":"Question"},"facts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Facts"},"metric_deltas":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Metric Deltas"},"signals":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Signals"},"cases":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Cases"},"answer":{"$ref":"#/components/schemas/AskAnswer"},"upsell":{"$ref":"#/components/schemas/AskUpsell"}},"type":"object","required":["question","facts","metric_deltas","signals","cases","answer","upsell"],"title":"AskResponse"},"AskUpsell":{"properties":{"should_offer_paid_report":{"type":"boolean","title":"Should Offer Paid Report"},"report_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Report Type"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["should_offer_paid_report","report_type","message"],"title":"AskUpsell"},"Bankability":{"properties":{"score":{"type":"integer","title":"Score"},"max_score":{"type":"integer","title":"Max Score"},"summary":{"type":"string","title":"Summary"},"explanation_rows":{"items":{"$ref":"#/components/schemas/BankabilityRow"},"type":"array","title":"Explanation Rows"}},"type":"object","required":["score","max_score","summary","explanation_rows"],"title":"Bankability"},"BankabilityRow":{"properties":{"label":{"type":"string","title":"Label"},"value":{"type":"string","title":"Value"}},"type":"object","required":["label","value"],"title":"BankabilityRow"},"BlogSearchResult":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"score":{"type":"number","title":"Score"},"search_mode":{"type":"string","title":"Search Mode"},"snippets":{"items":{"type":"string"},"type":"array","title":"Snippets","default":[]},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"source_type":{"type":"string","const":"blog","title":"Source Type"},"preview_images":{"items":{"$ref":"#/components/schemas/PreviewImage"},"type":"array","title":"Preview Images","default":[]}},"type":"object","required":["id","title","score","search_mode","source_type"],"title":"BlogSearchResult"},"BokSyncRequest":{"properties":{"start_date":{"type":"string","title":"Start Date","default":"20260101"},"end_date":{"type":"string","title":"End Date","default":"20260502"}},"type":"object","title":"BokSyncRequest"},"BootstrapRequest":{"properties":{"full_address":{"type":"string","title":"Full Address","description":"분석할 부동산 주소"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat","description":"위도 (카카오 지오코딩 결과, 없으면 서버에서 조회)"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng","description":"경도 (카카오 지오코딩 결과, 없으면 서버에서 조회)"},"bjd_code":{"type":"string","title":"Bjd Code","description":"법정동 코드 (10자리) — 프론트엔드 카카오 지오코딩 결과 필수"},"road_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Road Address","description":"도로명 주소"},"jibun_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jibun Address","description":"지번 주소"},"building_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Name","description":"건물명"}},"type":"object","required":["full_address","bjd_code"],"title":"BootstrapRequest"},"BootstrapResponse":{"properties":{"address":{"type":"string","title":"Address"},"address_props":{"anyOf":[{"$ref":"#/components/schemas/AddressProps"},{"type":"null"}]},"sample_inputs":{"anyOf":[{"$ref":"#/components/schemas/SampleInputs"},{"type":"null"}]},"comparable_count":{"type":"integer","title":"Comparable Count","default":0},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"},"analysis":{"anyOf":[{"$ref":"#/components/schemas/MobileCardAnalysisResponse"},{"type":"null"}],"description":"bootstrap 시점 자동 실행 분석 결과 (sample_inputs 기반). 없으면 null."}},"type":"object","required":["address"],"title":"BootstrapResponse"},"BuildingRegister":{"properties":{"permit_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Permit Year"},"approval_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Approval Year"},"current_gfa_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current Gfa M2"},"max_gfa_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Gfa M2"},"fetched_at":{"type":"string","title":"Fetched At"},"caption":{"type":"string","title":"Caption"}},"type":"object","required":["permit_year","approval_year","current_gfa_m2","max_gfa_m2","fetched_at","caption"],"title":"BuildingRegister"},"CaseSeedResponse":{"properties":{"seeded":{"type":"integer","title":"Seeded"},"message":{"type":"string","title":"Message"}},"type":"object","required":["seeded","message"],"title":"CaseSeedResponse"},"ChatRequest":{"properties":{"message":{"type":"string","title":"Message"},"analysis_context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Analysis Context"},"history":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"History"}},"type":"object","required":["message"],"title":"ChatRequest"},"ChatResponse":{"properties":{"response":{"type":"string","title":"Response"},"sources_used":{"items":{},"type":"array","title":"Sources Used","default":[]},"model":{"type":"string","title":"Model","default":""},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["response"],"title":"ChatResponse"},"ClickRequest":{"properties":{"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","title":"ClickRequest"},"CollateralFact":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"refresh_cycle":{"type":"string","title":"Refresh Cycle"},"source_name":{"type":"string","title":"Source Name"},"status":{"type":"string","enum":["active","warning","todo","skipped"],"title":"Status"},"value":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"boolean"},{"type":"null"}],"title":"Value"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"raw":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"null"}],"title":"Raw"}},"type":"object","required":["key","label","refresh_cycle","source_name","status"],"title":"CollateralFact"},"CollateralValueRequest":{"properties":{"address":{"type":"string","minLength":2,"title":"Address"},"property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Property Id"},"base_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Base Year"},"persist":{"type":"boolean","title":"Persist","default":true}},"type":"object","required":["address"],"title":"CollateralValueRequest"},"CollateralValueResponse":{"properties":{"normalized_address":{"$ref":"#/components/schemas/NormalizedAddress"},"facts":{"items":{"$ref":"#/components/schemas/CollateralFact"},"type":"array","title":"Facts"},"estimated_land_value_eok":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Land Value Eok"},"blocked_or_skipped":{"items":{"type":"string"},"type":"array","title":"Blocked Or Skipped"}},"type":"object","required":["normalized_address","facts","blocked_or_skipped"],"title":"CollateralValueResponse"},"CollateralValueStatusResponse":{"properties":{"roadmap_node_id":{"type":"string","title":"Roadmap Node Id","default":"collateral_value"},"configured_required_keys":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Configured Required Keys"},"stored_pnu_count":{"type":"integer","title":"Stored Pnu Count"},"stored_fact_count":{"type":"integer","title":"Stored Fact Count"},"active_item_count":{"type":"integer","title":"Active Item Count"},"warning_item_count":{"type":"integer","title":"Warning Item Count"},"todo_item_count":{"type":"integer","title":"Todo Item Count"},"latest_fetched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Fetched At"},"next_actions":{"items":{"type":"string"},"type":"array","title":"Next Actions"},"collateral_value":{"$ref":"#/components/schemas/SourceCategoryStatus"}},"type":"object","required":["configured_required_keys","stored_pnu_count","stored_fact_count","active_item_count","warning_item_count","todo_item_count","next_actions","collateral_value"],"title":"CollateralValueStatusResponse"},"CommercialAreaCreate":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"name":{"type":"string","title":"Name"},"region_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Region Id"},"area_size_m2":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Area Size M2"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["name"],"title":"CommercialAreaCreate"},"CommercialAreaOut":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"name":{"type":"string","title":"Name"},"region_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Region Id"},"area_size_m2":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Area Size M2"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["name","id","created_at"],"title":"CommercialAreaOut"},"CommercialDistrictStatOut":{"properties":{"id":{"type":"integer","title":"Id"},"district_name":{"type":"string","title":"District Name"},"bjd_code":{"type":"string","title":"Bjd Code"},"region_2depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 2Depth"},"region_3depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 3Depth"},"stat_year":{"type":"integer","title":"Stat Year"},"stat_quarter":{"type":"integer","title":"Stat Quarter"},"floating_population":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Floating Population"},"sales_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sales Amount"},"store_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Store Count"},"open_rate":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Open Rate"},"close_rate":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Close Rate"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","district_name","bjd_code","region_2depth","region_3depth","stat_year","stat_quarter","floating_population","sales_amount","store_count","open_rate","close_rate","created_at"],"title":"CommercialDistrictStatOut"},"ConclusionCard":{"properties":{"overall_grade":{"type":"string","title":"Overall Grade"},"one_line_judgement":{"type":"string","title":"One Line Judgement"},"short_reason":{"type":"string","title":"Short Reason"},"recommended_next_action":{"type":"string","title":"Recommended Next Action"}},"type":"object","required":["overall_grade","one_line_judgement","short_reason","recommended_next_action"],"title":"ConclusionCard"},"ConversationCurrentConditions":{"properties":{"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"asset_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type"},"deal_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deal Amount"},"deposit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deposit"},"monthly_rent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Rent"},"equity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Equity"},"investment_purpose":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Purpose"},"interest_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Interest Rate"},"vacancy_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vacancy Rate"},"operating_expense_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Operating Expense Ratio"},"remodeling_cost":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remodeling Cost"}},"type":"object","title":"ConversationCurrentConditions","description":"프론트엔드가 현재 화면에 보유 중인 딜 조건. 모두 Optional."},"ConversationRequest":{"properties":{"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"세션 식별자. null이면 서버에서 생성 (V1.1 stateless)."},"message":{"type":"string","maxLength":1000,"title":"Message","description":"사용자 자연어 입력 (최대 800자)"},"current_conditions":{"$ref":"#/components/schemas/ConversationCurrentConditions","description":"프론트엔드가 이미 보유 중인 딜 조건. 알려진 값만 채워 전달."},"previous_analysis":{"anyOf":[{"$ref":"#/components/schemas/PreviousAnalysis"},{"type":"null"}],"description":"직전 분석 결과 요약. 점수 변화 코멘트 생성에 사용."}},"type":"object","required":["message"],"title":"ConversationRequest","description":"POST /api/analysis/conversation 요청 body."},"ConversationResponse":{"properties":{"status":{"type":"string","title":"Status","description":"needs_more_info | analysis_ready | llm_error | rate_limited"},"session_id":{"type":"string","title":"Session Id"},"extracted_conditions":{"additionalProperties":true,"type":"object","title":"Extracted Conditions"},"missing_fields":{"items":{"type":"string"},"type":"array","title":"Missing Fields"},"assistant_message":{"type":"string","title":"Assistant Message","description":"1~2문장, 최대 180자."},"analysis_result":{"anyOf":[{"$ref":"#/components/schemas/MobileCardAnalysisResponse"},{"type":"null"}]},"model_used":{"type":"string","title":"Model Used"},"confidence":{"type":"number","title":"Confidence"},"usage_guard":{"$ref":"#/components/schemas/UsageGuardInfo"}},"type":"object","required":["status","session_id","assistant_message","model_used","confidence","usage_guard"],"title":"ConversationResponse","description":"POST /api/analysis/conversation 응답."},"CreditRead":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"credit_type":{"type":"string","title":"Credit Type"},"amount":{"type":"integer","title":"Amount"},"percent_value":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Percent Value"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"is_used":{"type":"boolean","title":"Is Used"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_id","credit_type","amount","percent_value","source","description","expires_at","is_used","created_at"],"title":"CreditRead"},"DealPanelRunRequest":{"properties":{"address":{"type":"string","title":"Address","description":"대상 부동산 주소","examples":["서울특별시 마포구 합정동 428-5"]},"purchase_price_uk":{"type":"number","exclusiveMinimum":0.0,"title":"Purchase Price Uk","description":"매입가 (억원)","examples":[38.0]},"loan_amount_uk":{"type":"number","minimum":0.0,"title":"Loan Amount Uk","description":"대출금액 (억원)","default":0.0,"examples":[22.0]},"interest_rate_pct":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Interest Rate Pct","description":"금리 (%)","default":4.8,"examples":[4.8]},"monthly_rent_manwon":{"type":"number","minimum":0.0,"title":"Monthly Rent Manwon","description":"월세 (만원)","default":0.0,"examples":[320.0]},"deposit_manwon":{"type":"number","minimum":0.0,"title":"Deposit Manwon","description":"보증금 (만원)","default":0.0,"examples":[5000.0]},"vacancy_rate_pct":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Vacancy Rate Pct","description":"공실률 (%)","default":10.0,"examples":[10.0]},"construction_condition":{"type":"string","title":"Construction Condition","description":"건축조건 (현황/증축/신축/리모델링)","default":"현황","examples":["현황"]},"target_gfa_m2":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Target Gfa M2","description":"목표 연면적 (㎡)"},"construction_cost_per_m2_manwon":{"type":"number","minimum":0.0,"title":"Construction Cost Per M2 Manwon","description":"공사비 (만원/㎡)","default":500.0},"elevator_option":{"type":"string","title":"Elevator Option","description":"엘리베이터 (현황/있음/설치예정)","default":"현황","examples":["현황"]},"save_result":{"type":"boolean","title":"Save Result","description":"결과 DB 저장 여부","default":false}},"type":"object","required":["address","purchase_price_uk"],"title":"DealPanelRunRequest","description":"POST /api/analysis/deal-panel/run 요청 body.\n\n프론트 입력 단위: 억/만원/%.\n변환은 서비스 내부에서 처리한다."},"DealPanelRunResponse":{"properties":{"property_meta":{"$ref":"#/components/schemas/PropertyMeta"},"building_register":{"$ref":"#/components/schemas/BuildingRegister"},"inputs":{"$ref":"#/components/schemas/InputsEcho"},"kpis":{"$ref":"#/components/schemas/KPIs"},"market":{"$ref":"#/components/schemas/MarketInfo"},"bankability":{"$ref":"#/components/schemas/Bankability"},"deal_signal":{"$ref":"#/components/schemas/DealSignal"},"insight_cards":{"items":{"$ref":"#/components/schemas/InsightCard"},"type":"array","title":"Insight Cards"},"nearby_transactions":{"items":{"$ref":"#/components/schemas/NearbyTransactionRow"},"type":"array","title":"Nearby Transactions"},"map_markers":{"items":{"$ref":"#/components/schemas/MapMarker"},"type":"array","title":"Map Markers"},"validation_warnings":{"items":{"$ref":"#/components/schemas/ValidationWarning"},"type":"array","title":"Validation Warnings","default":[]}},"type":"object","required":["property_meta","building_register","inputs","kpis","market","bankability","deal_signal","insight_cards","nearby_transactions","map_markers"],"title":"DealPanelRunResponse"},"DealSignal":{"properties":{"label":{"type":"string","title":"Label"},"tone":{"type":"string","title":"Tone"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["label","tone","reason"],"title":"DealSignal"},"DeltaCalculateRequest":{"properties":{"comparison_window":{"type":"string","title":"Comparison Window","description":"1w / 1m / 3m / 6m / 1y","default":"1m"}},"type":"object","title":"DeltaCalculateRequest"},"DeltaCalculateResponse":{"properties":{"created":{"type":"integer","title":"Created"},"comparison_window":{"type":"string","title":"Comparison Window"},"message":{"type":"string","title":"Message"}},"type":"object","required":["created","comparison_window","message"],"title":"DeltaCalculateResponse"},"DetailResponse":{"properties":{"id":{"type":"integer","title":"Id"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"district_name":{"type":"string","title":"District Name"},"bjd_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bjd Code"},"region_2depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 2Depth"},"region_3depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 3Depth"},"signal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal"},"signal_strength":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal Strength"},"frame":{"type":"string","title":"Frame"},"report_date":{"type":"string","title":"Report Date"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"wiki_note_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wiki Note Id"},"click_count":{"type":"integer","title":"Click Count"},"exposed_count":{"type":"integer","title":"Exposed Count"},"related_properties":{"items":{"$ref":"#/components/schemas/RelatedProperty"},"type":"array","title":"Related Properties"},"related_news":{"items":{"$ref":"#/components/schemas/RelatedNewsItem"},"type":"array","title":"Related News"}},"type":"object","required":["id","headline","district_name","bjd_code","region_2depth","region_3depth","signal","signal_strength","frame","report_date","summary","wiki_note_id","click_count","exposed_count","related_properties","related_news"],"title":"DetailResponse"},"DevelopmentLegalCard":{"properties":{"zoning_summary":{"type":"string","title":"Zoning Summary"},"road_width_check":{"type":"string","title":"Road Width Check"},"sunlight_regulation_check":{"type":"string","title":"Sunlight Regulation Check"},"building_permit_check":{"type":"string","title":"Building Permit Check"},"land_price_check":{"type":"string","title":"Land Price Check"},"required_documents":{"items":{"type":"string"},"type":"array","title":"Required Documents"}},"type":"object","required":["zoning_summary","road_width_check","sunlight_regulation_check","building_permit_check","land_price_check","required_documents"],"title":"DevelopmentLegalCard"},"DevelopmentLegalSourceCheckRequest":{"properties":{"probe":{"type":"boolean","title":"Probe","default":false},"log_failures":{"type":"boolean","title":"Log Failures","default":true},"sigungu_cd":{"type":"string","title":"Sigungu Cd","default":"11110"},"bjdong_cd":{"type":"string","title":"Bjdong Cd","default":"10100"},"pnu":{"type":"string","title":"Pnu","default":"1111010100100010000"},"start_ymd":{"type":"string","title":"Start Ymd","default":"20230101"},"end_ymd":{"type":"string","title":"End Ymd","default":"20230131"}},"type":"object","title":"DevelopmentLegalSourceCheckRequest"},"DiffLine":{"properties":{"tag":{"type":"string","enum":["added","removed","unchanged"],"title":"Tag"},"content":{"type":"string","title":"Content"}},"type":"object","required":["tag","content"],"title":"DiffLine"},"DistrictTop5Item":{"properties":{"district_name":{"type":"string","title":"District Name"},"bjd_code":{"type":"string","title":"Bjd Code"},"click_count":{"type":"integer","title":"Click Count"},"exposed_count":{"type":"integer","title":"Exposed Count"}},"type":"object","required":["district_name","bjd_code","click_count","exposed_count"],"title":"DistrictTop5Item"},"DistrictWatcherReportOut":{"properties":{"id":{"type":"integer","title":"Id"},"report_date":{"type":"string","format":"date","title":"Report Date"},"district_name":{"type":"string","title":"District Name"},"bjd_code":{"type":"string","title":"Bjd Code"},"signal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal"},"signal_strength":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal Strength"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"wiki_note_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wiki Note Id"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"frame":{"type":"string","title":"Frame"},"is_active":{"type":"boolean","title":"Is Active"},"click_count":{"type":"integer","title":"Click Count"},"exposed_count":{"type":"integer","title":"Exposed Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","report_date","district_name","bjd_code","signal","signal_strength","summary","wiki_note_id","headline","frame","is_active","click_count","exposed_count","created_at"],"title":"DistrictWatcherReportOut"},"DistrictWatcherSummaryOut":{"properties":{"period_days":{"type":"integer","title":"Period Days"},"total_reports":{"type":"integer","title":"Total Reports"},"signal_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Signal Counts"},"top5_by_clicks":{"items":{"$ref":"#/components/schemas/DistrictTop5Item"},"type":"array","title":"Top5 By Clicks"},"latest_report_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Latest Report Date"}},"type":"object","required":["period_days","total_reports","signal_counts","top5_by_clicks","latest_report_date"],"title":"DistrictWatcherSummaryOut"},"DocumentChunkCreate":{"properties":{"document_id":{"type":"integer","title":"Document Id"},"chunk_index":{"type":"integer","title":"Chunk Index"},"text":{"type":"string","title":"Text"},"token_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Token Count"},"embedding":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Embedding"}},"type":"object","required":["document_id","chunk_index","text"],"title":"DocumentChunkCreate"},"DocumentChunkOut":{"properties":{"id":{"type":"integer","title":"Id"},"document_id":{"type":"integer","title":"Document Id"},"chunk_index":{"type":"integer","title":"Chunk Index"},"text":{"type":"string","title":"Text"},"token_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Token Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","document_id","chunk_index","text","created_at"],"title":"DocumentChunkOut"},"DocumentCreate":{"properties":{"source_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Id"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","default":"ko"},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","default":"raw"}},"type":"object","required":["title"],"title":"DocumentCreate"},"DocumentDetailOut":{"properties":{"id":{"type":"integer","title":"Id"},"source_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Id"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"tags":{"items":{"$ref":"#/components/schemas/DocumentTagOut"},"type":"array","title":"Tags","default":[]}},"type":"object","required":["id","source_id","title","summary","url","published_at","language","doc_type","status","created_at"],"title":"DocumentDetailOut"},"DocumentOut":{"properties":{"id":{"type":"integer","title":"Id"},"source_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Id"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","source_id","title","summary","url","published_at","language","doc_type","status","created_at"],"title":"DocumentOut"},"DocumentTagCreate":{"properties":{"tag":{"type":"string","title":"Tag"},"topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topic Id"}},"type":"object","required":["tag"],"title":"DocumentTagCreate"},"DocumentTagOut":{"properties":{"id":{"type":"integer","title":"Id"},"document_id":{"type":"integer","title":"Document Id"},"topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topic Id"},"tag":{"type":"string","title":"Tag"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","document_id","topic_id","tag","created_at"],"title":"DocumentTagOut"},"DraftBasis":{"properties":{"source":{"type":"string","title":"Source"},"fallback_level":{"type":"integer","title":"Fallback Level"},"fallback_label":{"type":"string","title":"Fallback Label"},"case_count":{"type":"integer","title":"Case Count","default":0},"nearest_case_distance_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nearest Case Distance M"},"latest_case_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Case Date"},"data_confidence":{"type":"string","title":"Data Confidence"},"missing_fields":{"items":{"type":"string"},"type":"array","title":"Missing Fields"}},"type":"object","required":["source","fallback_level","fallback_label","data_confidence"],"title":"DraftBasis"},"DraftResponse":{"properties":{"address_name":{"type":"string","title":"Address Name"},"bjd_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bjd Code"},"region_2depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 2Depth"},"region_3depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 3Depth"},"values":{"$ref":"#/components/schemas/DraftValues"},"basis":{"$ref":"#/components/schemas/DraftBasis"}},"type":"object","required":["address_name","bjd_code","region_2depth","region_3depth","values","basis"],"title":"DraftResponse"},"DraftValues":{"properties":{"deal_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deal Amount","description":"매입가 (만원)"},"loan_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Loan Amount","description":"대출금 (만원)"},"monthly_rent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Rent","description":"월세 (만원)"},"deposit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deposit","description":"보증금 (만원)"},"interest_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Interest Rate","description":"금리 (%)"},"vacancy_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vacancy Rate","description":"공실률 (%)"},"renovation_cost":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Renovation Cost","description":"리모델링비 (만원)"},"equity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Equity","description":"자기자본 (만원)"},"operating_expense_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Operating Expense Rate","description":"운영비율 (%)"}},"type":"object","title":"DraftValues"},"EventCreate":{"properties":{"event_type":{"type":"string","title":"Event Type","description":"initial_input_submitted | followup_question_asked | input_value_changed | suggested_question_clicked | risk_card_opened | report_downloaded | analysis_saved | answer_ignored"},"event_payload_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Event Payload Json"}},"type":"object","required":["event_type"],"title":"EventCreate"},"EventOut":{"properties":{"id":{"type":"integer","title":"Id"},"session_id":{"type":"string","title":"Session Id"},"event_type":{"type":"string","title":"Event Type"},"event_payload_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Event Payload Json"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","session_id","event_type","event_payload_json","created_at"],"title":"EventOut"},"ExtractedFactRead":{"properties":{"id":{"type":"integer","title":"Id"},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"fact_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fact Type"},"fact_text":{"type":"string","title":"Fact Text"},"statement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statement"},"policy_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Area"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"impact_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Impact Target"},"impact_direction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Impact Direction"},"effective_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Effective Date"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"verified":{"type":"boolean","title":"Verified","default":false},"verified_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verified By"},"verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Verified At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","document_id","fact_type","fact_text","region_code","impact_target","impact_direction","effective_date","confidence","created_at"],"title":"ExtractedFactRead"},"ExtractedFactUpdate":{"properties":{"statement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statement"},"policy_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Area"},"confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Confidence"},"verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Verified"},"verified_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verified By"}},"type":"object","title":"ExtractedFactUpdate"},"ExtractedFactUpdateResponse":{"properties":{"fact":{"$ref":"#/components/schemas/ExtractedFactRead"},"recalculated_signal_ids":{"items":{"type":"integer"},"type":"array","title":"Recalculated Signal Ids","description":"이번 Fact 수정으로 confidence_score가 재계산된 WikiSignal ID 목록"}},"type":"object","required":["fact"],"title":"ExtractedFactUpdateResponse"},"FactExtractResponse":{"properties":{"document_id":{"type":"integer","title":"Document Id"},"extracted":{"type":"integer","title":"Extracted"},"message":{"type":"string","title":"Message"}},"type":"object","required":["document_id","extracted","message"],"title":"FactExtractResponse"},"FactReviewLogRead":{"properties":{"id":{"type":"integer","title":"Id"},"fact_id":{"type":"integer","title":"Fact Id"},"changed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changed By"},"changed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Changed At"},"field_name":{"type":"string","title":"Field Name"},"old_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Old Value"},"new_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Value"}},"type":"object","required":["id","fact_id","changed_by","changed_at","field_name","old_value","new_value"],"title":"FactReviewLogRead"},"FactReviewStats":{"properties":{"total":{"type":"integer","title":"Total","description":"조건에 해당하는 전체 Fact 수"},"verified_count":{"type":"integer","title":"Verified Count","description":"검수 완료 Fact 수"},"unverified_count":{"type":"integer","title":"Unverified Count","description":"미검수 Fact 수"},"verified_by_breakdown":{"additionalProperties":{"type":"integer"},"type":"object","title":"Verified By Breakdown","description":"검수자별 검수 완료 Fact 수 (검수자 식별자 → 건수)"},"avg_confidence_before":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Confidence Before","description":"미검수 Fact의 평균 confidence (검수 전 상태)"},"avg_confidence_after":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Confidence After","description":"검수 완료 Fact의 평균 confidence (검수 후 상태)"}},"type":"object","required":["total","verified_count","unverified_count"],"title":"FactReviewStats"},"FeasibilityCard":{"properties":{"expected_deposit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Deposit"},"expected_monthly_rent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Monthly Rent"},"expected_noi":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Noi"},"vacancy_adjusted_noi":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vacancy Adjusted Noi"},"dscr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dscr","description":"부채상환비율 (NOI / 연간 원리금 상환액). 1.2 이상이면 양호, 1.5 이상이면 우수. 소수 둘째 자리까지 표시 (예: 1.21).","examples":[1.21]},"breakeven_comment":{"type":"string","title":"Breakeven Comment"}},"type":"object","required":["expected_deposit","expected_monthly_rent","expected_noi","vacancy_adjusted_noi","breakeven_comment"],"title":"FeasibilityCard"},"FeedbackLoopStats":{"properties":{"total_sessions":{"type":"integer","title":"Total Sessions"},"total_messages":{"type":"integer","title":"Total Messages"},"total_runs":{"type":"integer","title":"Total Runs"},"intent_distribution":{"items":{"$ref":"#/components/schemas/IntentStat"},"type":"array","title":"Intent Distribution"},"top_wiki_notes_used":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Wiki Notes Used"},"wiki_gaps":{"items":{"$ref":"#/components/schemas/WikiGapEntry"},"type":"array","title":"Wiki Gaps"},"period_days":{"type":"integer","title":"Period Days"}},"type":"object","required":["total_sessions","total_messages","total_runs","intent_distribution","top_wiki_notes_used","wiki_gaps","period_days"],"title":"FeedbackLoopStats"},"FileBackBlock":{"properties":{"saved":{"type":"boolean","title":"Saved"},"insight_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Insight Id"}},"type":"object","required":["saved","insight_id"],"title":"FileBackBlock"},"FinancingCard":{"properties":{"estimated_ltv_range":{"type":"string","title":"Estimated Ltv Range"},"estimated_interest_rate_range":{"type":"string","title":"Estimated Interest Rate Range"},"required_equity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Required Equity"},"monthly_interest_burden_range":{"type":"string","title":"Monthly Interest Burden Range"},"bankability_comment":{"type":"string","title":"Bankability Comment"},"recommended_financing_strategy":{"type":"string","title":"Recommended Financing Strategy"}},"type":"object","required":["estimated_ltv_range","estimated_interest_rate_range","required_equity","monthly_interest_burden_range","bankability_comment","recommended_financing_strategy"],"title":"FinancingCard"},"FindingResolveRequest":{"properties":{"resolution":{"type":"string","title":"Resolution","description":"fixed / ignored","default":"fixed"}},"type":"object","title":"FindingResolveRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IndustryCreate":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"name":{"type":"string","title":"Name"},"category_l1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category L1"},"category_l2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category L2"}},"type":"object","required":["name"],"title":"IndustryCreate"},"IndustryOut":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"name":{"type":"string","title":"Name"},"category_l1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category L1"},"category_l2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category L2"},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["name","id","created_at"],"title":"IndustryOut"},"InferenceRuleRead":{"properties":{"id":{"type":"integer","title":"Id"},"rule_name":{"type":"string","title":"Rule Name"},"rule_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rule Category"},"input_conditions":{"additionalProperties":true,"type":"object","title":"Input Conditions"},"output_interpretation":{"type":"string","title":"Output Interpretation"},"recommended_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommended Action"},"confidence_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confidence Level"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","rule_name","rule_category","input_conditions","output_interpretation","recommended_action","confidence_level","is_active","created_at"],"title":"InferenceRuleRead"},"IngestionJobCreate":{"properties":{"source_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Id"},"job_type":{"type":"string","title":"Job Type"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","default":"pending"},"payload":{"anyOf":[{},{"type":"null"}],"title":"Payload"}},"type":"object","required":["job_type"],"title":"IngestionJobCreate"},"IngestionJobOut":{"properties":{"id":{"type":"integer","title":"Id"},"source_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Id"},"job_type":{"type":"string","title":"Job Type"},"status":{"type":"string","title":"Status"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"items_collected":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Items Collected"},"payload":{"anyOf":[{},{"type":"null"}],"title":"Payload"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","source_id","job_type","status","started_at","finished_at","items_collected","payload","created_at"],"title":"IngestionJobOut"},"InputsEcho":{"properties":{"purchase_price_uk":{"type":"number","title":"Purchase Price Uk"},"loan_amount_uk":{"type":"number","title":"Loan Amount Uk"},"interest_rate_pct":{"type":"number","title":"Interest Rate Pct"},"monthly_rent_manwon":{"type":"number","title":"Monthly Rent Manwon"},"deposit_manwon":{"type":"number","title":"Deposit Manwon"},"vacancy_rate_pct":{"type":"number","title":"Vacancy Rate Pct"},"construction_condition":{"type":"string","title":"Construction Condition"},"target_gfa_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Gfa M2"},"construction_cost_per_m2_manwon":{"type":"number","title":"Construction Cost Per M2 Manwon"},"elevator_option":{"type":"string","title":"Elevator Option"}},"type":"object","required":["purchase_price_uk","loan_amount_uk","interest_rate_pct","monthly_rent_manwon","deposit_manwon","vacancy_rate_pct","construction_condition","target_gfa_m2","construction_cost_per_m2_manwon","elevator_option"],"title":"InputsEcho"},"InsightCard":{"properties":{"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"},"value":{"type":"string","title":"Value"},"subtitle":{"type":"string","title":"Subtitle"},"tone":{"type":"string","title":"Tone"},"popover":{"type":"string","title":"Popover"}},"type":"object","required":["key","title","value","subtitle","tone","popover"],"title":"InsightCard"},"InsightReportGenerateRequest":{"properties":{"signal_ids":{"items":{"type":"integer"},"type":"array","title":"Signal Ids"},"report_type":{"type":"string","title":"Report Type","default":"weekly_signal"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"}},"type":"object","title":"InsightReportGenerateRequest"},"InsightReportRead":{"properties":{"id":{"type":"integer","title":"Id"},"report_title":{"type":"string","title":"Report Title"},"report_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Report Type"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"pnu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"conclusion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conclusion"},"recommended_actions":{"anyOf":[{},{"type":"null"}],"title":"Recommended Actions"},"source_signals":{"anyOf":[{},{"type":"null"}],"title":"Source Signals"},"is_paid":{"type":"boolean","title":"Is Paid"},"price":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","report_title","report_type","region_code","pnu","summary","conclusion","recommended_actions","source_signals","is_paid","price","created_at"],"title":"InsightReportRead"},"InsightSections":{"properties":{"positive_points":{"items":{"type":"string"},"type":"array","title":"Positive Points"},"caution_points":{"items":{"type":"string"},"type":"array","title":"Caution Points"},"conditions_for_success":{"items":{"type":"string"},"type":"array","title":"Conditions For Success"},"items_to_verify":{"items":{"type":"string"},"type":"array","title":"Items To Verify"}},"type":"object","required":["positive_points","caution_points","conditions_for_success","items_to_verify"],"title":"InsightSections"},"IntentStat":{"properties":{"intent_type":{"type":"string","title":"Intent Type"},"count":{"type":"integer","title":"Count"},"pct":{"type":"number","title":"Pct"}},"type":"object","required":["intent_type","count","pct"],"title":"IntentStat"},"InvestorProfileCreate":{"properties":{"investor_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investor Type"},"owns_income_property":{"type":"boolean","title":"Owns Income Property","default":false},"owned_property_count":{"type":"integer","title":"Owned Property Count","default":0},"estimated_real_estate_aum_range":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Real Estate Aum Range"},"available_equity_range":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Available Equity Range"},"target_investment_size_range":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Investment Size Range"},"preferred_regions":{"anyOf":[{},{"type":"null"}],"title":"Preferred Regions"},"preferred_asset_types":{"anyOf":[{},{"type":"null"}],"title":"Preferred Asset Types"},"investment_goals":{"anyOf":[{},{"type":"null"}],"title":"Investment Goals"},"financing_need_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Financing Need Level"},"wants_bank_report":{"type":"boolean","title":"Wants Bank Report","default":false},"investor_metadata":{"anyOf":[{},{"type":"null"}],"title":"Investor Metadata"}},"type":"object","title":"InvestorProfileCreate"},"InvestorProfileRead":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"investor_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investor Type"},"owns_income_property":{"type":"boolean","title":"Owns Income Property"},"owned_property_count":{"type":"integer","title":"Owned Property Count"},"estimated_real_estate_aum_range":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Real Estate Aum Range"},"available_equity_range":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Available Equity Range"},"target_investment_size_range":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Investment Size Range"},"preferred_regions":{"anyOf":[{},{"type":"null"}],"title":"Preferred Regions"},"preferred_asset_types":{"anyOf":[{},{"type":"null"}],"title":"Preferred Asset Types"},"investment_goals":{"anyOf":[{},{"type":"null"}],"title":"Investment Goals"},"financing_need_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Financing Need Level"},"wants_bank_report":{"type":"boolean","title":"Wants Bank Report"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","investor_type","owns_income_property","owned_property_count","estimated_real_estate_aum_range","available_equity_range","target_investment_size_range","preferred_regions","preferred_asset_types","investment_goals","financing_need_level","wants_bank_report","created_at","updated_at"],"title":"InvestorProfileRead"},"KPIs":{"properties":{"noi_manwon":{"type":"number","title":"Noi Manwon"},"dscr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dscr"},"ltv_pct":{"type":"number","title":"Ltv Pct"},"cap_rate_pct":{"type":"number","title":"Cap Rate Pct"},"annual_debt_service_manwon":{"type":"number","title":"Annual Debt Service Manwon"},"monthly_debt_service_manwon":{"type":"number","title":"Monthly Debt Service Manwon"},"annual_gross_rent_manwon":{"type":"number","title":"Annual Gross Rent Manwon"},"vacancy_loss_manwon":{"type":"number","title":"Vacancy Loss Manwon"},"operating_expense_manwon":{"type":"number","title":"Operating Expense Manwon"}},"type":"object","required":["noi_manwon","dscr","ltv_pct","cap_rate_pct","annual_debt_service_manwon","monthly_debt_service_manwon","annual_gross_rent_manwon","vacancy_loss_manwon","operating_expense_manwon"],"title":"KPIs"},"KnowledgeNoteCreate":{"properties":{"topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topic Id"},"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","default":"draft"}},"type":"object","required":["title","content"],"title":"KnowledgeNoteCreate"},"KnowledgeNoteOut":{"properties":{"id":{"type":"integer","title":"Id"},"topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topic Id"},"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"},"status":{"type":"string","title":"Status"},"freshness_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Freshness Status","default":"fresh"},"last_compiled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Compiled At"},"source_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Count","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","topic_id","title","content","status","created_at","updated_at"],"title":"KnowledgeNoteOut"},"KnowledgeNoteUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"freshness_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Freshness Status"},"change_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Summary"}},"type":"object","title":"KnowledgeNoteUpdate"},"KosisSyncRequest":{"properties":{"region_code":{"type":"string","title":"Region Code","default":"11110"},"start_prd_de":{"type":"string","title":"Start Prd De","default":"2025"},"end_prd_de":{"type":"string","title":"End Prd De","default":"2026"}},"type":"object","title":"KosisSyncRequest"},"LintFindingRead":{"properties":{"id":{"type":"integer","title":"Id"},"lint_job_id":{"type":"integer","title":"Lint Job Id"},"finding_type":{"type":"string","title":"Finding Type"},"severity":{"type":"string","title":"Severity"},"target_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Type"},"target_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Target Id"},"finding_summary":{"type":"string","title":"Finding Summary"},"suggested_fix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Fix"},"status":{"type":"string","title":"Status"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"}},"type":"object","required":["id","lint_job_id","finding_type","severity","target_type","target_id","finding_summary","suggested_fix","status","created_at","resolved_at"],"title":"LintFindingRead"},"LintJobRead":{"properties":{"id":{"type":"integer","title":"Id"},"job_type":{"type":"string","title":"Job Type"},"status":{"type":"string","title":"Status"},"scope_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Scope Json"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"findings_count":{"type":"integer","title":"Findings Count"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","job_type","status","scope_json","started_at","finished_at","findings_count","error_message","created_at"],"title":"LintJobRead"},"LintRunRequest":{"properties":{"job_type":{"type":"string","title":"Job Type","description":"stale_claim_check / missing_source_check / weak_insight_check / orphan_signal_check / outdated_finance_rate_check / full_wiki_health_check","default":"full_wiki_health_check"},"scope":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Scope"}},"type":"object","title":"LintRunRequest"},"LoginRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"MaintenanceLogRead":{"properties":{"id":{"type":"integer","title":"Id"},"event_type":{"type":"string","title":"Event Type"},"event_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Title"},"event_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Summary"},"reference_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Type"},"reference_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reference Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","event_type","event_title","event_summary","reference_type","reference_id","created_at"],"title":"MaintenanceLogRead"},"MapMarker":{"properties":{"id":{"type":"string","title":"Id"},"address":{"type":"string","title":"Address"},"short_address":{"type":"string","title":"Short Address"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"land_area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Land Area M2"},"gfa_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gfa M2"},"price_uk":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Uk"},"label":{"type":"string","title":"Label"},"is_subject":{"type":"boolean","title":"Is Subject","default":false}},"type":"object","required":["id","address","short_address","lat","lng","land_area_m2","gfa_m2","price_uk","label"],"title":"MapMarker"},"MapPropertiesResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MapMarker"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"MapPropertiesResponse"},"MarketCard":{"properties":{"floating_population_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Floating Population Summary"},"household_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Household Summary"},"competing_industry_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Competing Industry Summary"},"rent_demand_comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rent Demand Comment"},"market_interpretation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Interpretation"},"sigungu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sigungu"},"period_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Period Months"},"data_available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Data Available"},"commercial_sale":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Commercial Sale"},"row_house_sale":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Row House Sale"},"rent":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rent"},"recent_transactions":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Recent Transactions"}},"type":"object","title":"MarketCard"},"MarketInfo":{"properties":{"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords"},"strength":{"type":"string","title":"Strength"},"description":{"type":"string","title":"Description"}},"type":"object","required":["keywords","strength","description"],"title":"MarketInfo"},"MembershipRead":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"membership_level":{"type":"string","title":"Membership Level"},"status":{"type":"string","title":"Status"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"benefits":{"anyOf":[{},{"type":"null"}],"title":"Benefits"}},"type":"object","required":["id","user_id","membership_level","status","started_at","expires_at","source","benefits"],"title":"MembershipRead"},"MessageCreate":{"properties":{"role":{"type":"string","title":"Role","description":"user | assistant | system"},"message_text_raw":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Text Raw","description":"원문 (민감정보 포함 가능 — 서버 정책에 따라 저장 여부 결정)"},"message_text_redacted":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Text Redacted","description":"개인정보/금액/주소 제거 버전"},"intent_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intent Type","description":"intent 종류. 가능한 값: price_check, loan_check, cashflow_sensitivity, risk_check, policy_check, market_context, transaction_compare, negotiation_logic, due_diligence, bank_package, remodeling_upside, hold_or_go, explain_result, other"},"entities":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Entities"},"referenced_property_fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Referenced Property Fields"},"conversation_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Status"}},"type":"object","required":["role"],"title":"MessageCreate"},"MessageOut":{"properties":{"id":{"type":"integer","title":"Id"},"session_id":{"type":"string","title":"Session Id"},"role":{"type":"string","title":"Role"},"message_text_redacted":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Text Redacted"},"intent_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intent Type"},"intent_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Intent Confidence"},"entities":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Entities"},"conversation_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","session_id","role","message_text_redacted","intent_type","intent_confidence","entities","conversation_status","created_at"],"title":"MessageOut"},"MetricCatalogUpsertRequest":{"properties":{"metric_key":{"type":"string","title":"Metric Key"},"metric_name_ko":{"type":"string","title":"Metric Name Ko"},"category_code":{"type":"string","title":"Category Code"},"category_name":{"type":"string","title":"Category Name"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"collection_frequency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Collection Frequency","default":"daily"},"data_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Source"},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority","default":3},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"source_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Key"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint"},"request_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Method","default":"GET"},"request_params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Request Params"},"response_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Path"},"value_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Path"},"entity_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Path"},"period_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Path"},"transform_rule":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Transform Rule"},"auto_collect":{"type":"boolean","title":"Auto Collect","default":true}},"type":"object","required":["metric_key","metric_name_ko","category_code","category_name"],"title":"MetricCatalogUpsertRequest"},"MetricDeltaRead":{"properties":{"id":{"type":"integer","title":"Id"},"metric_key":{"type":"string","title":"Metric Key"},"metric_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Category"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"comparison_window":{"type":"string","title":"Comparison Window"},"current_period_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Current Period Start"},"previous_period_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Previous Period Start"},"current_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current Value"},"previous_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Previous Value"},"delta_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Value"},"delta_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Percent"},"direction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Direction"},"significance_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Significance Level"},"interpretation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interpretation"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","metric_key","metric_category","region_code","comparison_window","current_period_start","previous_period_start","current_value","previous_value","delta_value","delta_percent","direction","significance_level","interpretation","created_at"],"title":"MetricDeltaRead"},"MetricSnapshotPage":{"properties":{"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_pages":{"type":"integer","title":"Total Pages"},"items":{"items":{"$ref":"#/components/schemas/MetricSnapshotRead"},"type":"array","title":"Items"}},"type":"object","required":["total","page","page_size","total_pages","items"],"title":"MetricSnapshotPage"},"MetricSnapshotRead":{"properties":{"id":{"type":"integer","title":"Id"},"metric_key":{"type":"string","title":"Metric Key"},"metric_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Category"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"pnu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"},"commercial_area_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Commercial Area Id"},"asset_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type Code"},"period_type":{"type":"string","title":"Period Type"},"period_start":{"type":"string","format":"date","title":"Period Start"},"period_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period End"},"value_numeric":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Numeric"},"value_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Value Json"},"source_table":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Table"},"source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Name"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","metric_key","metric_category","region_code","pnu","commercial_area_id","asset_type_code","period_type","period_start","period_end","value_numeric","value_json","source_table","source_name","confidence","created_at"],"title":"MetricSnapshotRead"},"MobileCardAnalysisResponse":{"properties":{"request_id":{"type":"integer","title":"Request Id"},"result_id":{"type":"integer","title":"Result Id"},"result_version":{"type":"string","title":"Result Version"},"conclusion_card":{"$ref":"#/components/schemas/ConclusionCard"},"score_cards":{"$ref":"#/components/schemas/ScoreCards"},"financing_card":{"$ref":"#/components/schemas/FinancingCard"},"feasibility_card":{"$ref":"#/components/schemas/FeasibilityCard"},"market_card":{"$ref":"#/components/schemas/MarketCard"},"development_legal_card":{"$ref":"#/components/schemas/DevelopmentLegalCard"},"insight_sections":{"$ref":"#/components/schemas/InsightSections"},"action_card":{"$ref":"#/components/schemas/ActionCard"},"timeseries_summary":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Timeseries Summary"},"timeseries_available":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Timeseries Available"},"wiki_context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Wiki Context"},"delta_engine":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Delta Engine"}},"type":"object","required":["request_id","result_id","result_version","conclusion_card","score_cards","financing_card","feasibility_card","market_card","development_legal_card","insight_sections","action_card"],"title":"MobileCardAnalysisResponse"},"MolitSyncRequest":{"properties":{"lawd_cd":{"type":"string","title":"Lawd Cd","default":"11110"},"deal_ymd":{"type":"string","title":"Deal Ymd","default":"202604"},"asset_type":{"type":"string","title":"Asset Type","default":"apartment"}},"type":"object","title":"MolitSyncRequest"},"NearbyTransactionRow":{"properties":{"date":{"type":"string","title":"Date"},"location":{"type":"string","title":"Location"},"area_m2":{"type":"number","title":"Area M2"},"price_uk":{"type":"number","title":"Price Uk"},"price_per_m2_manwon":{"type":"number","title":"Price Per M2 Manwon"},"type":{"type":"string","title":"Type"}},"type":"object","required":["date","location","area_m2","price_uk","price_per_m2_manwon","type"],"title":"NearbyTransactionRow"},"NearbyTransactionsResponse":{"properties":{"sigungu":{"type":"string","title":"Sigungu"},"period_months":{"type":"integer","title":"Period Months"},"data_available":{"type":"boolean","title":"Data Available"},"commercial_sale_count":{"type":"integer","title":"Commercial Sale Count"},"commercial_sale_avg_억":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Commercial Sale Avg 억"},"commercial_sale_avg_per_m2_만":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Commercial Sale Avg Per M2 만"},"row_house_sale_count":{"type":"integer","title":"Row House Sale Count"},"row_house_sale_avg_억":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Row House Sale Avg 억"},"rent_count":{"type":"integer","title":"Rent Count"},"rent_avg_monthly_만":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Avg Monthly 만"},"recent_transactions":{"items":{"$ref":"#/components/schemas/TransactionItem"},"type":"array","title":"Recent Transactions"},"market_interpretation":{"type":"string","title":"Market Interpretation"}},"type":"object","required":["sigungu","period_months","data_available","commercial_sale_count","commercial_sale_avg_억","commercial_sale_avg_per_m2_만","row_house_sale_count","row_house_sale_avg_억","rent_count","rent_avg_monthly_만","recent_transactions","market_interpretation"],"title":"NearbyTransactionsResponse"},"NearbyTransactionsTableResponse":{"properties":{"sigungu":{"type":"string","title":"Sigungu"},"rows":{"items":{"$ref":"#/components/schemas/NearbyTransactionRow"},"type":"array","title":"Rows"},"total_count":{"type":"integer","title":"Total Count"},"data_available":{"type":"boolean","title":"Data Available"}},"type":"object","required":["sigungu","rows","total_count","data_available"],"title":"NearbyTransactionsTableResponse"},"NormalizedAddress":{"properties":{"road_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Road Address"},"jibun_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jibun Address"},"adm_cd":{"type":"string","title":"Adm Cd"},"sigungu_cd":{"type":"string","title":"Sigungu Cd"},"bjdong_cd":{"type":"string","title":"Bjdong Cd"},"mt_yn":{"type":"string","title":"Mt Yn"},"bun":{"type":"string","title":"Bun"},"ji":{"type":"string","title":"Ji"},"pnu":{"type":"string","title":"Pnu"},"building_management_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Management No"}},"type":"object","required":["road_address","jibun_address","adm_cd","sigungu_cd","bjdong_cd","mt_yn","bun","ji","pnu"],"title":"NormalizedAddress"},"NoteDiffOut":{"properties":{"note_id":{"type":"integer","title":"Note Id"},"base_version_no":{"type":"integer","title":"Base Version No"},"compare_version_no":{"type":"integer","title":"Compare Version No"},"base_content_preview":{"type":"string","title":"Base Content Preview"},"compare_content_preview":{"type":"string","title":"Compare Content Preview"},"lines":{"items":{"$ref":"#/components/schemas/DiffLine"},"type":"array","title":"Lines"},"added_count":{"type":"integer","title":"Added Count"},"removed_count":{"type":"integer","title":"Removed Count"},"unchanged_count":{"type":"integer","title":"Unchanged Count"}},"type":"object","required":["note_id","base_version_no","compare_version_no","base_content_preview","compare_content_preview","lines","added_count","removed_count","unchanged_count"],"title":"NoteDiffOut"},"NoteVersionOut":{"properties":{"id":{"type":"integer","title":"Id"},"note_id":{"type":"integer","title":"Note Id"},"version_no":{"type":"integer","title":"Version No"},"content":{"type":"string","title":"Content"},"change_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Summary"},"source_document_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Source Document Ids"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","note_id","version_no","content","created_at"],"title":"NoteVersionOut"},"OpsLogOut":{"properties":{"id":{"type":"integer","title":"Id"},"job_id":{"type":"string","title":"Job Id"},"job_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Name"},"status":{"type":"string","title":"Status"},"ran_at":{"type":"string","format":"date-time","title":"Ran At"},"items_upserted":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Items Upserted"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","job_id","job_name","status","ran_at","items_upserted","message","created_at"],"title":"OpsLogOut"},"PageRegistryRead":{"properties":{"id":{"type":"integer","title":"Id"},"page_key":{"type":"string","title":"Page Key"},"page_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Type"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"pnu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"},"asset_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type Code"},"linked_insight_ids":{"anyOf":[{},{"type":"null"}],"title":"Linked Insight Ids"},"linked_signal_ids":{"anyOf":[{},{"type":"null"}],"title":"Linked Signal Ids"},"source_count":{"type":"integer","title":"Source Count"},"freshness_status":{"type":"string","title":"Freshness Status"},"last_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","page_key","page_type","title","summary","region_code","pnu","asset_type_code","linked_insight_ids","linked_signal_ids","source_count","freshness_status","last_updated_at","created_at"],"title":"PageRegistryRead"},"PermissionRead":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"permission_key":{"type":"string","title":"Permission Key"},"granted_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted By"},"granted_at":{"type":"string","format":"date-time","title":"Granted At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["id","user_id","permission_key","granted_by","granted_at","expires_at"],"title":"PermissionRead"},"PreviewImage":{"properties":{"image_url":{"type":"string","title":"Image Url"},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"}},"type":"object","required":["image_url"],"title":"PreviewImage"},"PreviewInputItem":{"properties":{"field":{"type":"string","title":"Field"},"value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Value"}},"type":"object","required":["field","value"],"title":"PreviewInputItem"},"PreviewResponse":{"properties":{"score_delta":{"type":"integer","title":"Score Delta"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["score_delta","reason"],"title":"PreviewResponse"},"PreviousAnalysis":{"properties":{"bankability_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bankability Score"},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade"},"ltv":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ltv"},"noi":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Noi"},"dscr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dscr"}},"type":"object","title":"PreviousAnalysis","description":"이전 분석 결과 요약 (점수 변화 코멘트 생성용). 프론트엔드가 선택적으로 전달."},"ProcessingQueueCreate":{"properties":{"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"task_type":{"type":"string","title":"Task Type"},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority","default":100},"payload":{"anyOf":[{},{"type":"null"}],"title":"Payload"}},"type":"object","required":["task_type"],"title":"ProcessingQueueCreate"},"ProcessingQueueOut":{"properties":{"id":{"type":"integer","title":"Id"},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"task_type":{"type":"string","title":"Task Type"},"status":{"type":"string","title":"Status"},"priority":{"type":"integer","title":"Priority"},"payload":{"anyOf":[{},{"type":"null"}],"title":"Payload"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","document_id","task_type","status","priority","payload","error_message","created_at","updated_at"],"title":"ProcessingQueueOut"},"ProcessingQueueStatus":{"properties":{"total":{"type":"integer","title":"Total"},"done":{"type":"integer","title":"Done"},"queued":{"type":"integer","title":"Queued"},"failed":{"type":"integer","title":"Failed"},"by_task_type":{"additionalProperties":true,"type":"object","title":"By Task Type"}},"type":"object","required":["total","done","queued","failed","by_task_type"],"title":"ProcessingQueueStatus"},"PropertyMeta":{"properties":{"address":{"type":"string","title":"Address"},"short_address":{"type":"string","title":"Short Address"},"pnu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"sigungu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sigungu"},"dong":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dong"},"zoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zoning"},"legal_bcr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Legal Bcr"},"legal_far":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Legal Far"},"land_area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Land Area M2"},"adjacent_road_width_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Adjacent Road Width M"},"road_widening_risk":{"type":"boolean","title":"Road Widening Risk"}},"type":"object","required":["address","short_address","pnu","lat","lng","sigungu","dong","zoning","legal_bcr","legal_far","land_area_m2","adjacent_road_width_m","road_widening_risk"],"title":"PropertyMeta"},"QueryRequest":{"properties":{"question":{"type":"string","title":"Question"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"pnu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"},"asset_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type Code"},"industry_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry Code"},"time_horizon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Horizon"},"auto_file_back":{"type":"boolean","title":"Auto File Back","default":true}},"type":"object","required":["question"],"title":"QueryRequest"},"QueryResponse":{"properties":{"query_id":{"type":"integer","title":"Query Id"},"result_id":{"type":"integer","title":"Result Id"},"answer":{"$ref":"#/components/schemas/AnswerBlock"},"used_context":{"$ref":"#/components/schemas/UsedContextBlock"},"file_back":{"$ref":"#/components/schemas/FileBackBlock"},"upsell":{"$ref":"#/components/schemas/UpsellBlock"}},"type":"object","required":["query_id","result_id","answer","used_context","file_back","upsell"],"title":"QueryResponse"},"RecentAnalysis":{"properties":{"requested_at":{"type":"string","format":"date-time","title":"Requested At"},"input_type":{"type":"string","title":"Input Type"},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade"},"bankability_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bankability Score"},"response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time Ms"}},"type":"object","required":["requested_at","input_type","grade","bankability_score","response_time_ms"],"title":"RecentAnalysis"},"RegionAutocompleteResult":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"행정동 코드 (법정동 코드 10자리 등)"},"sido":{"type":"string","title":"Sido","description":"시/도명. 예) 서울특별시"},"sigungu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sigungu","description":"시/군/구명. sido 계층이면 null. 예) 마포구"},"dong":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dong","description":"읍/면/동명. sido·sigungu 계층이면 null. 예) 신수동"},"full_name":{"type":"string","title":"Full Name","description":"level별 전체 지명 문자열. sido: '서울특별시' / sigungu: '서울특별시 마포구' / dong: '서울특별시 마포구 신수동'"},"level":{"type":"string","enum":["sido","sigungu","dong"],"title":"Level","description":"계층 구분. sigungu·dong이 null이면 sido, dong만 null이면 sigungu, 모두 있으면 dong."}},"type":"object","required":["sido","full_name","level"],"title":"RegionAutocompleteResult","description":"자동완성 검색 결과 한 건.\n\n``full_name`` 구성 방식 (level별):\n\n- **sido**: ``sido`` 만으로 구성. 예) ``\"서울특별시\"``\n- **sigungu**: ``sido + \" \" + sigungu``. 예) ``\"서울특별시 마포구\"``\n- **dong**: ``sido + \" \" + sigungu + \" \" + dong``. 예) ``\"서울특별시 마포구 신수동\"``"},"RegisterRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"user_type":{"type":"string","title":"User Type","default":"individual"},"marketing_agreed":{"type":"boolean","title":"Marketing Agreed","default":false}},"type":"object","required":["email","password"],"title":"RegisterRequest","description":"회원가입 (이메일 + 비밀번호 필수)."},"RelatedNewsItem":{"properties":{"id":{"type":"integer","title":"Id"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"signal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal"},"district_name":{"type":"string","title":"District Name"},"report_date":{"type":"string","title":"Report Date"}},"type":"object","required":["id","headline","signal","district_name","report_date"],"title":"RelatedNewsItem"},"RelatedProperty":{"properties":{"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"deal_type":{"type":"string","title":"Deal Type"},"deal_date":{"type":"string","title":"Deal Date"},"area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area M2"},"deal_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deal Amount"}},"type":"object","required":["address","deal_type","deal_date","area_m2","deal_amount"],"title":"RelatedProperty"},"RoadmapUpdateBody":{"properties":{"section_title":{"type":"string","title":"Section Title"},"item_text":{"type":"string","title":"Item Text"},"completed":{"type":"boolean","title":"Completed"},"completed_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed Date"}},"type":"object","required":["section_title","item_text","completed"],"title":"RoadmapUpdateBody"},"RuleSeedResponse":{"properties":{"seeded":{"type":"integer","title":"Seeded"},"message":{"type":"string","title":"Message"}},"type":"object","required":["seeded","message"],"title":"RuleSeedResponse"},"RunCreate":{"properties":{"trigger_message_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Trigger Message Id"},"input_snapshot_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input Snapshot Json"},"output_snapshot_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Output Snapshot Json"},"ltv":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ltv"},"dscr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dscr"},"noi":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Noi"},"cap_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cap Rate"},"bankability_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bankability Score"},"deal_signal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deal Signal"},"overall_grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Overall Grade"},"risk_flags_json":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Risk Flags Json"},"wiki_note_ids_used":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Wiki Note Ids Used"}},"type":"object","title":"RunCreate"},"RunOut":{"properties":{"id":{"type":"integer","title":"Id"},"session_id":{"type":"string","title":"Session Id"},"trigger_message_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Trigger Message Id"},"ltv":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ltv"},"dscr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dscr"},"noi":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Noi"},"cap_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cap Rate"},"bankability_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bankability Score"},"deal_signal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deal Signal"},"overall_grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Overall Grade"},"wiki_note_ids_used":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Wiki Note Ids Used"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","session_id","trigger_message_id","ltv","dscr","noi","cap_rate","bankability_score","deal_signal","overall_grade","wiki_note_ids_used","created_at"],"title":"RunOut"},"SampleInputs":{"properties":{"deal_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deal Amount","description":"매입가 추정 (원)"},"equity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Equity","description":"자기자본 추정 (원, deal_amount의 40%)"},"interest_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Interest Rate","description":"대출 금리 (소수, 예: 0.05)"},"monthly_rent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Rent","description":"월세 추정 (원)"},"deposit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deposit","description":"보증금 추정 (원)"},"vacancy_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vacancy Rate","description":"공실률 (소수, 예: 0.10)"}},"type":"object","title":"SampleInputs"},"SavedInsightRead":{"properties":{"id":{"type":"integer","title":"Id"},"insight_title":{"type":"string","title":"Insight Title"},"insight_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Insight Type"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"pnu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"},"asset_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type Code"},"summary":{"type":"string","title":"Summary"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"conclusion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conclusion"},"recommended_actions":{"anyOf":[{},{"type":"null"}],"title":"Recommended Actions"},"source_query_result_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Query Result Id"},"confidence_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Confidence Score"},"freshness_status":{"type":"string","title":"Freshness Status"},"last_linted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Linted At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","insight_title","insight_type","region_code","pnu","asset_type_code","summary","body","conclusion","recommended_actions","source_query_result_id","confidence_score","freshness_status","last_linted_at","created_at","updated_at"],"title":"SavedInsightRead"},"ScenarioRead":{"properties":{"id":{"type":"integer","title":"Id"},"scenario_name":{"type":"string","title":"Scenario Name"},"scenario_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scenario Type"},"trigger_conditions":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Trigger Conditions"},"affected_asset_types":{"anyOf":[{},{"type":"null"}],"title":"Affected Asset Types"},"affected_regions":{"anyOf":[{},{"type":"null"}],"title":"Affected Regions"},"expected_impacts":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Expected Impacts"},"recommended_strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommended Strategy"},"risk_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Risk Notes"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","scenario_name","scenario_type","trigger_conditions","affected_asset_types","affected_regions","expected_impacts","recommended_strategy","risk_notes","is_active","created_at"],"title":"ScenarioRead"},"ScenarioSeedResponse":{"properties":{"seeded":{"type":"integer","title":"Seeded"},"message":{"type":"string","title":"Message"}},"type":"object","required":["seeded","message"],"title":"ScenarioSeedResponse"},"SchedulerJobStatus":{"properties":{"job_id":{"type":"string","title":"Job Id"},"name":{"type":"string","title":"Name"},"trigger_type":{"type":"string","title":"Trigger Type"},"interval_description":{"type":"string","title":"Interval Description"},"next_run_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Run Time"},"last_run_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run Time"},"last_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status"},"last_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Message"},"success_count_30d":{"type":"integer","title":"Success Count 30D"},"fail_count_30d":{"type":"integer","title":"Fail Count 30D"},"total_count_30d":{"type":"integer","title":"Total Count 30D"}},"type":"object","required":["job_id","name","trigger_type","interval_description","next_run_time","last_run_time","last_status","last_message","success_count_30d","fail_count_30d","total_count_30d"],"title":"SchedulerJobStatus"},"ScoreAdjustmentDetail":{"properties":{"item":{"type":"string","title":"Item"},"delta":{"type":"integer","title":"Delta"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["item","delta","reason"],"title":"ScoreAdjustmentDetail"},"ScoreAdjustmentResult":{"properties":{"score_delta":{"type":"integer","title":"Score Delta"},"details":{"items":{"$ref":"#/components/schemas/ScoreAdjustmentDetail"},"type":"array","title":"Details"},"potential_noi_increase":{"type":"integer","title":"Potential Noi Increase"},"risk_flags":{"items":{"type":"string"},"type":"array","title":"Risk Flags"}},"type":"object","required":["score_delta","details","potential_noi_increase","risk_flags"],"title":"ScoreAdjustmentResult"},"ScoreCards":{"properties":{"investment_score":{"type":"integer","title":"Investment Score"},"financing_score":{"type":"integer","title":"Financing Score"},"market_score":{"type":"integer","title":"Market Score"},"development_upside_score":{"type":"integer","title":"Development Upside Score"},"risk_level":{"type":"string","title":"Risk Level"},"bankability_score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Bankability Score","description":"은행 대출 실행 가능성 종합 점수 (0~100). financing_score(금융 조건 매력도)와 달리, DSR/RTI/담보가치/위반건축물/소득증빙 등 은행 심사 통과 확률을 반영.","examples":[72]}},"type":"object","required":["investment_score","financing_score","market_score","development_upside_score","risk_level","bankability_score"],"title":"ScoreCards"},"SearchHit":{"properties":{"chunk_id":{"type":"integer","title":"Chunk Id"},"document_id":{"type":"integer","title":"Document Id"},"document_title":{"type":"string","title":"Document Title"},"chunk_index":{"type":"integer","title":"Chunk Index"},"snippet":{"type":"string","title":"Snippet"},"score":{"type":"number","title":"Score"}},"type":"object","required":["chunk_id","document_id","document_title","chunk_index","snippet","score"],"title":"SearchHit"},"SearchResponse":{"properties":{"query":{"type":"string","title":"Query"},"mode":{"type":"string","title":"Mode"},"hits":{"items":{"$ref":"#/components/schemas/SearchHit"},"type":"array","title":"Hits"}},"type":"object","required":["query","mode","hits"],"title":"SearchResponse"},"SelectPropertyRequest":{"properties":{"property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Property Id"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"}},"type":"object","title":"SelectPropertyRequest","description":"POST /api/analysis/deal-panel/select-property 요청."},"SelectPropertyResponse":{"properties":{"address":{"type":"string","title":"Address"},"short_address":{"type":"string","title":"Short Address"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"suggested_purchase_price_uk":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Suggested Purchase Price Uk"},"suggested_monthly_rent_manwon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Suggested Monthly Rent Manwon"},"land_area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Land Area M2"},"gfa_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gfa M2"}},"type":"object","required":["address","short_address","lat","lng","suggested_purchase_price_uk","suggested_monthly_rent_manwon","land_area_m2","gfa_m2"],"title":"SelectPropertyResponse"},"SessionCreate":{"properties":{"session_id":{"type":"string","title":"Session Id","description":"UUID 문자열 (프론트가 생성 or 서버 생성)"},"user_id_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id Hash","description":"사용자 식별자 SHA-256 해시"},"anonymous_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Anonymous Id","description":"client_key 해시"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"asset_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type"}},"type":"object","required":["session_id"],"title":"SessionCreate"},"SessionOut":{"properties":{"id":{"type":"integer","title":"Id"},"session_id":{"type":"string","title":"Session Id"},"user_id_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id Hash"},"anonymous_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Anonymous Id"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"asset_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type"},"final_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Status"},"message_count":{"type":"integer","title":"Message Count"},"run_count":{"type":"integer","title":"Run Count"},"session_started_at":{"type":"string","format":"date-time","title":"Session Started At"},"session_ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Session Ended At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","session_id","user_id_hash","anonymous_id","region_code","asset_type","final_status","message_count","run_count","session_started_at","session_ended_at","created_at","updated_at"],"title":"SessionOut"},"SignalFilter":{"type":"string","enum":["favorable","unfavorable","neutral"],"title":"SignalFilter"},"SignalGenerateRequest":{"properties":{"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"pnu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"},"asset_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type Code"}},"type":"object","title":"SignalGenerateRequest"},"SnapshotsGenerateResponse":{"properties":{"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts"},"message":{"type":"string","title":"Message"}},"type":"object","required":["counts","message"],"title":"SnapshotsGenerateResponse"},"SourceCategoryStatus":{"properties":{"total":{"type":"integer","title":"Total"},"available":{"type":"integer","title":"Available"},"rate":{"type":"number","title":"Rate"},"snapshot_count":{"type":"integer","title":"Snapshot Count"},"indicators":{"items":{"$ref":"#/components/schemas/SourceIndicator"},"type":"array","title":"Indicators"},"manual_connection_required":{"items":{"$ref":"#/components/schemas/SourceIndicator"},"type":"array","title":"Manual Connection Required"}},"type":"object","required":["total","available","rate","snapshot_count","indicators","manual_connection_required"],"title":"SourceCategoryStatus"},"SourceIndicator":{"properties":{"metric_key":{"type":"string","title":"Metric Key"},"metric_name_ko":{"type":"string","title":"Metric Name Ko"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"collection_frequency":{"type":"string","title":"Collection Frequency"},"data_source":{"type":"string","title":"Data Source"},"is_available":{"type":"boolean","title":"Is Available"},"stored_count":{"type":"integer","title":"Stored Count","default":0},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["metric_key","metric_name_ko","collection_frequency","data_source","is_available"],"title":"SourceIndicator"},"SourceOut":{"properties":{"name":{"type":"string","title":"Name"},"source_type":{"type":"string","title":"Source Type"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["name","source_type","id","created_at"],"title":"SourceOut"},"SourcePriorityRuleCreate":{"properties":{"query_type":{"type":"string","title":"Query Type"},"query_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query Label"},"primary_source_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Primary Source Keys"},"secondary_source_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Secondary Source Keys"},"tertiary_source_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tertiary Source Keys"},"fallback_strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Strategy"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["query_type"],"title":"SourcePriorityRuleCreate"},"SourcePriorityRuleRead":{"properties":{"query_type":{"type":"string","title":"Query Type"},"query_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query Label"},"primary_source_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Primary Source Keys"},"secondary_source_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Secondary Source Keys"},"tertiary_source_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tertiary Source Keys"},"fallback_strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Strategy"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"is_active":{"type":"boolean","title":"Is Active","default":true},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["query_type","id","created_at","updated_at"],"title":"SourcePriorityRuleRead"},"SourcePriorityRuleUpdate":{"properties":{"query_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query Label"},"primary_source_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Primary Source Keys"},"secondary_source_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Secondary Source Keys"},"tertiary_source_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tertiary Source Keys"},"fallback_strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Strategy"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"SourcePriorityRuleUpdate","description":"PATCH용 — 모든 필드 optional."},"SourceRegistryCreate":{"properties":{"source_key":{"type":"string","title":"Source Key"},"source_name":{"type":"string","title":"Source Name"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"source_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Category"},"data_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Domain"},"access_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Mode"},"api_available":{"type":"boolean","title":"Api Available","default":false},"api_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Base Url"},"requires_api_key":{"type":"boolean","title":"Requires Api Key","default":false},"commercial_use_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Commercial Use Allowed"},"ai_training_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai Training Allowed"},"raw_text_storage_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Raw Text Storage Allowed"},"metadata_storage_allowed":{"type":"boolean","title":"Metadata Storage Allowed","default":true},"summary_storage_allowed":{"type":"boolean","title":"Summary Storage Allowed","default":true},"fact_extraction_allowed":{"type":"boolean","title":"Fact Extraction Allowed","default":true},"license_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Name"},"license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Url"},"terms_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terms Url"},"terms_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terms Note"},"priority_level":{"type":"integer","title":"Priority Level","default":3},"is_active":{"type":"boolean","title":"Is Active","default":true},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At"}},"type":"object","required":["source_key","source_name"],"title":"SourceRegistryCreate"},"SourceRegistryRead":{"properties":{"source_key":{"type":"string","title":"Source Key"},"source_name":{"type":"string","title":"Source Name"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"source_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Category"},"data_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Domain"},"access_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Mode"},"api_available":{"type":"boolean","title":"Api Available","default":false},"api_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Base Url"},"requires_api_key":{"type":"boolean","title":"Requires Api Key","default":false},"commercial_use_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Commercial Use Allowed"},"ai_training_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai Training Allowed"},"raw_text_storage_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Raw Text Storage Allowed"},"metadata_storage_allowed":{"type":"boolean","title":"Metadata Storage Allowed","default":true},"summary_storage_allowed":{"type":"boolean","title":"Summary Storage Allowed","default":true},"fact_extraction_allowed":{"type":"boolean","title":"Fact Extraction Allowed","default":true},"license_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Name"},"license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Url"},"terms_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terms Url"},"terms_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terms Note"},"priority_level":{"type":"integer","title":"Priority Level","default":3},"is_active":{"type":"boolean","title":"Is Active","default":true},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At"},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["source_key","source_name","id","created_at","updated_at"],"title":"SourceRegistryRead"},"SourceRegistryUpdate":{"properties":{"source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Name"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"source_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Category"},"data_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Domain"},"access_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Mode"},"api_available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Api Available"},"api_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Base Url"},"requires_api_key":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Requires Api Key"},"commercial_use_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Commercial Use Allowed"},"ai_training_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai Training Allowed"},"raw_text_storage_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Raw Text Storage Allowed"},"metadata_storage_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Metadata Storage Allowed"},"summary_storage_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Summary Storage Allowed"},"fact_extraction_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fact Extraction Allowed"},"license_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Name"},"license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Url"},"terms_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terms Url"},"terms_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terms Note"},"priority_level":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority Level"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At"}},"type":"object","title":"SourceRegistryUpdate","description":"PATCH용 — 모든 필드 optional."},"SourceUpdate":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"daily_ingest_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Ingest Limit"},"refresh_interval_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Refresh Interval Days"},"allow_text_extract":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Text Extract"},"allow_image_ocr":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Image Ocr"},"allow_llm_training":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Llm Training"},"allow_delta_engine":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Delta Engine"},"license_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Status"},"review_policy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Policy"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"SourceUpdate"},"SuggestResponse":{"properties":{"suggestions":{"items":{"$ref":"#/components/schemas/AddressSuggestion"},"type":"array","title":"Suggestions"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["suggestions","total"],"title":"SuggestResponse"},"TickerItem":{"properties":{"id":{"type":"integer","title":"Id"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"district_name":{"type":"string","title":"District Name"},"bjd_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bjd Code"},"region_2depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 2Depth"},"region_3depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region 3Depth"},"signal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal"},"signal_strength":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal Strength"},"frame":{"type":"string","title":"Frame"},"report_date":{"type":"string","title":"Report Date"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"wiki_note_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wiki Note Id"}},"type":"object","required":["id","headline","district_name","bjd_code","region_2depth","region_3depth","signal","signal_strength","frame","report_date","summary","wiki_note_id"],"title":"TickerItem"},"TickerResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TickerItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"generated_at":{"type":"string","title":"Generated At"}},"type":"object","required":["items","total","generated_at"],"title":"TickerResponse"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user":{"$ref":"#/components/schemas/UserRead"}},"type":"object","required":["access_token","user"],"title":"TokenResponse"},"TransactionItem":{"properties":{"date":{"type":"string","title":"Date"},"price_억":{"type":"number","title":"Price 억"},"area_m2":{"type":"number","title":"Area M2"},"price_per_m2_만":{"type":"number","title":"Price Per M2 만"}},"type":"object","required":["date","price_억","area_m2","price_per_m2_만"],"title":"TransactionItem"},"UnifiedSearchResponse":{"properties":{"query":{"type":"string","title":"Query"},"sources":{"items":{"type":"string","enum":["blog","youtube"]},"type":"array","title":"Sources"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"sort":{"type":"string","enum":["recency","views","relevance"],"title":"Sort"},"search_mode":{"type":"string","enum":["vector","keyword","hybrid"],"title":"Search Mode"},"total":{"type":"integer","title":"Total"},"results":{"items":{"oneOf":[{"$ref":"#/components/schemas/BlogSearchResult"},{"$ref":"#/components/schemas/YouTubeSearchResult"}],"discriminator":{"propertyName":"source_type","mapping":{"blog":"#/components/schemas/BlogSearchResult","youtube":"#/components/schemas/YouTubeSearchResult"}}},"type":"array","title":"Results","default":[]}},"type":"object","required":["query","sources","sort","search_mode","total"],"title":"UnifiedSearchResponse"},"UpsellBlock":{"properties":{"should_offer_paid_report":{"type":"boolean","title":"Should Offer Paid Report"},"suggested_report_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Report Type"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["should_offer_paid_report","suggested_report_type","message"],"title":"UpsellBlock"},"UsageGuardInfo":{"properties":{"client_key":{"type":"string","title":"Client Key"},"remaining_requests_today":{"type":"integer","title":"Remaining Requests Today"},"remaining_estimated_tokens_today":{"type":"integer","title":"Remaining Estimated Tokens Today"},"retry_after_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry After Seconds"}},"type":"object","required":["client_key","remaining_requests_today","remaining_estimated_tokens_today"],"title":"UsageGuardInfo","description":"rate limit 현황 (원본 IP 비노출, client_key hash만 포함)."},"UsageStats":{"properties":{"analysis_requests_today":{"type":"integer","title":"Analysis Requests Today"},"analysis_requests_week":{"type":"integer","title":"Analysis Requests Week"},"analysis_requests_month":{"type":"integer","title":"Analysis Requests Month"},"conversation_sessions_today":{"type":"integer","title":"Conversation Sessions Today"},"conversation_sessions_week":{"type":"integer","title":"Conversation Sessions Week"},"unique_ips_today":{"type":"integer","title":"Unique Ips Today"},"unique_ips_week":{"type":"integer","title":"Unique Ips Week"}},"type":"object","required":["analysis_requests_today","analysis_requests_week","analysis_requests_month","conversation_sessions_today","conversation_sessions_week","unique_ips_today","unique_ips_week"],"title":"UsageStats"},"UsedContextBlock":{"properties":{"facts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Facts"},"metric_deltas":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Metric Deltas"},"signals":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Signals"},"cases":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Cases"},"saved_insights":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Saved Insights"}},"type":"object","required":["facts","metric_deltas","signals","cases","saved_insights"],"title":"UsedContextBlock"},"UserAccessSummary":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"membership_level":{"type":"string","title":"Membership Level"},"verified_types":{"items":{"type":"string"},"type":"array","title":"Verified Types"},"total_discount_percent":{"type":"number","title":"Total Discount Percent"},"available_cash_credit":{"type":"integer","title":"Available Cash Credit"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"},"next_recommended_verification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Recommended Verification"}},"type":"object","required":["user_id","email","membership_level","verified_types","total_discount_percent","available_cash_credit","permissions","next_recommended_verification"],"title":"UserAccessSummary"},"UserCreate":{"properties":{"email":{"type":"string","title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"auth_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Provider"},"auth_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Provider Id"},"user_type":{"type":"string","title":"User Type","default":"individual"},"preferred_language":{"type":"string","title":"Preferred Language","default":"ko"},"marketing_agreed":{"type":"boolean","title":"Marketing Agreed","default":false}},"type":"object","required":["email"],"title":"UserCreate"},"UserInputSubmitResponse":{"properties":{"score_adjustment":{"$ref":"#/components/schemas/ScoreAdjustmentResult"},"potential_noi":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Potential Noi"},"updated_bankability_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Updated Bankability Score"},"session_id":{"type":"string","title":"Session Id"},"input_id":{"type":"integer","title":"Input Id"}},"type":"object","required":["score_adjustment","session_id","input_id"],"title":"UserInputSubmitResponse"},"UserProfileCreate":{"properties":{"birth_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Birth Year"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"occupation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occupation"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title"},"region_of_interest":{"anyOf":[{},{"type":"null"}],"title":"Region Of Interest"},"asset_types_of_interest":{"anyOf":[{},{"type":"null"}],"title":"Asset Types Of Interest"},"investment_experience_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Experience Level"},"preferred_report_delivery":{"type":"string","title":"Preferred Report Delivery","default":"mobile"},"mailing_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mailing Address"},"profile_metadata":{"anyOf":[{},{"type":"null"}],"title":"Profile Metadata"}},"type":"object","title":"UserProfileCreate"},"UserProfileRead":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"birth_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Birth Year"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"occupation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occupation"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title"},"region_of_interest":{"anyOf":[{},{"type":"null"}],"title":"Region Of Interest"},"asset_types_of_interest":{"anyOf":[{},{"type":"null"}],"title":"Asset Types Of Interest"},"investment_experience_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Experience Level"},"preferred_report_delivery":{"type":"string","title":"Preferred Report Delivery"},"mailing_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mailing Address"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","birth_year","gender","occupation","company_name","job_title","region_of_interest","asset_types_of_interest","investment_experience_level","preferred_report_delivery","mailing_address","created_at","updated_at"],"title":"UserProfileRead"},"UserPropertyInputCreate":{"properties":{"analysis_request_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Analysis Request Id"},"pnu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"tenant_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tenant Count"},"total_deposit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Deposit"},"total_monthly_rent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Monthly Rent"},"rent_arrear_level":{"anyOf":[{"type":"string","pattern":"^(none|sometimes|often)$"},{"type":"null"}],"title":"Rent Arrear Level"},"avg_remaining_contract_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avg Remaining Contract Months"},"eviction_difficulty":{"anyOf":[{"type":"string","pattern":"^(easy|medium|hard)$"},{"type":"null"}],"title":"Eviction Difficulty"},"rent_increase_room":{"anyOf":[{"type":"string","pattern":"^(yes|moderate|no)$"},{"type":"null"}],"title":"Rent Increase Room"},"has_elevator":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Elevator"},"elevator_install_plan":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Elevator Install Plan"},"exterior_remodel_plan":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Exterior Remodel Plan"},"facility_condition":{"anyOf":[{"type":"string","pattern":"^(good|fair|poor)$"},{"type":"null"}],"title":"Facility Condition"},"has_violation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Violation"},"purchase_price":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Purchase Price"},"equity_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Equity Amount"},"loan_period_years":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Loan Period Years"},"is_distressed_sale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Distressed Sale"},"has_competing_buyers":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Competing Buyers"},"aware_of_road_widening":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Aware Of Road Widening"},"self_management":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Self Management"},"land_area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Land Area M2"},"current_floor_area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current Floor Area M2"},"zoning_vlrat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zoning Vlrat"},"zoning_bcrat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zoning Bcrat"},"base_bankability_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Base Bankability Score"}},"type":"object","title":"UserPropertyInputCreate"},"UserRead":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"auth_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Provider"},"user_type":{"type":"string","title":"User Type"},"status":{"type":"string","title":"Status"},"preferred_language":{"type":"string","title":"Preferred Language"},"marketing_agreed":{"type":"boolean","title":"Marketing Agreed"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","phone","name","nickname","auth_provider","user_type","status","preferred_language","marketing_agreed","last_login_at","created_at"],"title":"UserRead"},"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"},"ValidationWarning":{"properties":{"field":{"type":"string","title":"Field"},"message":{"type":"string","title":"Message"}},"type":"object","required":["field","message"],"title":"ValidationWarning"},"VerificationApproveRequest":{"properties":{"reviewer_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reviewer Id"},"verification_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Verification Score"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"VerificationApproveRequest"},"VerificationCreate":{"properties":{"verification_type":{"type":"string","title":"Verification Type"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"metadata":{"anyOf":[{},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["verification_type"],"title":"VerificationCreate"},"VerificationDocumentCreate":{"properties":{"document_type":{"type":"string","title":"Document Type"},"original_file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original File Name"},"storage_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Provider"},"storage_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Path"},"file_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime Type"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"}},"type":"object","required":["document_type"],"title":"VerificationDocumentCreate"},"VerificationDocumentRead":{"properties":{"id":{"type":"integer","title":"Id"},"verification_id":{"type":"integer","title":"Verification Id"},"user_id":{"type":"integer","title":"User Id"},"document_type":{"type":"string","title":"Document Type"},"original_file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original File Name"},"storage_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Provider"},"storage_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Path"},"file_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime Type"},"is_sensitive":{"type":"boolean","title":"Is Sensitive"},"redaction_status":{"type":"string","title":"Redaction Status"},"uploaded_at":{"type":"string","format":"date-time","title":"Uploaded At"}},"type":"object","required":["id","verification_id","user_id","document_type","original_file_name","storage_provider","storage_path","file_size","mime_type","is_sensitive","redaction_status","uploaded_at"],"title":"VerificationDocumentRead"},"VerificationRead":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"verification_type":{"type":"string","title":"Verification Type"},"status":{"type":"string","title":"Status"},"submitted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submitted At"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"},"verification_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Verification Score"},"discount_percent":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Discount Percent"},"credit_amount":{"type":"integer","title":"Credit Amount"},"access_level_granted":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Level Granted"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_id","verification_type","status","submitted_at","reviewed_at","verification_score","discount_percent","credit_amount","access_level_granted","rejection_reason","notes","created_at"],"title":"VerificationRead"},"VerificationRejectRequest":{"properties":{"rejection_reason":{"type":"string","title":"Rejection Reason"},"reviewer_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reviewer Id"}},"type":"object","required":["rejection_reason"],"title":"VerificationRejectRequest"},"WikiCaseRead":{"properties":{"id":{"type":"integer","title":"Id"},"case_title":{"type":"string","title":"Case Title"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"asset_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type Code"},"project_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Type"},"purchase_price":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Purchase Price"},"construction_cost":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Construction Cost"},"rent_before":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rent Before"},"rent_after":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rent After"},"result_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Summary"},"success_factors":{"anyOf":[{},{"type":"null"}],"title":"Success Factors"},"failure_factors":{"anyOf":[{},{"type":"null"}],"title":"Failure Factors"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","case_title","region_code","asset_type_code","project_type","purchase_price","construction_cost","rent_before","rent_after","result_summary","success_factors","failure_factors","confidence","created_at"],"title":"WikiCaseRead"},"WikiGapEntry":{"properties":{"intent_type":{"type":"string","title":"Intent Type"},"count":{"type":"integer","title":"Count"},"suggested_note_topic":{"type":"string","title":"Suggested Note Topic"}},"type":"object","required":["intent_type","count","suggested_note_topic"],"title":"WikiGapEntry"},"WikiSignalRead":{"properties":{"id":{"type":"integer","title":"Id"},"signal_title":{"type":"string","title":"Signal Title"},"signal_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal Type"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"pnu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pnu"},"asset_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type Code"},"signal_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal Period"},"strength_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Strength Score"},"confidence_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Confidence Score"},"direction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Direction"},"summary":{"type":"string","title":"Summary"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning"},"recommended_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommended Action"},"is_premium":{"type":"boolean","title":"Is Premium"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","signal_title","signal_type","region_code","pnu","asset_type_code","signal_period","strength_score","confidence_score","direction","summary","reasoning","recommended_action","is_premium","created_at"],"title":"WikiSignalRead"},"WikiStatus":{"properties":{"metric_snapshots":{"type":"integer","title":"Metric Snapshots"},"metric_observations":{"type":"integer","title":"Metric Observations","default":0},"growth_scores":{"type":"integer","title":"Growth Scores","default":0},"rank_snapshots":{"type":"integer","title":"Rank Snapshots","default":0},"extracted_facts":{"type":"integer","title":"Extracted Facts"},"signals":{"type":"integer","title":"Signals"},"signal_cards":{"type":"integer","title":"Signal Cards","default":0},"signal_card_wiki_documents":{"type":"integer","title":"Signal Card Wiki Documents","default":0},"rules":{"type":"integer","title":"Rules"},"cases":{"type":"integer","title":"Cases"},"last_fact_extracted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Fact Extracted At"},"processing_queue":{"$ref":"#/components/schemas/ProcessingQueueStatus"}},"type":"object","required":["metric_snapshots","extracted_facts","signals","rules","cases","last_fact_extracted_at","processing_queue"],"title":"WikiStatus"},"WikiUsageCreate":{"properties":{"note_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Note Id"},"rule_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rule Id"},"usage_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Usage Type","description":"always | region | finance | gap"},"relevance_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relevance Score"},"was_shown_to_user":{"type":"boolean","title":"Was Shown To User","default":true}},"type":"object","title":"WikiUsageCreate"},"WikiUsageOut":{"properties":{"id":{"type":"integer","title":"Id"},"run_id":{"type":"integer","title":"Run Id"},"note_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Note Id"},"usage_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Usage Type"},"relevance_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relevance Score"},"was_shown_to_user":{"type":"boolean","title":"Was Shown To User"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","run_id","note_id","usage_type","relevance_score","was_shown_to_user","created_at"],"title":"WikiUsageOut"},"YouTubeSearchResult":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"score":{"type":"number","title":"Score"},"search_mode":{"type":"string","title":"Search Mode"},"snippets":{"items":{"type":"string"},"type":"array","title":"Snippets","default":[]},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"source_type":{"type":"string","const":"youtube","title":"Source Type"},"video_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Id"},"view_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"View Count"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"preview_images":{"items":{"$ref":"#/components/schemas/PreviewImage"},"type":"array","title":"Preview Images","default":[]}},"type":"object","required":["id","title","score","search_mode","source_type"],"title":"YouTubeSearchResult"},"app__routers__admin_data__SourceCreate":{"properties":{"name":{"type":"string","title":"Name"},"source_url":{"type":"string","title":"Source Url"},"source_type":{"type":"string","title":"Source Type","default":"naver_blog"},"extraction_template":{"type":"string","title":"Extraction Template","default":"real_estate_deal_case"},"rss_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rss Url"},"category_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category No"},"daily_ingest_limit":{"type":"integer","title":"Daily Ingest Limit","default":10},"refresh_interval_days":{"type":"integer","title":"Refresh Interval Days","default":14},"initial_backfill_mode":{"type":"string","title":"Initial Backfill Mode","default":"daily_limit"},"allow_text_extract":{"type":"boolean","title":"Allow Text Extract","default":false},"allow_image_ocr":{"type":"boolean","title":"Allow Image Ocr","default":false},"allow_llm_training":{"type":"boolean","title":"Allow Llm Training","default":false},"allow_delta_engine":{"type":"boolean","title":"Allow Delta Engine","default":false},"license_status":{"type":"string","title":"License Status","default":"unknown"},"review_policy":{"type":"string","title":"Review Policy","default":"manual"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["name","source_url"],"title":"SourceCreate"},"app__schemas__content__SourceCreate":{"properties":{"name":{"type":"string","title":"Name"},"source_type":{"type":"string","title":"Source Type"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["name","source_type"],"title":"SourceCreate"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}