{"openapi":"3.1.0","info":{"title":"MucNoticeEngine","description":"中央民族大学多站点通知聚合 / 存储 / 去重引擎","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Index","description":"首页引导：接口文档在 /docs（Swagger UI）。","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/api/sources":{"get":{"summary":"List Sources","operationId":"list_sources_api_sources_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Sources Api Sources Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notices":{"get":{"summary":"List Notices","operationId":"list_notices_api_notices_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"逗号分隔的 source_key","title":"Source"},"description":"逗号分隔的 source_key"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键词，匹配标题/摘要/正文预览","title":"Q"},"description":"关键词，匹配标题/摘要/正文预览"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Notices Api Notices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notices/{notice_id}":{"get":{"summary":"Get Notice","operationId":"get_notice_api_notices__notice_id__get","parameters":[{"name":"notice_id","in":"path","required":true,"schema":{"type":"string","title":"Notice Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Notice Api Notices  Notice Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notices/{notice_id}/content":{"get":{"summary":"Get Notice Content","operationId":"get_notice_content_api_notices__notice_id__content_get","parameters":[{"name":"notice_id","in":"path","required":true,"schema":{"type":"string","title":"Notice Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notices/{notice_id}/content.zip":{"get":{"summary":"Get Notice Content Zip","operationId":"get_notice_content_zip_api_notices__notice_id__content_zip_get","parameters":[{"name":"notice_id","in":"path","required":true,"schema":{"type":"string","title":"Notice Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notices/{notice_id}/files":{"get":{"summary":"List Notice Files","operationId":"list_notice_files_api_notices__notice_id__files_get","parameters":[{"name":"notice_id","in":"path","required":true,"schema":{"type":"string","title":"Notice Id"}},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notices/{notice_id}/archive":{"post":{"summary":"Archive Notice","operationId":"archive_notice_api_notices__notice_id__archive_post","parameters":[{"name":"notice_id","in":"path","required":true,"schema":{"type":"string","title":"Notice Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Archive Notice Api Notices  Notice Id  Archive Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stats":{"get":{"summary":"Stats","operationId":"stats_api_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Stats Api Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/search/sites":{"get":{"summary":"Search Sites","operationId":"search_sites_api_search_sites_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Sites Api Search Sites Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/search":{"get":{"summary":"Remote Search","operationId":"remote_search_api_search_get","parameters":[{"name":"site","in":"query","required":true,"schema":{"type":"string","description":"站点 key（也接受 owner/host/名称），见 /api/search/sites","title":"Site"},"description":"站点 key（也接受 owner/host/名称），见 /api/search/sites"},{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"关键词，空格分隔","title":"Q"},"description":"关键词，空格分隔"},{"name":"match","in":"query","required":false,"schema":{"type":"string","pattern":"^(all|any)$","description":"all=全部关键词，any=任意一个","default":"any","title":"Match"},"description":"all=全部关键词，any=任意一个"},{"name":"exclude","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"空格分隔；标题/摘要命中任一词则本地排除","title":"Exclude"},"description":"空格分隔；标题/摘要命中任一词则本地排除"},{"name":"scope","in":"query","required":false,"schema":{"type":"string","pattern":"^(all|title|content)$","description":"检索范围","default":"all","title":"Scope"},"description":"检索范围"},{"name":"order","in":"query","required":false,"schema":{"type":"string","pattern":"^(date|score)$","description":"date=按时间，score=按相关度","default":"date","title":"Order"},"description":"date=按时间，score=按相关度"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"起始日期 YYYY-MM-DD","title":"Since"},"description":"起始日期 YYYY-MM-DD"},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"截止日期 YYYY-MM-DD","title":"Until"},"description":"截止日期 YYYY-MM-DD"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remote Search Api Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/check":{"post":{"summary":"Check Now","description":"立即抓取。给了 `type` 就按门户历史（页数区间/关键词）抓取并视为回填。","operationId":"check_now_api_check_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CheckIn"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Check Now Api Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/card.png":{"get":{"summary":"Card","operationId":"card_api_card_png_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"default":5,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rss":{"get":{"summary":"Rss","operationId":"rss_api_rss_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/subscribers":{"get":{"summary":"List Subscribers","operationId":"list_subscribers_api_subscribers_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Subscribers Api Subscribers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Add Subscriber","operationId":"add_subscriber_api_subscribers_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriberIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Subscriber Api Subscribers Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/subscribers/{subscriber_id}":{"delete":{"summary":"Remove Subscriber","operationId":"remove_subscriber_api_subscribers__subscriber_id__delete","parameters":[{"name":"subscriber_id","in":"path","required":true,"schema":{"type":"string","title":"Subscriber Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"CheckIn":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"逗号分隔的 source_key"},"type":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Type","description":"门户 type；给了就按门户历史抓取"},"from_page":{"type":"integer","minimum":1.0,"title":"From Page","default":1},"to_page":{"type":"integer","minimum":1.0,"title":"To Page","default":1},"search_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Value","description":"门户 searchValue 关键词"},"backfill":{"type":"boolean","title":"Backfill","description":"仅普通轮询有效；回填默认不推送","default":true}},"type":"object","title":"CheckIn"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"SubscriberIn":{"properties":{"url":{"type":"string","title":"Url","description":"接收通知的 webhook 地址"},"secret":{"type":"string","title":"Secret","description":"可选，用于 HMAC-SHA256 签名","default":""},"source_keys":{"items":{"type":"string"},"type":"array","title":"Source Keys","description":"为空表示订阅全部来源"}},"type":"object","required":["url"],"title":"SubscriberIn"},"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"}}}}