{"openapi":"3.1.0","info":{"title":"AINews","version":"0.1.0"},"paths":{"/auth/send-code":{"post":{"tags":["auth"],"summary":"Send Code","description":"建立驗證碼並寄出。admin email + trusted IP 免 OTP 直接回 token。","operationId":"send_code_auth_send_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/verify":{"post":{"tags":["auth"],"summary":"Verify","description":"驗證碼正確 → 建立 session → 回 token + user + company。","operationId":"verify_auth_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["auth"],"summary":"Me","description":"回當前用戶資訊 + 公司資訊 + 使用量。需要 Bearer token。","operationId":"me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"刪除 session（登出）。需要 Bearer token。","operationId":"logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/api-keys":{"get":{"tags":["auth"],"summary":"Get Api Keys","description":"列出當前公司所有 API Key（不含完整明文）。","operationId":"get_api_keys_auth_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["auth"],"summary":"Create Api Key","description":"建立新 API Key。只允許 session 認證（不允許用 API Key 建 API Key）。","operationId":"create_api_key_auth_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/api-keys/{key_id}":{"delete":{"tags":["auth"],"summary":"Delete Api Key","description":"撤銷指定 API Key。必須屬於當前公司。","operationId":"delete_api_key_auth_api_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/invite":{"post":{"tags":["auth"],"summary":"Invite","description":"邀請成員加入 company。需要 admin 身份。","operationId":"invite_auth_invite_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/team":{"get":{"tags":["auth"],"summary":"Get Team","description":"列出同 company 所有成員。需要認證。","operationId":"get_team_auth_team_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/team/{email}":{"delete":{"tags":["auth"],"summary":"Remove Team Member","description":"移除成員。需要 admin 身份。","operationId":"remove_team_member_auth_team__email__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analyze":{"post":{"tags":["analyze"],"summary":"Analyze","description":"呼叫 Pipeline 分析，存結果，回傳完整結果。需要認證。","operationId":"analyze_api_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"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/results/{result_id}":{"get":{"tags":["analyze"],"summary":"Get Result","description":"取回分析結果。只能看自己公司的結果。需要認證。","operationId":"get_result_api_results__result_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"result_id","in":"path","required":true,"schema":{"type":"string","title":"Result Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage":{"get":{"tags":["analyze"],"summary":"Get Usage Endpoint","description":"取得本月使用量統計。需要認證。","operationId":"get_usage_endpoint_api_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/feedback":{"post":{"tags":["analyze"],"summary":"Post Feedback","description":"儲存反饋（👍/👎）。rating 必須是 1 或 -1。需要認證。","operationId":"post_feedback_api_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/results/{result_id}/feedback":{"get":{"tags":["analyze"],"summary":"Get Result Feedback","description":"取得某結果的所有反饋列表。只能查自己公司的結果。需要認證。","operationId":"get_result_feedback_api_results__result_id__feedback_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"result_id","in":"path","required":true,"schema":{"type":"string","title":"Result Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/publish-to-aeo":{"post":{"tags":["analyze"],"summary":"Publish To Aeo","description":"將分析結果轉發到 AEO 發佈 API。需要認證。","operationId":"publish_to_aeo_api_publish_to_aeo_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishToAeoRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/company-scan":{"post":{"tags":["analyze"],"summary":"Company Scan","description":"爬取 PR Times 企業頁，回傳新聞稿列表。需要認證。不受額度限制。","operationId":"company_scan_api_company_scan_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyScanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/health-report":{"post":{"tags":["analyze"],"summary":"Health Report","description":"爬取 PR Times 企業頁並產生健檢報告。需要認證。不受額度限制。","operationId":"health_report_api_health_report_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/billing/checkout":{"post":{"tags":["billing"],"summary":"Checkout","description":"建立 Stripe Checkout Session，回傳付款頁面 URL。","operationId":"checkout_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/billing/webhook":{"post":{"tags":["billing"],"summary":"Webhook","description":"接收 Stripe Webhook 事件（不需認證，Stripe 直接打）。\n\n注意：必須讀取 raw body，不能讓 FastAPI 先 JSON parse。","operationId":"webhook_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/portal":{"get":{"tags":["billing"],"summary":"Portal","description":"建立 Stripe Customer Portal Session，回傳管理訂閱 URL。","operationId":"portal_billing_portal_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"return_url","in":"query","required":false,"schema":{"type":"string","default":"","title":"Return Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/status":{"get":{"tags":["billing"],"summary":"Billing Status","description":"回傳當前方案資訊。","operationId":"billing_status_billing_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/unsubscribe":{"get":{"tags":["admin"],"summary":"Unsubscribe","description":"驗證退訂連結（支援舊 token 和新 sig 兩種格式）。","operationId":"unsubscribe_unsubscribe_get","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}},{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}},{"name":"sig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sig"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"ja","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/dashboard":{"get":{"tags":["admin"],"summary":"Admin Dashboard","description":"今日 + 本月概覽（從 campaigns 表查）。","operationId":"admin_dashboard_admin_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/articles":{"get":{"tags":["admin"],"summary":"Admin Articles","description":"文章列表（支援分頁 + 篩選 + 排序）。","operationId":"admin_articles_admin_articles_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Per Page"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"has_email","in":"query","required":false,"schema":{"type":"string","default":"","title":"Has Email"}},{"name":"category","in":"query","required":false,"schema":{"type":"string","default":"","title":"Category"}},{"name":"analyzed","in":"query","required":false,"schema":{"type":"string","default":"","title":"Analyzed"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/daily-report":{"get":{"tags":["admin"],"summary":"Admin Daily Report","description":"每日報告：統計 + 時間分佈 + 類別 + 關鍵字。","operationId":"admin_daily_report_admin_daily_report_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"day","title":"Period"}},{"name":"date","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings":{"get":{"tags":["admin"],"summary":"Admin Settings","description":"讀取 admin 設定（上限 / 排程 / 類別）。","operationId":"admin_settings_admin_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/settings/daily-limit":{"put":{"tags":["admin"],"summary":"Set Daily Limit","description":"設定每日寄信上限，存到 admin_settings。","operationId":"set_daily_limit_admin_settings_daily_limit_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DailyLimitIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings/categories":{"put":{"tags":["admin"],"summary":"Set Categories","description":"設定目標類別（JSON array 存 admin_settings）。","operationId":"set_categories_admin_settings_categories_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoriesIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/queue":{"get":{"tags":["admin"],"summary":"Admin Queue","description":"寄信佇列分頁查詢。","operationId":"admin_queue_admin_queue_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/cost":{"get":{"tags":["admin"],"summary":"Admin Cost","description":"成本統計（today / month / all）。","operationId":"admin_cost_admin_cost_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"today","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tracking":{"get":{"tags":["admin"],"summary":"Admin Tracking","description":"追蹤統計 — 開信率 / 點擊率 / 註冊率。","operationId":"admin_tracking_admin_tracking_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/pause":{"post":{"tags":["admin"],"summary":"Admin Pause","description":"暫停寄信排程。","operationId":"admin_pause_admin_pause_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/resume":{"post":{"tags":["admin"],"summary":"Admin Resume","description":"恢復寄信排程。","operationId":"admin_resume_admin_resume_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/preview/{article_id}":{"get":{"tags":["admin"],"summary":"Admin Preview","description":"預覽指定 article 的診斷報告 HTML。","operationId":"admin_preview_admin_preview__article_id__get","parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings/schedule":{"put":{"tags":["admin"],"summary":"Set Schedule","description":"設定排程時間（hour 0-23，minute 0-59）。","operationId":"set_schedule_admin_settings_schedule_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/scrape-now":{"post":{"tags":["admin"],"summary":"Admin Scrape Now","description":"手動觸發爬蟲（不發 email，只存 articles 表）。","operationId":"admin_scrape_now_admin_scrape_now_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/classify-now":{"post":{"tags":["admin"],"summary":"Admin Classify Now","description":"手動觸發 AI 深度分析（背景執行）。","operationId":"admin_classify_now_admin_classify_now_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/analyze-status":{"get":{"tags":["admin"],"summary":"Admin Analyze Status","description":"查詢 AI 分析即時進度。","operationId":"admin_analyze_status_admin_analyze_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/aeo-sync-now":{"post":{"tags":["admin"],"summary":"Admin Aeo Sync Now","description":"手動觸發 AEO 推送（背景執行，不 block HTTP）。","operationId":"admin_aeo_sync_now_admin_aeo_sync_now_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/aeo-sync-status":{"get":{"tags":["admin"],"summary":"Admin Aeo Sync Status","description":"查詢 AEO 推送即時進度。","operationId":"admin_aeo_sync_status_admin_aeo_sync_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/aeo-dashboard":{"get":{"tags":["admin"],"summary":"Admin Aeo Dashboard","description":"AEO 完整面板：推送進度 + 最近推送 + 失敗清單。","operationId":"admin_aeo_dashboard_admin_aeo_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/run-pipeline":{"post":{"tags":["media-admin"],"summary":"Run Pipeline","description":"觸發完整管線：分析 → 推送（背景串接）。","operationId":"run_pipeline_admin_run_pipeline_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/api-usage":{"get":{"tags":["admin"],"summary":"Admin Api Usage","description":"取得 API 使用量摘要（今日/本月/按服務/明細/市價）。","operationId":"admin_api_usage_admin_api_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/api-health":{"get":{"tags":["admin"],"summary":"Admin Api Health","description":"即時檢查所有 API 服務健康狀態（並行 ping）。","operationId":"admin_api_health_admin_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/t/{article_id}":{"get":{"tags":["tracking"],"summary":"Tracking Pixel","description":"追蹤像素 — 記錄 open 事件，回 1x1 GIF。","operationId":"tracking_pixel_t__article_id__get","parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/c/{article_id}":{"get":{"tags":["tracking"],"summary":"Tracking Click","description":"點擊追蹤 — 記錄 click 事件，302 重導（白名單限制）。","operationId":"tracking_click_c__article_id__get","parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}},{"name":"url","in":"query","required":false,"schema":{"type":"string","default":"","title":"Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media/search":{"get":{"tags":["media-search"],"summary":"Search Media","description":"媒體搜尋。支援業種/地區/類型/配送方式/關鍵字篩選，分頁回傳。","operationId":"search_media_api_media_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"industry","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"}},{"name":"prefecture","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prefecture"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"delivery","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":50,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media/lists":{"get":{"tags":["media-lists"],"summary":"List All","operationId":"list_all_api_media_lists_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["media-lists"],"summary":"Create List","operationId":"create_list_api_media_lists_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateListRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/media/lists/{list_id}":{"get":{"tags":["media-lists"],"summary":"Get List Detail","operationId":"get_list_detail_api_media_lists__list_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["media-lists"],"summary":"Delete List","operationId":"delete_list_api_media_lists__list_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media/lists/{list_id}/items":{"post":{"tags":["media-lists"],"summary":"Add Items","operationId":"add_items_api_media_lists__list_id__items_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["media-lists"],"summary":"Remove Items","operationId":"remove_items_api_media_lists__list_id__items_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media/export-csv":{"post":{"tags":["media-ai"],"summary":"Export Csv Endpoint","operationId":"export_csv_endpoint_api_media_export_csv_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportCsvRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/media/recommend":{"post":{"tags":["media-ai"],"summary":"Recommend Media","operationId":"recommend_media_api_media_recommend_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/media/recommend/filter":{"get":{"tags":["media-ai"],"summary":"Filter Recommendations","description":"推薦結果的二次篩選。","operationId":"filter_recommendations_api_media_recommend_filter_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"article_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Article Id"}},{"name":"press_release_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Press Release Id"}},{"name":"top_k","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":50,"title":"Top K"}},{"name":"industry","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}},{"name":"media_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Type"}},{"name":"min_reach","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Reach"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media/generate-pitch":{"post":{"tags":["media-ai"],"summary":"Generate Pitch Endpoint","description":"為指定文章 + 媒體列表生成推薦信。","operationId":"generate_pitch_endpoint_api_media_generate_pitch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneratePitchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/media/generate-pitch-batch":{"post":{"tags":["media-ai"],"summary":"Generate Pitch Batch Endpoint","description":"批量生成推薦信；允許 50+、去重、mq_profile 為空時 fallback。","operationId":"generate_pitch_batch_endpoint_api_media_generate_pitch_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneratePitchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/media/rewrite-article":{"post":{"tags":["media-ai"],"summary":"Rewrite Article Endpoint","description":"為指定文章 + 媒體列表改寫新聞稿。Admin only。","operationId":"rewrite_article_endpoint_api_media_rewrite_article_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RewriteArticleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/media/rewrite-article-batch":{"post":{"tags":["media-ai"],"summary":"Rewrite Article Batch Endpoint","description":"批量客製化改寫；允許 50+、去重、mq_profile 為空時 fallback。","operationId":"rewrite_article_batch_endpoint_api_media_rewrite_article_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RewriteArticleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/media/send-pitch":{"post":{"tags":["media-ai"],"summary":"Send Pitch","description":"模擬寄送推薦信。不真寄，只 log。","operationId":"send_pitch_api_media_send_pitch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendPitchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/media/send-fax":{"post":{"tags":["media-ai"],"summary":"Send Fax","description":"FAX stub — 功能尚未實裝。","operationId":"send_fax_api_media_send_fax_post","responses":{"501":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/media/import":{"post":{"tags":["media-admin"],"summary":"Media Import","description":"JSON 媒體資料匯入。","operationId":"media_import_admin_media_import_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/media/embed":{"post":{"tags":["media-admin"],"summary":"Media Embed","description":"全媒體 embedding 生成（stub — CARD-14 實作）。","operationId":"media_embed_admin_media_embed_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/media/scan":{"post":{"tags":["media-admin"],"summary":"Media Scan","description":"全媒體深掃描 — CARD-16 Phase C。\n\n掃描耗時較長（每筆約 10-30 秒），回傳 accepted 後背景執行。\n實際呼叫 scan_all 的排程請透過 /admin/media/scan?background=true 或 cron 執行。","operationId":"media_scan_admin_media_scan_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/media/stats":{"get":{"tags":["media-admin"],"summary":"Media Stats","description":"媒體統計。","operationId":"media_stats_admin_media_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/run-analyze":{"post":{"tags":["media-admin"],"summary":"Run Analyze","description":"觸發 NQ 分析（背景執行，不阻塞 API）。","operationId":"run_analyze_admin_run_analyze_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/run-push":{"post":{"tags":["media-admin"],"summary":"Run Push","description":"觸發 AEO 推送（背景執行，不阻塞 API）。","operationId":"run_push_admin_run_push_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/pipeline-status":{"get":{"tags":["media-admin"],"summary":"Pipeline Status","description":"查分析 + 推送進度。","operationId":"pipeline_status_admin_pipeline_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/run-push":{"post":{"tags":["media-admin"],"summary":"Internal Run Push","description":"內部用：觸發 AEO 推送。需 admin 認證。","operationId":"internal_run_push_internal_run_push_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/run-analyze":{"post":{"tags":["media-admin"],"summary":"Internal Run Analyze","description":"內部用：觸發分析。需 admin 認證。","operationId":"internal_run_analyze_internal_run_analyze_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/run-pipeline":{"post":{"tags":["media-admin"],"summary":"Internal Run Pipeline","description":"內部用：分析 → 推送串接。需 admin 認證。","operationId":"internal_run_pipeline_internal_run_pipeline_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/pipeline-status":{"get":{"tags":["media-admin"],"summary":"Internal Pipeline Status","description":"內部用：查進度。需 admin 認證。","operationId":"internal_pipeline_status_internal_pipeline_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/press-release":{"get":{"tags":["press-release"],"summary":"List Press Releases","description":"列出當前公司的 press releases。","operationId":"list_press_releases_api_press_release_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["press-release"],"summary":"Create Press Release","description":"建立 press release。","operationId":"create_press_release_api_press_release_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePressReleaseRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/press-release/{press_release_id}":{"get":{"tags":["press-release"],"summary":"Get Press Release","description":"取得單筆 press release。","operationId":"get_press_release_api_press_release__press_release_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"press_release_id","in":"path","required":true,"schema":{"type":"integer","title":"Press Release Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["press-release"],"summary":"Update Press Release","description":"更新單筆 press release。","operationId":"update_press_release_api_press_release__press_release_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"press_release_id","in":"path","required":true,"schema":{"type":"integer","title":"Press Release Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePressReleaseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["press-release"],"summary":"Delete Press Release","description":"刪除單筆 press release。","operationId":"delete_press_release_api_press_release__press_release_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"press_release_id","in":"path","required":true,"schema":{"type":"integer","title":"Press Release Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/press-release/{press_release_id}/pdf":{"get":{"tags":["press-release"],"summary":"Get Press Release Pdf","description":"輸出單筆 press release PDF。","operationId":"get_press_release_pdf_api_press_release__press_release_id__pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"press_release_id","in":"path","required":true,"schema":{"type":"integer","title":"Press Release Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/press-release/generate":{"post":{"tags":["press-release"],"summary":"Generate Press Release","description":"根據表單生成新聞稿並存檔。","operationId":"generate_press_release_api_press_release_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneratePressReleaseRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/press-release/optimize":{"post":{"tags":["press-release"],"summary":"Optimize Press Release","description":"優化既有新聞稿草稿並存檔。","operationId":"optimize_press_release_api_press_release_optimize_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptimizePressReleaseRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/press-release/predict-nq":{"post":{"tags":["press-release"],"summary":"Predict Press Release Nq","description":"預測新聞稿 NQ，不存檔。","operationId":"predict_press_release_nq_api_press_release_predict_nq_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PredictNQRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/campaigns":{"post":{"tags":["campaigns"],"summary":"Create Campaign Endpoint","description":"建立 campaign。","operationId":"create_campaign_endpoint_api_campaigns_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/campaigns/{campaign_id}/preview":{"get":{"tags":["campaigns"],"summary":"Preview Campaign","description":"取得 campaign 預覽。","operationId":"preview_campaign_api_campaigns__campaign_id__preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}/emails/{email_id}":{"put":{"tags":["campaigns"],"summary":"Update Campaign Email","description":"編輯 campaign email。","operationId":"update_campaign_email_api_campaigns__campaign_id__emails__email_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"email_id","in":"path","required":true,"schema":{"type":"integer","title":"Email Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignEmailRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}/send":{"post":{"tags":["campaigns"],"summary":"Send Campaign Endpoint","description":"送出 campaign。","operationId":"send_campaign_endpoint_api_campaigns__campaign_id__send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}/tracking":{"get":{"tags":["campaigns"],"summary":"Get Campaign Tracking","description":"取得 campaign tracking summary。","operationId":"get_campaign_tracking_api_campaigns__campaign_id__tracking_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translate-article":{"post":{"tags":["translations"],"summary":"Translate Article","description":"翻譯單篇文章。需要認證。","operationId":"translate_article_api_translate_article_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslateArticleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/internal/translate-pending":{"post":{"tags":["translations"],"summary":"Internal Translate Pending","description":"內部用：批次翻譯 analyzed 文章。需 admin 認證。","operationId":"internal_translate_pending_internal_translate_pending_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslatePendingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/article-translations/{article_id}":{"get":{"tags":["translations"],"summary":"Get Article Translations","description":"取得單篇文章的三語翻譯與 FAQ。需要認證。","operationId":"get_article_translations_api_article_translations__article_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/sources":{"get":{"tags":["admin-sources"],"summary":"List Sources","description":"來源清單 + 即時健康度。country/status/q 為選填過濾。","operationId":"list_sources_admin_sources_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"type":"string","default":"","title":"Country"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/sources/summary":{"get":{"tags":["admin-sources"],"summary":"Sources Summary","description":"總覽統計：各狀態計數 + 24h 總落地量。","operationId":"sources_summary_admin_sources_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/sources/{source_type}":{"get":{"tags":["admin-sources"],"summary":"Get Source","description":"單一來源詳情 + 近 14 日逐日落地。","operationId":"get_source_admin_sources__source_type__get","parameters":[{"name":"source_type","in":"path","required":true,"schema":{"type":"string","title":"Source Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin-sources"],"summary":"Update Source","description":"更新來源設定。只寫 registry metadata，不影響 scraper 執行本體。","operationId":"update_source_admin_sources__source_type__put","parameters":[{"name":"source_type","in":"path","required":true,"schema":{"type":"string","title":"Source Type"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceUpdateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ai-news/health":{"get":{"summary":"Ai News Health","operationId":"ai_news_health_v1_ai_news_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/articles":{"get":{"summary":"List Articles","operationId":"list_articles_v1_articles_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"ja","title":"Lang"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":100,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"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"}}}}}}},"/v1/articles/{article_id}":{"get":{"summary":"Get Article","operationId":"get_article_v1_articles__article_id__get","parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"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"}}}}}}},"/v1/shops/{slug}":{"get":{"summary":"Get Shop","operationId":"get_shop_v1_shops__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"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"}}}}}}},"/v1/shops/{slug}/news":{"get":{"summary":"Get Shop News","operationId":"get_shop_news_v1_shops__slug__news_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"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"}}}}}}},"/v1/ai-feed/articles.diff.jsonl":{"get":{"summary":"Diff Feed","operationId":"diff_feed_v1_ai_feed_articles_diff_jsonl_get","parameters":[{"name":"since_seq","in":"query","required":false,"schema":{"type":"string","title":"Since Seq"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"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"}}}}}}},"/health":{"get":{"summary":"Health","description":"健康檢查。","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Root","description":"根路由 — Landing Page（介紹頁）。","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Root Head","description":"根路由 HEAD — AI crawler probe should not receive 405.","operationId":"root_head__head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/login":{"get":{"summary":"Login Page","description":"登入頁面。","operationId":"login_page_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/app":{"get":{"summary":"App Page","description":"Dashboard 頁面。","operationId":"app_page_app_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin":{"get":{"summary":"Admin Page","description":"Admin 管理頁面。","operationId":"admin_page_admin_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/time-report.html":{"get":{"summary":"Time Report Page","description":"發布時間報表。","operationId":"time_report_page_time_report_html_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/robots.txt":{"get":{"summary":"Robots Txt","description":"robots.txt — AI 爬蟲存取控制。","operationId":"robots_txt_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms.txt":{"get":{"summary":"Llms Txt","description":"llms.txt — LLM 爬蟲發現文件 (llmstxt.org 標準)。","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/api-catalog":{"get":{"summary":"Api Catalog","description":"API Catalog (IANA registered well-known).","operationId":"api_catalog__well_known_api_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"summary":"Oauth Authorization Server","description":"OAuth 2.0 Authorization Server Metadata (RFC 8414).","operationId":"oauth_authorization_server__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"summary":"Oauth Protected Resource","description":"OAuth 2.0 Protected Resource Metadata (RFC 9728).","operationId":"oauth_protected_resource__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AnalyzeRequest":{"properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"mode":{"type":"string","title":"Mode","default":"optimize"}},"type":"object","title":"AnalyzeRequest"},"CategoriesIn":{"properties":{"categories":{"items":{"type":"string"},"type":"array","title":"Categories"}},"type":"object","required":["categories"],"title":"CategoriesIn"},"CheckoutRequest":{"properties":{"success_url":{"type":"string","title":"Success Url"},"cancel_url":{"type":"string","title":"Cancel Url"}},"type":"object","required":["success_url","cancel_url"],"title":"CheckoutRequest"},"CompanyScanRequest":{"properties":{"company_url":{"type":"string","title":"Company Url"}},"type":"object","required":["company_url"],"title":"CompanyScanRequest"},"CreateApiKeyRequest":{"properties":{"name":{"type":"string","title":"Name","default":""}},"type":"object","title":"CreateApiKeyRequest"},"CreateCampaignRequest":{"properties":{"press_release_id":{"type":"integer","title":"Press Release Id"},"media_list_id":{"type":"integer","title":"Media List Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["press_release_id","media_list_id","name"],"title":"CreateCampaignRequest"},"CreateListRequest":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"CreateListRequest"},"CreatePressReleaseRequest":{"properties":{"company_id":{"type":"string","title":"Company Id"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtitle"},"contact_info":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Info"},"source_type":{"type":"string","title":"Source Type","default":"scratch"},"nq_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Nq Score"},"nq_dimensions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nq Dimensions"},"ai_engine":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Engine"}},"type":"object","required":["company_id","title","body"],"title":"CreatePressReleaseRequest"},"DailyLimitIn":{"properties":{"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["limit"],"title":"DailyLimitIn"},"ExportCsvRequest":{"properties":{"media_ids":{"items":{"type":"integer"},"type":"array","title":"Media Ids","default":[]},"list_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"List Id"}},"type":"object","title":"ExportCsvRequest"},"FeedbackRequest":{"properties":{"result_id":{"type":"string","title":"Result Id"},"rating":{"type":"integer","title":"Rating"},"comment":{"type":"string","title":"Comment","default":""}},"type":"object","required":["result_id","rating"],"title":"FeedbackRequest"},"GeneratePitchRequest":{"properties":{"article_id":{"type":"integer","title":"Article Id"},"media_ids":{"items":{"type":"integer"},"type":"array","title":"Media Ids"}},"type":"object","required":["article_id","media_ids"],"title":"GeneratePitchRequest"},"GeneratePressReleaseRequest":{"properties":{"company_name":{"type":"string","title":"Company Name"},"product_name":{"type":"string","title":"Product Name"},"features":{"items":{"type":"string"},"type":"array","title":"Features"},"target_audience":{"type":"string","title":"Target Audience"},"ai_engine":{"type":"string","title":"Ai Engine","default":"gemini"}},"type":"object","required":["company_name","product_name","features","target_audience"],"title":"GeneratePressReleaseRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthReportRequest":{"properties":{"company_url":{"type":"string","title":"Company Url"}},"type":"object","required":["company_url"],"title":"HealthReportRequest"},"ImportRequest":{"properties":{"json_path":{"type":"string","title":"Json Path"}},"type":"object","required":["json_path"],"title":"ImportRequest"},"InviteRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"InviteRequest"},"ItemsRequest":{"properties":{"media_ids":{"items":{"type":"integer"},"type":"array","title":"Media Ids"}},"type":"object","required":["media_ids"],"title":"ItemsRequest"},"OptimizePressReleaseRequest":{"properties":{"draft":{"type":"string","title":"Draft"}},"type":"object","required":["draft"],"title":"OptimizePressReleaseRequest"},"PredictNQRequest":{"properties":{"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"PredictNQRequest"},"PublishToAeoRequest":{"properties":{"result_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Id"},"press_release_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Press Release Id"}},"type":"object","title":"PublishToAeoRequest"},"RecommendRequest":{"properties":{"article_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Article Id"},"press_release_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Press Release Id"},"top_k":{"type":"integer","title":"Top K","default":50},"include_reasons":{"type":"boolean","title":"Include Reasons","default":false}},"type":"object","title":"RecommendRequest"},"RewriteArticleRequest":{"properties":{"article_id":{"type":"integer","title":"Article Id"},"media_ids":{"items":{"type":"integer"},"type":"array","title":"Media Ids"}},"type":"object","required":["article_id","media_ids"],"title":"RewriteArticleRequest"},"ScheduleIn":{"properties":{"hour":{"type":"integer","title":"Hour"},"minute":{"type":"integer","title":"Minute"}},"type":"object","required":["hour","minute"],"title":"ScheduleIn"},"SendCodeRequest":{"properties":{"email":{"type":"string","title":"Email"},"company_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Id"}},"type":"object","required":["email"],"title":"SendCodeRequest"},"SendPitchRequest":{"properties":{"article_id":{"type":"integer","title":"Article Id"},"media_ids":{"items":{"type":"integer"},"type":"array","title":"Media Ids"},"pitches":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Pitches"}},"type":"object","required":["article_id","media_ids"],"title":"SendPitchRequest"},"SourceUpdateIn":{"properties":{"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"},"expected_interval_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Interval Hours"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"homepage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Homepage Url"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"SourceUpdateIn"},"TranslateArticleRequest":{"properties":{"article_id":{"type":"integer","minimum":1.0,"title":"Article Id"}},"type":"object","required":["article_id"],"title":"TranslateArticleRequest"},"TranslatePendingRequest":{"properties":{"limit":{"type":"integer","maximum":5000.0,"minimum":1.0,"title":"Limit","default":500}},"type":"object","title":"TranslatePendingRequest"},"UpdateCampaignEmailRequest":{"properties":{"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"}},"type":"object","title":"UpdateCampaignEmailRequest"},"UpdatePressReleaseRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtitle"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"contact_info":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Info"}},"type":"object","title":"UpdatePressReleaseRequest"},"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"},"VerifyRequest":{"properties":{"email":{"type":"string","title":"Email"},"code":{"type":"string","title":"Code"}},"type":"object","required":["email","code"],"title":"VerifyRequest"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}