{"openapi":"3.1.0","info":{"title":"충전값 API","description":"전기차 충전 최저가 비교 서비스 (MVP).\n\n데이터 출처: 환경부 한국환경공단 전기차충전소 API + 각 사업자 공식 요금.","version":"0.1.0"},"paths":{"/api/stations/{station_id}/occupancy":{"get":{"tags":["stations"],"summary":"Occupancy Pattern","description":"7일×24시간 혼잡 패턴.\n\n각 (요일, 시간) 셀의 평균 사용가능률 (0.0~1.0).\nhistoric 데이터가 부족하면 셀 값 null. 프론트에서 null은 회색으로.","operationId":"occupancy_pattern_api_stations__station_id__occupancy_get","parameters":[{"name":"station_id","in":"path","required":true,"schema":{"type":"string","title":"Station Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":3,"default":14,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Occupancy Pattern Api Stations  Station Id  Occupancy Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stations/autocomplete":{"get":{"tags":["stations"],"summary":"Autocomplete","description":"검색 자동완성 — 1~2글자부터 응답. 사업자·충전소 카테고리 분리.\n\n응답 시간 목표 < 50ms (서버 캐시 + DB 인덱스 활용).","operationId":"autocomplete_api_stations_autocomplete_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":40,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Autocomplete Api Stations Autocomplete Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stations/search":{"get":{"tags":["stations"],"summary":"Search","description":"이름·주소·사업자 부분일치 검색. station_id 정확일치는 최상단 반환.","operationId":"search_api_stations_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":60,"description":"이름/주소/사업자 키워드","title":"Q"},"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":{"type":"array","items":{"type":"object"},"title":"Response Search Api Stations Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stations/nearby":{"get":{"tags":["stations"],"summary":"Nearby","description":"현 위치 반경 내 충전기를 최저가 순으로 반환.","operationId":"nearby_api_stations_nearby_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","description":"현재 위도","title":"Lat"},"description":"현재 위도"},{"name":"lng","in":"query","required":true,"schema":{"type":"number","description":"현재 경도","title":"Lng"},"description":"현재 경도"},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","maximum":10.0,"minimum":0.5,"default":3.0,"title":"Radius Km"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"내 차 커넥터 타입","title":"Connector"},"description":"내 차 커넥터 타입"},{"name":"speed","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"slow / fast / superfast","title":"Speed"},"description":"slow / fast / superfast"},{"name":"operator","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"사업자 정확 매칭 (예: 차지비)","title":"Operator"},"description":"사업자 정확 매칭 (예: 차지비)"},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","pattern":"^(price|distance|availability)$","default":"price","title":"Sort By"}},{"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/StationNearbyItem"},"title":"Response Nearby Api Stations Nearby Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stations/along-route":{"get":{"tags":["stations"],"summary":"Stations Along Route","description":"출발·도착 좌표 사이 선분을 N등분한 점들의 반경 합집합.\n\n실제 도로망 경로가 아닌 직선 접근이라 도시간 장거리에서는 근사. 하지만 충전 계획용으로는 충분.\n각 스테이션은 출발점 기준 진행 거리(progress_km)도 함께 반환되어 UI에서 순서대로 표시하기 좋다.","operationId":"stations_along_route_api_stations_along_route_get","parameters":[{"name":"start_lat","in":"query","required":true,"schema":{"type":"number","title":"Start Lat"}},{"name":"start_lng","in":"query","required":true,"schema":{"type":"number","title":"Start Lng"}},{"name":"end_lat","in":"query","required":true,"schema":{"type":"number","title":"End Lat"}},{"name":"end_lng","in":"query","required":true,"schema":{"type":"number","title":"End Lng"}},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","maximum":10.0,"minimum":1.0,"default":3.0,"title":"Radius Km"}},{"name":"samples","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":3,"default":10,"title":"Samples"}},{"name":"speed","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speed"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector"}},{"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","title":"Response Stations Along Route Api Stations Along Route Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stations/by-region/{region}":{"get":{"tags":["stations"],"summary":"Stations By Region","description":"시도(서울·경기·부산 등)별 공식 요금이 있는 충전소를 최저가 순 반환.\n\nSEO 랜딩 페이지에서 사용. 요금 정보가 없는 스테이션은 제외하여 페이지 가치를 높인다.","operationId":"stations_by_region_api_stations_by_region__region__get","parameters":[{"name":"region","in":"path","required":true,"schema":{"type":"string","title":"Region"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}},{"name":"operator","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator"}},{"name":"speed","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speed"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Stations By Region Api Stations By Region  Region  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stations/{station_id}":{"get":{"tags":["stations"],"summary":"Get Station","description":"충전소 상세 — 충전기 목록 + 커넥터/속도별 공식 요금 포함.","operationId":"get_station_api_stations__station_id__get","parameters":[{"name":"station_id","in":"path","required":true,"schema":{"type":"string","title":"Station Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Station Api Stations  Station Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/operators":{"get":{"tags":["prices"],"summary":"List Operators","description":"전 사업자의 최신 공식 요금 요약 (커넥터·속도·멤버십 별).","operationId":"list_operators_api_prices_operators_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"object"},"type":"array","title":"Response List Operators Api Prices Operators Get"}}}}}}},"/api/prices/operator-history/{operator}":{"get":{"tags":["prices"],"summary":"Operator Price History","description":"사업자 단위 공식 요금 시계열 (collected_at 기준).\n\nseries[membership_type] = [{date, price}, ...] 구조로 반환.\n프론트에서 recharts 등으로 선형 차트 그리기 좋게 정렬.","operationId":"operator_price_history_api_prices_operator_history__operator__get","parameters":[{"name":"operator","in":"path","required":true,"schema":{"type":"string","title":"Operator"}},{"name":"connector_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Type"}},{"name":"speed","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speed"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":730,"minimum":7,"default":90,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Operator Price History Api Prices Operator History  Operator  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/trends":{"get":{"tags":["prices"],"summary":"Price Trends","description":"최근 N일 사업자별 회원가 변동.","operationId":"price_trends_api_prices_trends_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":90,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Price Trends Api Prices Trends Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/history/{station_id}":{"get":{"tags":["prices"],"summary":"Price History","description":"특정 충전소의 실결제가 이력 (영수증 크라우드소싱).\n\n일자별 평균 실결제가 / 제보 건수.","operationId":"price_history_api_prices_history__station_id__get","parameters":[{"name":"station_id","in":"path","required":true,"schema":{"type":"string","title":"Station Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Price History Api Prices History  Station Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/report":{"post":{"tags":["prices"],"summary":"Report Price","description":"사용자가 공식 요금이 잘못됐음을 신고. 관리자 검토 큐에 적재.","operationId":"report_price_api_prices_report_post","parameters":[{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_report_price_api_prices_report_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Report Price Api Prices Report Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/receipts/upload":{"post":{"tags":["receipts"],"summary":"Upload Receipt","description":"영수증 이미지 업로드 → Gemini OCR.","operationId":"upload_receipt_api_receipts_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_receipt_api_receipts_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upload Receipt Api Receipts Upload Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/receipts/confirm":{"post":{"tags":["receipts"],"summary":"Confirm Receipt","description":"OCR 결과를 사용자가 수정·확인 → receipts 저장 + 포인트 적립.","operationId":"confirm_receipt_api_receipts_confirm_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_confirm_receipt_api_receipts_confirm_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Confirm Receipt Api Receipts Confirm Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stats/regions":{"get":{"tags":["stats"],"summary":"Region Stats","operationId":"region_stats_api_stats_regions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"object"},"type":"array","title":"Response Region Stats Api Stats Regions Get"}}}}}}},"/api/stats/operators":{"get":{"tags":["stats"],"summary":"Operator Stats","operationId":"operator_stats_api_stats_operators_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"},"title":"Response Operator Stats Api Stats Operators Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stats/live":{"get":{"tags":["stats"],"summary":"Live Counters","description":"홈 상단 실시간 카운터 위젯용. 30초 TTL 캐시.","operationId":"live_counters_api_stats_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Live Counters Api Stats Live Get"}}}}}}},"/api/stats/leaderboard":{"get":{"tags":["stats"],"summary":"Leaderboard","description":"포인트 리더보드 + 제보왕 (이메일 마스킹).","operationId":"leaderboard_api_stats_leaderboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Leaderboard Api Stats Leaderboard Get"}}}}}}},"/api/stats/cheapest":{"get":{"tags":["stats"],"summary":"Cheapest Stations","description":"최근 30일 영수증 기준 실결제가가 가장 저렴한 충전소 TOP 10.\n\n충전소당 최소 2건 이상의 영수증이 쌓인 곳만 포함 (단일 이상치 제거).","operationId":"cheapest_stations_api_stats_cheapest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Cheapest Stations Api Stats Cheapest Get"}}}}}}},"/api/stats/activity":{"get":{"tags":["stats"],"summary":"Recent Activity","description":"홈 \"최근 활동\" 피드 — 리뷰·영수증·제보 최신 순 혼합.\n\n익명화된 요약만 노출 (개인식별정보 제외). 60초 TTL 캐시.","operationId":"recent_activity_api_stats_activity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Recent Activity Api Stats Activity Get"}}}}}}},"/api/stats/summary":{"get":{"tags":["stats"],"summary":"Summary","operationId":"summary_api_stats_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Summary Api Stats Summary Get"}}}}}}},"/api/export/stations.csv":{"get":{"tags":["export"],"summary":"Export Stations Csv","operationId":"export_stations_csv_api_export_stations_csv_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/export/chargers.csv":{"get":{"tags":["export"],"summary":"Export Chargers Csv","operationId":"export_chargers_csv_api_export_chargers_csv_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/export/prices.csv":{"get":{"tags":["export"],"summary":"Export Prices Csv","operationId":"export_prices_csv_api_export_prices_csv_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/export/stations.json":{"get":{"tags":["export"],"summary":"Export Stations Json","description":"페이지드 JSON (한 요청당 최대 2,000건).","operationId":"export_stations_json_api_export_stations_json_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"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","title":"Response Export Stations Json Api Export Stations Json Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export/station-ids":{"get":{"tags":["export"],"summary":"Export Station Ids","description":"sitemap 용. station_id + updated_at만 반환.","operationId":"export_station_ids_api_export_station_ids_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50000,"minimum":1,"default":10000,"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","title":"Response Export Station Ids Api Export Station Ids Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export/meta":{"get":{"tags":["export"],"summary":"Export Meta","description":"데이터 메타 — 총 건수, 최근 수집 시각.","operationId":"export_meta_api_export_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Export Meta Api Export Meta Get"}}}}}}},"/api/admin/receipts":{"get":{"tags":["admin"],"summary":"List Receipts","description":"영수증 목록 — 최근순.","operationId":"list_receipts_api_admin_receipts_get","parameters":[{"name":"verified","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"None=전체, True=검증됨, False=미검증","title":"Verified"},"description":"None=전체, True=검증됨, False=미검증"},{"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":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Receipts Api Admin Receipts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/receipts/{receipt_id}/verify":{"post":{"tags":["admin"],"summary":"Set Verified","operationId":"set_verified_api_admin_receipts__receipt_id__verify_post","parameters":[{"name":"receipt_id","in":"path","required":true,"schema":{"type":"integer","title":"Receipt Id"}},{"name":"verified","in":"query","required":true,"schema":{"type":"boolean","description":"True=검증됨, False=재검토","title":"Verified"},"description":"True=검증됨, False=재검토"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Set Verified Api Admin Receipts  Receipt Id  Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/receipts/{receipt_id}":{"delete":{"tags":["admin"],"summary":"Delete Receipt","operationId":"delete_receipt_api_admin_receipts__receipt_id__delete","parameters":[{"name":"receipt_id","in":"path","required":true,"schema":{"type":"integer","title":"Receipt Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Receipt Api Admin Receipts  Receipt Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/health":{"get":{"tags":["admin"],"summary":"Admin Health","description":"토큰 테스트용 에코.","operationId":"admin_health_api_admin_health_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Health Api Admin Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/anomalies":{"get":{"tags":["admin"],"summary":"Anomalies","description":"자동 이상치 탐지 — 관리자가 빠르게 스팸·오류를 가려낼 수 있게.","operationId":"anomalies_api_admin_anomalies_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Anomalies Api Admin Anomalies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/daily-stats":{"get":{"tags":["admin"],"summary":"Daily Stats","description":"최근 N일 일별 지표 — 관리자 대시보드 차트용.","operationId":"daily_stats_api_admin_daily_stats_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":180,"minimum":7,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Daily Stats Api Admin Daily Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/submissions":{"get":{"tags":["admin"],"summary":"List Submissions","operationId":"list_submissions_api_admin_submissions_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"pending/approved/rejected/duplicate","title":"Status"},"description":"pending/approved/rejected/duplicate"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Submissions Api Admin Submissions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/submissions/{submission_id}/approve":{"post":{"tags":["admin"],"summary":"Approve","operationId":"approve_api_admin_submissions__submission_id__approve_post","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"integer","title":"Submission Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Approve Api Admin Submissions  Submission Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/submissions/{submission_id}/reject":{"post":{"tags":["admin"],"summary":"Reject","operationId":"reject_api_admin_submissions__submission_id__reject_post","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"integer","title":"Submission Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Reject Api Admin Submissions  Submission Id  Reject Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/reviews":{"get":{"tags":["admin"],"summary":"List Reviews Admin","operationId":"list_reviews_admin_api_admin_reviews_get","parameters":[{"name":"hidden","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hidden"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Reviews Admin Api Admin Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/reviews/{review_id}/hide":{"post":{"tags":["admin"],"summary":"Hide Review","operationId":"hide_review_api_admin_reviews__review_id__hide_post","parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","title":"Review Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Hide Review Api Admin Reviews  Review Id  Hide Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/reviews/{review_id}/unhide":{"post":{"tags":["admin"],"summary":"Unhide Review","operationId":"unhide_review_api_admin_reviews__review_id__unhide_post","parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","title":"Review Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Unhide Review Api Admin Reviews  Review Id  Unhide Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/push/announce":{"post":{"tags":["admin"],"summary":"Push Announce","description":"전체 또는 토픽 구독자에게 공지 푸시 발송.","operationId":"push_announce_api_admin_push_announce_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_push_announce_api_admin_push_announce_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Push Announce Api Admin Push Announce Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/push/notify-station":{"post":{"tags":["admin"],"summary":"Push Notify Station","description":"특정 충전소를 즐겨찾기한 모든 사용자에게 사용가능 알림 강제 발송 (테스트/긴급용).","operationId":"push_notify_station_api_admin_push_notify_station_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_push_notify_station_api_admin_push_notify_station_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Push Notify Station Api Admin Push Notify Station Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/push/scan-price-drops":{"post":{"tags":["admin"],"summary":"Push Scan Price Drops","description":"가격 인하 감지 + 즐겨찾기 사용자 푸시 — 수동 트리거.\n\ndays: 비교 윈도우 (며칠 안의 최근 두 시점)\nthreshold_pct: 인하율 threshold (5.0 = 5%)","operationId":"push_scan_price_drops_api_admin_push_scan_price_drops_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_push_scan_price_drops_api_admin_push_scan_price_drops_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Push Scan Price Drops Api Admin Push Scan Price Drops Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/push/subscribers":{"get":{"tags":["admin"],"summary":"List Subscribers","operationId":"list_subscribers_api_admin_push_subscribers_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Subscribers Api Admin Push Subscribers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/issues":{"get":{"tags":["admin"],"summary":"List Issues","operationId":"list_issues_api_admin_issues_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(open|resolved|dismissed)$"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":60,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Issues Api Admin Issues Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/issues/{issue_id}/resolve":{"post":{"tags":["admin"],"summary":"Resolve Issue","operationId":"resolve_issue_api_admin_issues__issue_id__resolve_post","parameters":[{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_resolve_issue_api_admin_issues__issue_id__resolve_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Resolve Issue Api Admin Issues  Issue Id  Resolve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/photos":{"get":{"tags":["admin"],"summary":"List Station Photos","operationId":"list_station_photos_api_admin_photos_get","parameters":[{"name":"hidden","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hidden"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":300,"minimum":1,"default":60,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Station Photos Api Admin Photos Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/photos/{photo_id}/hide":{"post":{"tags":["admin"],"summary":"Hide Photo","operationId":"hide_photo_api_admin_photos__photo_id__hide_post","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"integer","title":"Photo Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Hide Photo Api Admin Photos  Photo Id  Hide Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/photos/{photo_id}/unhide":{"post":{"tags":["admin"],"summary":"Unhide Photo","operationId":"unhide_photo_api_admin_photos__photo_id__unhide_post","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"integer","title":"Photo Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Unhide Photo Api Admin Photos  Photo Id  Unhide Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/photos/{photo_id}":{"delete":{"tags":["admin"],"summary":"Delete Photo","operationId":"delete_photo_api_admin_photos__photo_id__delete","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"integer","title":"Photo Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Photo Api Admin Photos  Photo Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/reviews/{review_id}/reply":{"post":{"tags":["admin"],"summary":"Reply Review","operationId":"reply_review_api_admin_reviews__review_id__reply_post","parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","title":"Review Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_reply_review_api_admin_reviews__review_id__reply_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Reply Review Api Admin Reviews  Review Id  Reply Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Review Reply","operationId":"delete_review_reply_api_admin_reviews__review_id__reply_delete","parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","title":"Review Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Review Reply Api Admin Reviews  Review Id  Reply Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/subscribers":{"get":{"tags":["admin"],"summary":"List Subscribers","operationId":"list_subscribers_api_admin_subscribers_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":200,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Subscribers Api Admin Subscribers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/subscribers.csv":{"get":{"tags":["admin"],"summary":"Export Subscribers","operationId":"export_subscribers_api_admin_subscribers_csv_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/receipts.csv":{"get":{"tags":["admin"],"summary":"Export Receipts Csv","description":"영수증 전량 CSV (운영자 분석용, BOM 포함 Excel 호환).","operationId":"export_receipts_csv_api_admin_receipts_csv_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/posts":{"get":{"tags":["admin"],"summary":"Posts List","operationId":"posts_list_api_admin_posts_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Posts List Api Admin Posts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Posts Create","operationId":"posts_create_api_admin_posts_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Posts Create Api Admin Posts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/posts/{post_id}":{"get":{"tags":["admin"],"summary":"Posts Get","operationId":"posts_get_api_admin_posts__post_id__get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Posts Get Api Admin Posts  Post Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["admin"],"summary":"Posts Update","operationId":"posts_update_api_admin_posts__post_id__patch","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Posts Update Api Admin Posts  Post Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Posts Delete","operationId":"posts_delete_api_admin_posts__post_id__delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Posts Delete Api Admin Posts  Post Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stations/user-submitted":{"get":{"tags":["admin"],"summary":"List User Stations","operationId":"list_user_stations_api_admin_stations_user_submitted_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List User Stations Api Admin Stations User Submitted Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stations/{station_id}":{"patch":{"tags":["admin"],"summary":"Edit Station","operationId":"edit_station_api_admin_stations__station_id__patch","parameters":[{"name":"station_id","in":"path","required":true,"schema":{"type":"string","title":"Station Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Edit Station Api Admin Stations  Station Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Station","description":"오등록 스테이션 삭제. 환경공단 원본 보호 위해 US* 접두사만 허용.","operationId":"delete_station_api_admin_stations__station_id__delete","parameters":[{"name":"station_id","in":"path","required":true,"schema":{"type":"string","title":"Station Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Station Api Admin Stations  Station Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/system-status":{"get":{"tags":["admin"],"summary":"System Status","description":"운영 환경변수·DB 카운트를 한 번에.","operationId":"system_status_api_admin_system_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response System Status Api Admin System Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/posts/{post_id}/send-email":{"post":{"tags":["admin"],"summary":"Send Post Email","description":"게시글을 활성 구독자에게 발송. SMTP 미설정 시 backend/mail_queue/*.jsonl에 큐잉.","operationId":"send_post_email_api_admin_posts__post_id__send_email_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"test_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"테스트 발송 이메일 (지정 시 이 주소로만)","title":"Test To"},"description":"테스트 발송 이메일 (지정 시 이 주소로만)"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Send Post Email Api Admin Posts  Post Id  Send Email Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/jobs/run":{"post":{"tags":["admin"],"summary":"Run Job","operationId":"run_job_api_admin_jobs_run_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Run Job Api Admin Jobs Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/price-reports":{"get":{"tags":["admin"],"summary":"List Price Reports","operationId":"list_price_reports_api_admin_price_reports_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(pending|confirmed|rejected)$"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Price Reports Api Admin Price Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/price-reports/{report_id}/resolve":{"post":{"tags":["admin"],"summary":"Resolve Price Report","operationId":"resolve_price_report_api_admin_price_reports__report_id__resolve_post","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_resolve_price_report_api_admin_price_reports__report_id__resolve_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Resolve Price Report Api Admin Price Reports  Report Id  Resolve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/jobs/runs":{"get":{"tags":["admin"],"summary":"List Job Runs","operationId":"list_job_runs_api_admin_jobs_runs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":30,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Job Runs Api Admin Jobs Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/prices":{"get":{"tags":["admin"],"summary":"Admin Prices","operationId":"admin_prices_api_admin_prices_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Prices Api Admin Prices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Add Price","operationId":"add_price_api_admin_prices_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Add Price Api Admin Prices Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/prices/{price_id}":{"delete":{"tags":["admin"],"summary":"Delete Price","operationId":"delete_price_api_admin_prices__price_id__delete","parameters":[{"name":"price_id","in":"path","required":true,"schema":{"type":"integer","title":"Price Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Price Api Admin Prices  Price Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/prices/bulk-upload":{"post":{"tags":["admin"],"summary":"Bulk Upload Prices","description":"요금 CSV 일괄 업로드. 헤더: operator,membership_type,connector_type,speed,price_per_kwh,[monthly_fee,source_url,notes]","operationId":"bulk_upload_prices_api_admin_prices_bulk_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_bulk_upload_prices_api_admin_prices_bulk_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Bulk Upload Prices Api Admin Prices Bulk Upload Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/aliases":{"get":{"tags":["admin"],"summary":"List Aliases","operationId":"list_aliases_api_admin_aliases_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Aliases Api Admin Aliases Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Add Alias","operationId":"add_alias_api_admin_aliases_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Add Alias Api Admin Aliases Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/aliases/{alias_id}":{"delete":{"tags":["admin"],"summary":"Delete Alias","operationId":"delete_alias_api_admin_aliases__alias_id__delete","parameters":[{"name":"alias_id","in":"path","required":true,"schema":{"type":"integer","title":"Alias Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Alias Api Admin Aliases  Alias Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mail-queue":{"get":{"tags":["admin"],"summary":"Mail Queue","operationId":"mail_queue_api_admin_mail_queue_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Mail Queue Api Admin Mail Queue Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mail-queue/flush":{"post":{"tags":["admin"],"summary":"Flush Mail Queue","description":"큐잉된 메일을 실제 발송. file=None이면 모든 큐 파일, 지정 시 해당 파일만.\n\nSMTP 미설정이면 400. 성공한 메일은 파일에서 제거, 실패는 남긴다.","operationId":"flush_mail_queue_api_admin_mail_queue_flush_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_flush_mail_queue_api_admin_mail_queue_flush_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Flush Mail Queue Api Admin Mail Queue Flush Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/backup/restore":{"post":{"tags":["admin"],"summary":"Restore Backup","description":"백업 JSON을 역으로 복구. 기존 ID 충돌은 skip(중복 무시).\n\n운영 중 잘못 삭제한 게시글·리뷰 복원, DB 이관 직후 데이터 주입 등에 사용.\n환경공단 원본 스테이션은 복구 대상 아님 (원본은 일일 sync로 재주입).","operationId":"restore_backup_api_admin_backup_restore_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Snapshot"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Restore Backup Api Admin Backup Restore Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/backup.json":{"get":{"tags":["admin"],"summary":"Backup Json","description":"게시글·영수증·리뷰·제보·구독자·US* 스테이션 전량 JSON.\n\n운영 중 DB 이관·재해 복구·외부 백업용. 용량 큰 환경공단 원본 스테이션은 제외\n(필요 시 export/stations.csv 별도 사용).","operationId":"backup_json_api_admin_backup_json_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Backup Json Api Admin Backup Json Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/search":{"get":{"tags":["admin"],"summary":"Admin Search","description":"관리자 글로벌 검색. q 한 단어로 6개 테이블을 LIKE·MATCH 조합 조회.","operationId":"admin_search_api_admin_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":60,"title":"Q"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Search Api Admin Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/audit":{"get":{"tags":["admin"],"summary":"List Audit","operationId":"list_audit_api_admin_audit_get","parameters":[{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Audit Api Admin Audit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/submissions":{"post":{"tags":["submissions"],"summary":"Submit","description":"누락 충전소 제보 — 공개 엔드포인트, 관리자 승인 전에는 지도에 노출 안 됨.","operationId":"submit_api_submissions_post","parameters":[{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_submit_api_submissions_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Submit Api Submissions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reviews/station/{station_id}":{"get":{"tags":["reviews"],"summary":"List Reviews","description":"충전소 리뷰 목록 + 평균 별점·건수.","operationId":"list_reviews_api_reviews_station__station_id__get","parameters":[{"name":"station_id","in":"path","required":true,"schema":{"type":"string","title":"Station 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":"object","title":"Response List Reviews Api Reviews Station  Station Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reviews":{"post":{"tags":["reviews"],"summary":"Create Review","description":"리뷰 작성. 동일 제보자 해시로 같은 충전소에 24시간 내 중복 작성은 대체.","operationId":"create_review_api_reviews_post","parameters":[{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_create_review_api_reviews_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Review Api Reviews Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newsletter/subscribe":{"post":{"tags":["newsletter"],"summary":"Subscribe","operationId":"subscribe_api_newsletter_subscribe_post","parameters":[{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_subscribe_api_newsletter_subscribe_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Subscribe Api Newsletter Subscribe Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newsletter/unsubscribe":{"post":{"tags":["newsletter"],"summary":"Unsubscribe","operationId":"unsubscribe_api_newsletter_unsubscribe_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_unsubscribe_api_newsletter_unsubscribe_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Unsubscribe Api Newsletter Unsubscribe Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/posts":{"get":{"tags":["posts"],"summary":"List Public Posts","description":"공개 게시글 목록 — 게시(published=true)된 것만, 최신순.","operationId":"list_public_posts_api_posts_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"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":{"type":"object","title":"Response List Public Posts Api Posts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/posts/pinned":{"get":{"tags":["posts"],"summary":"List Pinned","description":"홈 배너용 pinned 공지. 최대 3건.","operationId":"list_pinned_api_posts_pinned_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Pinned Api Posts Pinned Get"}}}}}}},"/api/posts/{slug}":{"get":{"tags":["posts"],"summary":"Get Post","operationId":"get_post_api_posts__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Post Api Posts  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/uploads/image":{"post":{"tags":["uploads"],"summary":"Upload Image","operationId":"upload_image_api_uploads_image_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_image_api_uploads_image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upload Image Api Uploads Image Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/request-link":{"post":{"tags":["auth"],"summary":"Request Link","operationId":"request_link_api_auth_request_link_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_request_link_api_auth_request_link_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Request Link Api Auth Request Link Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/verify":{"get":{"tags":["auth"],"summary":"Verify","operationId":"verify_api_auth_verify_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Me","operationId":"me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Me Api Auth Me Get"}}}}}}},"/api/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Logout Api Auth Logout Post"}}}}}}},"/api/users/me":{"get":{"tags":["users"],"summary":"Get Profile","operationId":"get_profile_api_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Profile Api Users Me Get"}}}}}},"patch":{"tags":["users"],"summary":"Update Profile","operationId":"update_profile_api_users_me_patch","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Update Profile Api Users Me Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me/referrals":{"get":{"tags":["users"],"summary":"My Referrals","description":"내가 초대해서 가입한 친구 수 + 지급 내역.","operationId":"my_referrals_api_users_me_referrals_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response My Referrals Api Users Me Referrals Get"}}}}}}},"/api/users/me/data":{"get":{"tags":["users"],"summary":"Get Data","description":"즐겨찾기·내 차·충전 계획·최근 검색 등 JSON 덩어리.","operationId":"get_data_api_users_me_data_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Data Api Users Me Data Get"}}}}}},"put":{"tags":["users"],"summary":"Put Data","description":"전체 교체. 프런트에서 병합은 UI 단에서 처리.","operationId":"put_data_api_users_me_data_put","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Put Data Api Users Me Data Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me/history":{"get":{"tags":["users"],"summary":"My History","description":"내 충전 기록 대시보드 — 영수증 전체 + 집계 + 월별 추이.\n\n프로필 페이지(/me/history)에서 소비 패턴 시각화용.","operationId":"my_history_api_users_me_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response My History Api Users Me History Get"}}}}}}},"/api/users/me/activity":{"get":{"tags":["users"],"summary":"My Activity","description":"내 제보·리뷰·영수증 요약.","operationId":"my_activity_api_users_me_activity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response My Activity Api Users Me Activity Get"}}}}}}},"/api/photos/station/{station_id}":{"get":{"tags":["photos"],"summary":"List Photos","operationId":"list_photos_api_photos_station__station_id__get","parameters":[{"name":"station_id","in":"path","required":true,"schema":{"type":"string","title":"Station Id"}},{"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":{"type":"object","title":"Response List Photos Api Photos Station  Station Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/photos":{"post":{"tags":["photos"],"summary":"Upload Station Photo","description":"충전소 실사진 업로드. 로그인 시 3p 적립.","operationId":"upload_station_photo_api_photos_post","parameters":[{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_station_photo_api_photos_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upload Station Photo Api Photos Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/issues/station/{station_id}":{"get":{"tags":["issues"],"summary":"List Station Issues","description":"충전소 페이지용 미해결 신고 목록 + 배지.","operationId":"list_station_issues_api_issues_station__station_id__get","parameters":[{"name":"station_id","in":"path","required":true,"schema":{"type":"string","title":"Station Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Station Issues Api Issues Station  Station Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/issues":{"post":{"tags":["issues"],"summary":"Report Issue","operationId":"report_issue_api_issues_post","parameters":[{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_report_issue_api_issues_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Report Issue Api Issues Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/push/public-key":{"get":{"tags":["push"],"summary":"Get Public Key","description":"브라우저가 Subscription을 만들 때 필요한 VAPID 공개키.","operationId":"get_public_key_api_push_public_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Public Key Api Push Public Key Get"}}}}}}},"/api/push/subscribe":{"post":{"tags":["push"],"summary":"Subscribe","description":"PushSubscription 저장. 동일 endpoint는 upsert.\n\nbody 형식 (브라우저 PushSubscription.toJSON()):\n{\n  \"endpoint\": \"...\",\n  \"keys\": { \"p256dh\": \"...\", \"auth\": \"...\" },\n  \"topics\": [\"favorites\"]  (선택)\n}","operationId":"subscribe_api_push_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Subscribe Api Push Subscribe Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/push/unsubscribe":{"post":{"tags":["push"],"summary":"Unsubscribe","operationId":"unsubscribe_api_push_unsubscribe_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Unsubscribe Api Push Unsubscribe Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/push/status":{"get":{"tags":["push"],"summary":"Subscription Status","description":"브라우저가 로컬 subscription을 갖고 있을 때 서버에도 살아있는지 확인.","operationId":"subscription_status_api_push_status_get","parameters":[{"name":"endpoint","in":"query","required":true,"schema":{"type":"string","title":"Endpoint"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Subscription Status Api Push Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/push/test":{"post":{"tags":["push"],"summary":"Send Test Push","description":"본인 모든 기기에 테스트 푸시. 로그인 필수.","operationId":"send_test_push_api_push_test_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Send Test Push Api Push Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notifications":{"get":{"tags":["notifications"],"summary":"List Notifications","operationId":"list_notifications_api_notifications_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"only_unread","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Only Unread"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Notifications Api Notifications Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notifications/unread-count":{"get":{"tags":["notifications"],"summary":"Unread Count","operationId":"unread_count_api_notifications_unread_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Unread Count Api Notifications Unread Count Get"}}}}}}},"/api/notifications/{notification_id}/read":{"post":{"tags":["notifications"],"summary":"Mark Read","operationId":"mark_read_api_notifications__notification_id__read_post","parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Notification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Mark Read Api Notifications  Notification Id  Read Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notifications/read-all":{"post":{"tags":["notifications"],"summary":"Mark All Read","operationId":"mark_all_read_api_notifications_read_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Mark All Read Api Notifications Read All Post"}}}}}}},"/api/payments/products":{"get":{"tags":["payments"],"summary":"List Products","description":"결제 가능 상품 목록.","operationId":"list_products_api_payments_products_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Products Api Payments Products Get"}}}}}}},"/api/payments/prepare":{"post":{"tags":["payments"],"summary":"Prepare Payment","description":"결제 시작 전 server-side payment_id 발급. 가격은 서버가 결정.","operationId":"prepare_payment_api_payments_prepare_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Prepare Payment Api Payments Prepare Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/confirm":{"post":{"tags":["payments"],"summary":"Confirm Payment","description":"클라이언트 결제 후 — 백엔드에서 PortOne API로 재검증.","operationId":"confirm_payment_api_payments_confirm_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Confirm Payment Api Payments Confirm Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/me":{"get":{"tags":["payments"],"summary":"My Payments","description":"내 결제 내역 + 멤버십 상태.","operationId":"my_payments_api_payments_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response My Payments Api Payments Me Get"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Health Health Get"}}}}}}},"/healthz":{"get":{"summary":"Healthz","description":"외부 모니터링용 상세 헬스체크.\n\n200 OK + {ok: true} 면 정상. 컴포넌트별 상태·최근 sync 시각까지 포함.","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Healthz Healthz Get"}}}}}}}},"components":{"schemas":{"Body_bulk_upload_prices_api_admin_prices_bulk_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_bulk_upload_prices_api_admin_prices_bulk_upload_post"},"Body_confirm_receipt_api_receipts_confirm_post":{"properties":{"station_id":{"type":"string","title":"Station Id"},"kwh":{"type":"number","title":"Kwh"},"paid_amount":{"type":"integer","title":"Paid Amount"},"charged_at":{"type":"string","title":"Charged At"},"paid_via_app":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paid Via App"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"ocr_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ocr Confidence"}},"type":"object","required":["station_id","kwh","paid_amount","charged_at"],"title":"Body_confirm_receipt_api_receipts_confirm_post"},"Body_create_review_api_reviews_post":{"properties":{"station_id":{"type":"string","title":"Station Id"},"rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Rating"},"text":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Text"}},"type":"object","required":["station_id","rating"],"title":"Body_create_review_api_reviews_post"},"Body_flush_mail_queue_api_admin_mail_queue_flush_post":{"properties":{"file":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_flush_mail_queue_api_admin_mail_queue_flush_post"},"Body_push_announce_api_admin_push_announce_post":{"properties":{"title":{"type":"string","maxLength":80,"minLength":1,"title":"Title"},"body":{"type":"string","maxLength":300,"minLength":1,"title":"Body"},"url":{"type":"string","title":"Url","default":"/"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"}},"type":"object","required":["title","body"],"title":"Body_push_announce_api_admin_push_announce_post"},"Body_push_notify_station_api_admin_push_notify_station_post":{"properties":{"station_id":{"type":"string","title":"Station Id"}},"type":"object","required":["station_id"],"title":"Body_push_notify_station_api_admin_push_notify_station_post"},"Body_push_scan_price_drops_api_admin_push_scan_price_drops_post":{"properties":{"days":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Days","default":7},"threshold_pct":{"type":"number","maximum":50.0,"minimum":1.0,"title":"Threshold Pct","default":5.0}},"type":"object","title":"Body_push_scan_price_drops_api_admin_push_scan_price_drops_post"},"Body_reply_review_api_admin_reviews__review_id__reply_post":{"properties":{"reply":{"type":"string","maxLength":1000,"minLength":1,"title":"Reply"}},"type":"object","required":["reply"],"title":"Body_reply_review_api_admin_reviews__review_id__reply_post"},"Body_report_issue_api_issues_post":{"properties":{"station_id":{"type":"string","title":"Station Id"},"kind":{"type":"string","title":"Kind"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"charger_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charger Id"}},"type":"object","required":["station_id","kind"],"title":"Body_report_issue_api_issues_post"},"Body_report_price_api_prices_report_post":{"properties":{"station_id":{"type":"string","title":"Station Id"},"claimed_price":{"type":"number","exclusiveMaximum":10000.0,"exclusiveMinimum":0.0,"title":"Claimed Price"},"connector_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Type"},"speed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speed"},"note":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Note"}},"type":"object","required":["station_id","claimed_price"],"title":"Body_report_price_api_prices_report_post"},"Body_request_link_api_auth_request_link_post":{"properties":{"email":{"type":"string","title":"Email"},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"}},"type":"object","required":["email"],"title":"Body_request_link_api_auth_request_link_post"},"Body_resolve_issue_api_admin_issues__issue_id__resolve_post":{"properties":{"status":{"type":"string","pattern":"^(resolved|dismissed)$","title":"Status"}},"type":"object","required":["status"],"title":"Body_resolve_issue_api_admin_issues__issue_id__resolve_post"},"Body_resolve_price_report_api_admin_price_reports__report_id__resolve_post":{"properties":{"status":{"type":"string","pattern":"^(confirmed|rejected)$","title":"Status"}},"type":"object","required":["status"],"title":"Body_resolve_price_report_api_admin_price_reports__report_id__resolve_post"},"Body_submit_api_submissions_post":{"properties":{"name":{"type":"string","maxLength":120,"minLength":2,"title":"Name"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator"},"connector_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Type"},"max_kw":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Kw"},"speed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speed"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["name","lat","lng"],"title":"Body_submit_api_submissions_post"},"Body_subscribe_api_newsletter_subscribe_post":{"properties":{"email":{"type":"string","maxLength":254,"title":"Email"},"source":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Source"}},"type":"object","required":["email"],"title":"Body_subscribe_api_newsletter_subscribe_post"},"Body_unsubscribe_api_newsletter_unsubscribe_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_unsubscribe_api_newsletter_unsubscribe_post"},"Body_upload_image_api_uploads_image_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image"}},"type":"object","required":["image"],"title":"Body_upload_image_api_uploads_image_post"},"Body_upload_receipt_api_receipts_upload_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image","description":"영수증 사진"},"station_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Station Id"},"paid_via_app":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paid Via App"}},"type":"object","required":["image"],"title":"Body_upload_receipt_api_receipts_upload_post"},"Body_upload_station_photo_api_photos_post":{"properties":{"station_id":{"type":"string","title":"Station Id"},"caption":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Caption"},"image":{"type":"string","format":"binary","title":"Image"}},"type":"object","required":["station_id","image"],"title":"Body_upload_station_photo_api_photos_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"PriceBundle":{"properties":{"member":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Member","description":"자사 회원가 원/kWh"},"member_monthly":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Member Monthly","description":"월정액 멤버십 원/kWh"},"non_member":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Non Member","description":"비회원 원/kWh"},"roaming_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Roaming Min","description":"최저 로밍가 원/kWh"},"cheapest_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cheapest Path","description":"가장 싼 결제 앱/경로"}},"type":"object","title":"PriceBundle","description":"회원/비회원/로밍 3중 요금 묶음."},"StationNearbyItem":{"properties":{"station_id":{"type":"string","title":"Station Id"},"name":{"type":"string","title":"Name"},"operator":{"type":"string","title":"Operator"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"address":{"type":"string","title":"Address"},"distance_m":{"type":"integer","title":"Distance M"},"connector_type":{"type":"string","title":"Connector Type"},"max_kw":{"type":"integer","title":"Max Kw"},"speed":{"type":"string","enum":["slow","fast","superfast"],"title":"Speed"},"status":{"type":"string","enum":["available","charging","fault","unknown"],"title":"Status"},"status_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Status Updated At"},"price":{"$ref":"#/components/schemas/PriceBundle"},"price_badge":{"type":"string","enum":["cheap","average","expensive","unknown"],"title":"Price Badge","default":"unknown"},"recent_receipts_count":{"type":"integer","title":"Recent Receipts Count","default":0},"avg_actual_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Actual Price","description":"최근 30일 실결제가 평균"}},"type":"object","required":["station_id","name","operator","lat","lng","address","distance_m","connector_type","max_kw","speed","status","price"],"title":"StationNearbyItem"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}